Restructure dummy frame allocation.
authorMichael Niedermayer <michaelni@gmx.at>
Sun, 29 Nov 2009 03:05:11 +0000 (03:05 +0000)
committerMichael Niedermayer <michaelni@gmx.at>
Sun, 29 Nov 2009 03:05:11 +0000 (03:05 +0000)
New code also allocates a dummy frame for an p field after an i field,
previously that could segfault due to reading from NULL+x.

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

libavcodec/mpeg12.c

index 196930c..7e2d1ba 100644 (file)
@@ -2371,14 +2371,8 @@ static int decode_chunks(AVCodecContext *avctx,
                 if(s2->last_picture_ptr==NULL){
                 /* Skip B-frames if we do not have reference frames and gop is not closed */
                     if(s2->pict_type==FF_B_TYPE){
-                        int i;
                         if(!s2->closed_gop)
                             break;
-                        /* 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;
                     }
                 }
                 if(s2->next_picture_ptr==NULL){
@@ -2416,6 +2410,25 @@ 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;