[SCM] libav/experimental: Move dummy picture allocation code from mpeg1/2 to mpegvideo. This fixes a infinite loop on a b frame.

siretart at users.alioth.debian.org siretart at users.alioth.debian.org
Sun Jun 30 16:55:11 UTC 2013


The following commit has been merged in the experimental branch:
commit d52b4abe8b7d58b1680b5ae5fccfcbd50ad98ef0
Author: Michael Niedermayer <michaelni at gmx.at>
Date:   Mon Nov 30 21:22:01 2009 +0000

    Move dummy picture allocation code from mpeg1/2 to mpegvideo.
    This fixes a infinite loop on a b frame.
    
    Originally committed as revision 20672 to svn://svn.ffmpeg.org/ffmpeg/trunk

diff --git a/libavcodec/mpeg12.c b/libavcodec/mpeg12.c
index 8f4e216..2e2bc36 100644
--- a/libavcodec/mpeg12.c
+++ b/libavcodec/mpeg12.c
@@ -2434,25 +2434,6 @@ static int decode_chunks(AVCodecContext *avctx,
                     return -1;
                 }
 
-                if(s2->last_picture_ptr==NULL && s2->pict_type!=FF_I_TYPE){
-                    int i;
-                    /* Allocate a dummy frame */
-                    i= ff_find_unused_picture(s2, 0);
-                    s2->last_picture_ptr= &s2->picture[i];
-                    if(ff_alloc_picture(s2, s2->last_picture_ptr, 0) < 0)
-                        return -1;
-                    s2->last_picture= *s2->last_picture_ptr;
-                }
-                if(s2->next_picture_ptr==NULL && s2->pict_type==FF_B_TYPE){
-                    int i;
-                    /* Allocate a dummy frame */
-                    i= ff_find_unused_picture(s2, 0);
-                    s2->next_picture_ptr= &s2->picture[i];
-                    if(ff_alloc_picture(s2, s2->next_picture_ptr, 0) < 0)
-                        return -1;
-                    s2->next_picture= *s2->next_picture_ptr;
-                }
-
                 if (avctx->codec->capabilities&CODEC_CAP_HWACCEL_VDPAU) {
                     s->slice_count++;
                     break;
diff --git a/libavcodec/mpegvideo.c b/libavcodec/mpegvideo.c
index e62428d..65f900e 100644
--- a/libavcodec/mpegvideo.c
+++ b/libavcodec/mpegvideo.c
@@ -894,7 +894,7 @@ int MPV_frame_start(MpegEncContext *s, AVCodecContext *avctx)
         }
       }
     }
-alloc:
+
     if(!s->encoding){
         /* release non reference frames */
         for(i=0; i<MAX_PICTURE_COUNT; i++){
@@ -946,15 +946,27 @@ alloc:
         s->current_picture_ptr ? s->current_picture_ptr->data[0] : NULL,
         s->pict_type, s->dropable);*/
 
+    if(s->codec_id != CODEC_ID_H264){
+        if((s->last_picture_ptr==NULL || s->last_picture_ptr->data[0]==NULL) && s->pict_type!=FF_I_TYPE){
+            av_log(avctx, AV_LOG_ERROR, "warning: first frame is no keyframe\n");
+            /* Allocate a dummy frame */
+            i= ff_find_unused_picture(s, 0);
+            s->last_picture_ptr= &s->picture[i];
+            if(ff_alloc_picture(s, s->last_picture_ptr, 0) < 0)
+                return -1;
+        }
+        if((s->next_picture_ptr==NULL || s->next_picture_ptr->data[0]==NULL) && s->pict_type==FF_B_TYPE){
+            /* Allocate a dummy frame */
+            i= ff_find_unused_picture(s, 0);
+            s->next_picture_ptr= &s->picture[i];
+            if(ff_alloc_picture(s, s->next_picture_ptr, 0) < 0)
+                return -1;
+        }
+    }
+
     if(s->last_picture_ptr) ff_copy_picture(&s->last_picture, s->last_picture_ptr);
     if(s->next_picture_ptr) ff_copy_picture(&s->next_picture, s->next_picture_ptr);
 
-    if(s->pict_type != FF_I_TYPE && (s->last_picture_ptr==NULL || s->last_picture_ptr->data[0]==NULL) && !s->dropable && s->codec_id != CODEC_ID_H264){
-        av_log(avctx, AV_LOG_ERROR, "warning: first frame is no keyframe\n");
-        assert(s->pict_type != FF_B_TYPE); //these should have been dropped if we don't have a reference
-        goto alloc;
-    }
-
     assert(s->pict_type == FF_I_TYPE || (s->last_picture_ptr && s->last_picture_ptr->data[0]));
 
     if(s->picture_structure!=PICT_FRAME && s->out_format != FMT_H264){

-- 
Libav/FFmpeg packaging



More information about the pkg-multimedia-commits mailing list