Mercurial > libavcodec.hg
changeset 647:22b22723805e libavcodec
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
author | michaelni |
---|---|
date | Fri, 06 Sep 2002 22:30:16 +0000 |
parents | f87dc45d921d |
children | dddcff6841f2 |
files | avcodec.h mpeg12.c |
diffstat | 2 files changed, 15 insertions(+), 4 deletions(-) [+] |
line wrap: on
line diff
--- a/avcodec.h Thu Sep 05 13:23:11 2002 +0000 +++ b/avcodec.h Fri Sep 06 22:30:16 2002 +0000 @@ -119,6 +119,7 @@ #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 */
--- a/mpeg12.c Thu Sep 05 13:23:11 2002 +0000 +++ b/mpeg12.c Fri Sep 06 22:30:16 2002 +0000 @@ -584,7 +584,7 @@ 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 @@ 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 @@ 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 @@ if (MPV_common_init(s) < 0) return -1; - mpeg1_init_vlc(s); s1->mpeg_enc_ctx_allocated = 1; } @@ -1711,7 +1711,17 @@ } 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;