in TRUNCATED mode, use residual fragments in ParseContext

for decoding the very last frame.

Originally committed as revision 13538 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
Pascal Massimino 2008-05-29 20:09:45 +00:00
parent 369074680e
commit ae899d12ae
1 changed files with 9 additions and 8 deletions

View File

@ -7656,6 +7656,15 @@ static int decode_frame(AVCodecContext *avctx,
s->flags= avctx->flags; s->flags= avctx->flags;
s->flags2= avctx->flags2; s->flags2= avctx->flags2;
if(s->flags&CODEC_FLAG_TRUNCATED){
const int next= ff_h264_find_frame_end(h, buf, buf_size);
assert((buf_size > 0) || (next == END_NOT_FOUND));
if( ff_combine_frame(&s->parse_context, next, &buf, &buf_size) < 0 )
return buf_size;
//printf("next:%d buf_size:%d last_index:%d\n", next, buf_size, s->parse_context.last_index);
}
/* no supplementary picture */ /* no supplementary picture */
if (buf_size == 0) { if (buf_size == 0) {
Picture *out; Picture *out;
@ -7681,14 +7690,6 @@ static int decode_frame(AVCodecContext *avctx,
return 0; return 0;
} }
if(s->flags&CODEC_FLAG_TRUNCATED){
int next= ff_h264_find_frame_end(h, buf, buf_size);
if( ff_combine_frame(&s->parse_context, next, (const uint8_t **)&buf, &buf_size) < 0 )
return buf_size;
//printf("next:%d buf_size:%d last_index:%d\n", next, buf_size, s->parse_context.last_index);
}
if(h->is_avc && !h->got_avcC) { if(h->is_avc && !h->got_avcC) {
int i, cnt, nalsize; int i, cnt, nalsize;
unsigned char *p = avctx->extradata; unsigned char *p = avctx->extradata;