summaryrefslogtreecommitdiff
path: root/libavcodec/h263.c
diff options
context:
space:
mode:
authorKostya Shishkov <kostya.shishkov@gmail.com>2009-02-22 18:13:40 +0000
committerKostya Shishkov <kostya.shishkov@gmail.com>2009-02-22 18:13:40 +0000
commit91ba181a15b1cb3c3683edf1928e9eb3446782b4 (patch)
tree75c59ed1800b398b3897be91bc21cbfe69d5df18 /libavcodec/h263.c
parentb9c353fff2f80b87199b52b13dc0ba9b406ac0b4 (diff)
Better parsing of i263 picture header
Originally committed as revision 17532 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavcodec/h263.c')
-rw-r--r--libavcodec/h263.c44
1 files changed, 38 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;
}