in TRUNCATED mode, use residual fragments in ParseContext
authorPascal Massimino <pascal.massimino@gmail.com>
Thu, 29 May 2008 20:09:45 +0000 (20:09 +0000)
committerPascal Massimino <pascal.massimino@gmail.com>
Thu, 29 May 2008 20:09:45 +0000 (20:09 +0000)
for decoding the very last frame.

Originally committed as revision 13538 to svn://svn.ffmpeg.org/ffmpeg/trunk

libavcodec/h264.c

index 6f9ece5..5be52a6 100644 (file)
@@ -7656,6 +7656,15 @@ static int decode_frame(AVCodecContext *avctx,
     s->flags= avctx->flags;
     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 */
     if (buf_size == 0) {
         Picture *out;
@@ -7681,14 +7690,6 @@ static int decode_frame(AVCodecContext *avctx,
         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) {
         int i, cnt, nalsize;
         unsigned char *p = avctx->extradata;