changeset 10594:73779b8e6c5f libavcodec

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.
author michael
date Sun, 29 Nov 2009 03:05:11 +0000
parents 46cb472ecc1e
children c58c770b17f5
files mpeg12.c
diffstat 1 files changed, 19 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/mpeg12.c	Sun Nov 29 01:50:43 2009 +0000
+++ b/mpeg12.c	Sun Nov 29 03:05:11 2009 +0000
@@ -2371,14 +2371,8 @@
                 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 @@
                     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;