diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2002-02-22 19:19:01 +0000 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2002-02-22 19:19:01 +0000 |
commit | 2b9ab1d54a35f7d689b2396cfc59f9dbdcae391f (patch) | |
tree | 0aeb308d9f489761f21ccfd90a136274763d8d2a | |
parent | 81b7c056ee991c66add092a47a6a6a169d8d69d8 (diff) | |
download | ffmpeg-2b9ab1d54a35f7d689b2396cfc59f9dbdcae391f.tar.gz |
fixing msmpeg4 decoding if fps < 16 (i thought it was a indicator for the ext header, its the fps indeed)
Originally committed as revision 313 to svn://svn.ffmpeg.org/ffmpeg/trunk
-rw-r--r-- | libavcodec/h263dec.c | 2 | ||||
-rw-r--r-- | libavcodec/mpegvideo.c | 2 | ||||
-rw-r--r-- | libavcodec/msmpeg4.c | 46 |
3 files changed, 16 insertions, 34 deletions
diff --git a/libavcodec/h263dec.c b/libavcodec/h263dec.c index ea628bf127..82ba258287 100644 --- a/libavcodec/h263dec.c +++ b/libavcodec/h263dec.c @@ -214,7 +214,7 @@ static int h263_decode_frame(AVCodecContext *avctx, } } - if (s->h263_msmpeg4) + if (s->h263_msmpeg4 && s->pict_type==I_TYPE) if(msmpeg4_decode_ext_header(s, buf_size) < 0) return -1; MPV_frame_end(s); diff --git a/libavcodec/mpegvideo.c b/libavcodec/mpegvideo.c index 2759638494..7c866b794d 100644 --- a/libavcodec/mpegvideo.c +++ b/libavcodec/mpegvideo.c @@ -1128,7 +1128,7 @@ static void encode_picture(MpegEncContext *s, int picture_number) } } - if (s->h263_msmpeg4) + if (s->h263_msmpeg4 && s->pict_type == I_TYPE) msmpeg4_encode_ext_header(s); //if (s->gob_number) diff --git a/libavcodec/msmpeg4.c b/libavcodec/msmpeg4.c index 7845261069..8fa9aefaa8 100644 --- a/libavcodec/msmpeg4.c +++ b/libavcodec/msmpeg4.c @@ -21,6 +21,7 @@ #include "common.h" #include "dsputil.h" #include "mpegvideo.h" +#include "avcodec.h" /* * You can also call this codec : MPEG4 with a twist ! @@ -212,23 +213,14 @@ void msmpeg4_encode_picture_header(MpegEncContext * s, int picture_number) void msmpeg4_encode_ext_header(MpegEncContext * s) { - if(s->pict_type == P_TYPE) - { - return; // P-Frames dont seem to have them and not even a 0 bit - } - else - { s->flipflop_rounding=1; - s->bitrate= 910; - - put_bits(&s->pb, 1, 1); // ext header indicator + s->bitrate= 910; // FIXME - put_bits(&s->pb, 4, 7); // ? + put_bits(&s->pb, 5, s->frame_rate / FRAME_RATE_BASE); //yes 29.97 -> 29 put_bits(&s->pb, 11, s->bitrate); put_bits(&s->pb, 1, s->flipflop_rounding); - } } /* predict coded block */ @@ -748,33 +740,23 @@ int msmpeg4_decode_picture_header(MpegEncContext * s) int msmpeg4_decode_ext_header(MpegEncContext * s, int buf_size) { - int firstBit=0; - /* the alt_bitstream reader could read over the end so we need to check it */ - if(get_bits_count(&s->gb) < buf_size*8) firstBit= get_bits1(&s->gb); - - if(s->pict_type == P_TYPE) + if(get_bits_count(&s->gb) + 16 < buf_size*8) { - if(firstBit) return -1; // havnt seen ext headers in P-Frames yet ;) + int fps; + + fps= get_bits(&s->gb, 5); + s->bitrate= get_bits(&s->gb, 11); + s->flipflop_rounding= get_bits1(&s->gb); + +// printf("fps:%2d bps:%2d roundingType:%1d\n", fps, s->bitrate, s->flipflop_rounding); } else { - int unk; - if(!firstBit) // no header found - { - s->flipflop_rounding= 0; - s->bitrate= 0; - return 0; - } - - unk= get_bits(&s->gb, 4); - s->bitrate= get_bits(&s->gb, 11); - -// printf("%2d %4d ;; %1X\n", unk,s->bitrate, unk); - - s->flipflop_rounding= get_bits1(&s->gb); + s->flipflop_rounding= 0; + s->bitrate= 0; } - + return 0; } |