diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2002-09-06 22:30:16 +0000 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2002-09-06 22:30:16 +0000 |
commit | 14207b27b5ea61b33092f0d23286b03ed4bcd894 (patch) | |
tree | 70653f051cb8f1e0c42c8b064b73ff61d5c0b311 | |
parent | ad4369076b5f905e80e7e2e1b01d5290ebd7beb6 (diff) | |
download | ffmpeg-14207b27b5ea61b33092f0d23286b03ed4bcd894.tar.gz |
support decoding of the last mpeg "packet" even if no startcode is immedeatly afterwards (fixes bugs with mpeg in avi)
new behavior is only activated if CODEC_FLAG_NOT_TRUNCATED is set
Originally committed as revision 909 to svn://svn.ffmpeg.org/ffmpeg/trunk
-rw-r--r-- | libavcodec/avcodec.h | 1 | ||||
-rw-r--r-- | libavcodec/mpeg12.c | 18 |
2 files changed, 15 insertions, 4 deletions
diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h index 619623bb74..96db4d9031 100644 --- a/libavcodec/avcodec.h +++ b/libavcodec/avcodec.h @@ -119,6 +119,7 @@ static const int Motion_Est_QTab[] = { ME_ZERO, ME_PHODS, ME_LOG, #define CODEC_FLAG_GRAY 0x2000 /* only decode/encode grayscale */ #define CODEC_FLAG_EMU_EDGE 0x4000/* dont draw edges */ #define CODEC_FLAG_DR1 0x8000 /* dr1 */ +#define CODEC_FLAG_NOT_TRUNCATED 0x00010000 /* input bitstream is not truncated, except before a startcode */ /* codec capabilities */ /* decoder can use draw_horiz_band callback */ diff --git a/libavcodec/mpeg12.c b/libavcodec/mpeg12.c index 97c2e98ccb..ef6bec7ace 100644 --- a/libavcodec/mpeg12.c +++ b/libavcodec/mpeg12.c @@ -584,7 +584,7 @@ static VLC mb_ptype_vlc; static VLC mb_btype_vlc; static VLC mb_pat_vlc; -void mpeg1_init_vlc(MpegEncContext *s) +static void init_vlcs(MpegEncContext *s) { static int done = 0; @@ -1260,6 +1260,7 @@ static int mpeg_decode_init(AVCodecContext *avctx) s->mpeg_enc_ctx.flags= avctx->flags; common_init(&s->mpeg_enc_ctx); + init_vlcs(&s->mpeg_enc_ctx); s->header_state = 0xff; s->mpeg_enc_ctx_allocated = 0; @@ -1468,7 +1469,7 @@ static int mpeg_decode_slice(AVCodecContext *avctx, start_code = (start_code - 1) & 0xff; if (start_code >= s->mb_height){ - fprintf(stderr, "slice below image\n"); + fprintf(stderr, "slice below image (%d >= %d)\n", start_code, s->mb_height); return -1; } s->last_dc[0] = 1 << (7 + s->intra_dc_precision); @@ -1590,7 +1591,6 @@ static int mpeg1_decode_sequence(AVCodecContext *avctx, if (MPV_common_init(s) < 0) return -1; - mpeg1_init_vlc(s); s1->mpeg_enc_ctx_allocated = 1; } @@ -1711,7 +1711,17 @@ static int mpeg_decode_frame(AVCodecContext *avctx, } else { memcpy(s->buf_ptr, buf_start, len); s->buf_ptr += len; - + if( (s2->flags&CODEC_FLAG_NOT_TRUNCATED) && (!start_code_found) + && s->buf_ptr+4<s->buffer+s->buffer_size){ + start_code_found= 1; + code= 0x1FF; + s->header_state=0xFF; + s->buf_ptr[0]=0; + s->buf_ptr[1]=0; + s->buf_ptr[2]=1; + s->buf_ptr[3]=0xFF; + s->buf_ptr+=4; + } if (start_code_found) { /* prepare data for next start code */ input_size = s->buf_ptr - s->buffer; |