From 91ba181a15b1cb3c3683edf1928e9eb3446782b4 Mon Sep 17 00:00:00 2001 From: Kostya Shishkov Date: Sun, 22 Feb 2009 18:13:40 +0000 Subject: [PATCH] Better parsing of i263 picture header Originally committed as revision 17532 to svn://svn.ffmpeg.org/ffmpeg/trunk --- libavcodec/h263.c | 44 ++++++++++++++++++++++++++++++++++++------ libavcodec/mpegvideo.h | 1 + 2 files changed, 39 insertions(+), 6 deletions(-) diff --git a/libavcodec/h263.c b/libavcodec/h263.c index 99134b5e51..b02b0ad2f4 100644 --- a/libavcodec/h263.c +++ b/libavcodec/h263.c @@ -6183,17 +6183,45 @@ int intel_h263_decode_picture_header(MpegEncContext *s) return -1; /* SAC: off */ } s->obmc= get_bits1(&s->gb); - if (get_bits1(&s->gb) != 0) { - av_log(s->avctx, AV_LOG_ERROR, "PB frame mode no supported\n"); - return -1; /* PB frame mode */ - } + s->pb_frame = get_bits1(&s->gb); - /* skip unknown header garbage */ - skip_bits(&s->gb, 41); + if(format == 7){ + format = get_bits(&s->gb, 3); + if(format == 0 || format == 7){ + av_log(s->avctx, AV_LOG_ERROR, "Wrong Intel H263 format\n"); + return -1; + } + if(get_bits(&s->gb, 2)) + av_log(s->avctx, AV_LOG_ERROR, "Bad value for reserved field\n"); + s->loop_filter = get_bits1(&s->gb); + if(get_bits1(&s->gb)) + av_log(s->avctx, AV_LOG_ERROR, "Bad value for reserved field\n"); + if(get_bits1(&s->gb)) + s->pb_frame = 2; + if(get_bits(&s->gb, 5)) + av_log(s->avctx, AV_LOG_ERROR, "Bad value for reserved field\n"); + if(get_bits(&s->gb, 5) != 1) + av_log(s->avctx, AV_LOG_ERROR, "Invalid marker\n"); + } + if(format == 6){ + int ar = get_bits(&s->gb, 4); + skip_bits(&s->gb, 9); // display width + skip_bits1(&s->gb); + skip_bits(&s->gb, 9); // display height + if(ar == 15){ + skip_bits(&s->gb, 8); // aspect ratio - width + skip_bits(&s->gb, 8); // aspect ratio - height + } + } s->chroma_qscale= s->qscale = get_bits(&s->gb, 5); skip_bits1(&s->gb); /* Continuous Presence Multipoint mode: off */ + if(s->pb_frame){ + skip_bits(&s->gb, 3); //temporal reference for B-frame + skip_bits(&s->gb, 2); //dbquant + } + /* PEI */ while (get_bits1(&s->gb) != 0) { skip_bits(&s->gb, 8); @@ -6206,6 +6234,10 @@ int intel_h263_decode_picture_header(MpegEncContext *s) if(s->avctx->debug&FF_DEBUG_PICT_INFO) show_pict_info(s); + if(s->pb_frame){ + av_log(s->avctx, AV_LOG_ERROR, "PB frame mode no supported\n"); + return -1; /* PB frame mode */ + } return 0; } diff --git a/libavcodec/mpegvideo.h b/libavcodec/mpegvideo.h index 8709deeb02..32ad5f4c6c 100644 --- a/libavcodec/mpegvideo.h +++ b/libavcodec/mpegvideo.h @@ -201,6 +201,7 @@ typedef struct MpegEncContext { int bit_rate; ///< wanted bit rate enum OutputFormat out_format; ///< output format int h263_pred; ///< use mpeg4/h263 ac/dc predictions + int pb_frame; ///< PB frame mode (0 = none, 1 = base, 2 = improved) /* the following codec id fields are deprecated in favor of codec_id */ int h263_plus; ///< h263 plus headers