[SCM] libav/experimental: Restructure dummy frame allocation. 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.

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


The following commit has been merged in the experimental branch:
commit d9b99556bfa9388d3d61b92dd22853e05a1ea428
Author: Michael Niedermayer <michaelni at gmx.at>
Date:   Sun Nov 29 03:05:11 2009 +0000

    Restructure dummy frame allocation.
    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

diff --git a/libavcodec/mpeg12.c b/libavcodec/mpeg12.c
index 196930c..7e2d1ba 100644
--- a/libavcodec/mpeg12.c
+++ b/libavcodec/mpeg12.c
@@ -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;

-- 
Libav/FFmpeg packaging



More information about the pkg-multimedia-commits mailing list