Mercurial > libavcodec.hg
diff h263.c @ 161:7ce36cf13055 libavcodec
- Added support to Inter4V+Q MBs to H.263 decoder.
- Advanced Prediction Mode activated for H.263 decoder.
- Bug fixed on H.263+ header parsing for UFEP.
- Now we can decode VIVO v1 streams :)
| author | pulento |
|---|---|
| date | Sat, 17 Nov 2001 21:14:54 +0000 |
| parents | 3c3449bce692 |
| children | de80712db90b |
line wrap: on
line diff
--- a/h263.c Sat Nov 17 15:43:04 2001 +0000 +++ b/h263.c Sat Nov 17 21:14:54 2001 +0000 @@ -750,7 +750,7 @@ init_vlc(&intra_MCBPC_vlc, 6, 8, intra_MCBPC_bits, 1, 1, intra_MCBPC_code, 1, 1); - init_vlc(&inter_MCBPC_vlc, 9, 20, + init_vlc(&inter_MCBPC_vlc, 9, 25, inter_MCBPC_bits, 1, 1, inter_MCBPC_code, 1, 1); init_vlc(&cbpy_vlc, 6, 16, @@ -825,6 +825,10 @@ //fprintf(stderr, "\tCBPC: %d", cbpc); if (cbpc < 0) return -1; + if (cbpc > 20) + cbpc+=3; + else if (cbpc == 20) + fprintf(stderr, "Stuffing !"); dquant = cbpc & 8; s->mb_intra = ((cbpc & 4) != 0); @@ -1223,14 +1227,16 @@ format = get_bits(&s->gb, 3); - if (format != 7) { + if (format != 7 && format != 6) { s->h263_plus = 0; /* H.263v1 */ width = h263_format[format][0]; height = h263_format[format][1]; if (!width) return -1; - + + s->width = width; + s->height = height; s->pict_type = I_TYPE + get_bits1(&s->gb); s->unrestricted_mv = get_bits1(&s->gb); @@ -1238,27 +1244,36 @@ if (get_bits1(&s->gb) != 0) return -1; /* SAC: off */ - if (get_bits1(&s->gb) != 0) - return -1; /* advanced prediction mode: off */ + if (get_bits1(&s->gb) != 0) { + s->mv_type = MV_TYPE_8X8; /* Advanced prediction mode */ + } + if (get_bits1(&s->gb) != 0) return -1; /* not PB frame */ s->qscale = get_bits(&s->gb, 5); skip_bits1(&s->gb); /* Continuous Presence Multipoint mode: off */ } else { - s->h263_plus = 1; + int ufep; + /* H.263v2 */ - /* OPPTYPE */ - - if (get_bits(&s->gb, 3) != 1) /* Update Full Extended PTYPE */ + s->h263_plus = 1; + ufep = get_bits(&s->gb, 3); /* Update Full Extended PTYPE */ + + if (ufep == 1) { + /* OPPTYPE */ + format = get_bits(&s->gb, 3); + skip_bits(&s->gb,1); /* Custom PCF */ + s->umvplus_dec = get_bits(&s->gb, 1); /* Unrestricted Motion Vector */ + skip_bits1(&s->gb); /* Syntax-based Arithmetic Coding (SAC) */ + if (get_bits1(&s->gb) != 0) { + s->mv_type = MV_TYPE_8X8; /* Advanced prediction mode */ + } + skip_bits(&s->gb, 8); + skip_bits(&s->gb, 3); /* Reserved */ + } else if (ufep != 0) return -1; - format = get_bits(&s->gb, 3); - - skip_bits(&s->gb,1); /* Custom PCF */ - s->umvplus_dec = get_bits(&s->gb, 1); /* Unrestricted Motion Vector */ - skip_bits(&s->gb, 10); - skip_bits(&s->gb, 3); /* Reserved */ - + /* MPPTYPE */ s->pict_type = get_bits(&s->gb, 3) + 1; if (s->pict_type != I_TYPE && @@ -1267,26 +1282,28 @@ skip_bits(&s->gb, 7); /* Get the picture dimensions */ - if (format == 6) { - /* Custom Picture Format (CPFMT) */ - skip_bits(&s->gb, 4); /* aspect ratio */ - width = (get_bits(&s->gb, 9) + 1) * 4; - skip_bits1(&s->gb); - height = get_bits(&s->gb, 9) * 4; + if (ufep) { + if (format == 6) { + /* Custom Picture Format (CPFMT) */ + skip_bits(&s->gb, 4); /* aspect ratio */ + width = (get_bits(&s->gb, 9) + 1) * 4; + skip_bits1(&s->gb); + height = get_bits(&s->gb, 9) * 4; #ifdef DEBUG - fprintf(stderr,"\nH.263+ Custom picture: %dx%d\n",width,height); + fprintf(stderr,"\nH.263+ Custom picture: %dx%d\n",width,height); #endif - } - else { - width = h263_format[format][0]; - height = h263_format[format][1]; - } - - if ((width == 0) || (height == 0)) - return -1; - - if (s->umvplus_dec) { - skip_bits1(&s->gb); /* Unlimited Unrestricted Motion Vectors Indicator (UUI) */ + } + else { + width = h263_format[format][0]; + height = h263_format[format][1]; + } + if ((width == 0) || (height == 0)) + return -1; + s->width = width; + s->height = height; + if (s->umvplus_dec) { + skip_bits1(&s->gb); /* Unlimited Unrestricted Motion Vectors Indicator (UUI) */ + } } s->qscale = get_bits(&s->gb, 5); @@ -1296,9 +1313,6 @@ skip_bits(&s->gb, 8); } s->f_code = 1; - s->width = width; - s->height = height; - return 0; }
