]> git.sesse.net Git - ffmpeg/commitdiff
avfilter: dont use AVFilterLink as priv for pictures as its freed too early.
authorMichael Niedermayer <michaelni@gmx.at>
Fri, 6 May 2011 23:02:38 +0000 (01:02 +0200)
committerMichael Niedermayer <michaelni@gmx.at>
Fri, 6 May 2011 23:02:38 +0000 (01:02 +0200)
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
libavfilter/avfilter.c
libavfilter/defaults.c

index 0518e6d6c2d9036dad80b6253cc8f7bc657a39d5..72e0a87f8e80b9c111a7284fe92027df3de43b24 100644 (file)
@@ -73,15 +73,10 @@ AVFilterBufferRef *avfilter_ref_buffer(AVFilterBufferRef *ref, int pmask)
 static void store_in_pool(AVFilterBufferRef *ref)
 {
     int i;
-    AVFilterLink *link= ref->buf->priv;
-    AVFilterPool *pool;
+    AVFilterPool *pool= ref->buf->priv;
 
     av_assert0(ref->buf->data[0]);
 
-    if(!link->pool)
-        link->pool = av_mallocz(sizeof(AVFilterPool));
-    pool= link->pool;
-
     if(pool->count == POOL_SIZE){
         AVFilterBufferRef *ref1= pool->pic[0];
         av_freep(&ref1->video);
@@ -685,7 +680,6 @@ void avfilter_free(AVFilterContext *filter)
         if ((link = filter->inputs[i])) {
             if (link->src)
                 link->src->outputs[link->srcpad - link->src->output_pads] = NULL;
-            av_freep(&link->pool);
             avfilter_formats_unref(&link->in_formats);
             avfilter_formats_unref(&link->out_formats);
         }
@@ -695,7 +689,6 @@ void avfilter_free(AVFilterContext *filter)
         if ((link = filter->outputs[i])) {
             if (link->dst)
                 link->dst->inputs[link->dstpad - link->dst->input_pads] = NULL;
-            av_freep(&link->pool);
             avfilter_formats_unref(&link->in_formats);
             avfilter_formats_unref(&link->out_formats);
         }
index 63bca6b51c045951cf9a4a3afd177d45005a7d1a..9ee23e57b75112968b6e6fddc3b42511bb87b3e5 100644 (file)
@@ -57,7 +57,8 @@ AVFilterBufferRef *avfilter_default_get_video_buffer(AVFilterLink *link, int per
             memcpy(picref->linesize, pic->linesize, sizeof(picref->linesize));
             return picref;
         }
-    }
+    }else
+        pool = link->pool = av_mallocz(sizeof(AVFilterPool));
 
     // +2 is needed for swscaler, +16 to be SIMD-friendly
     if ((i=av_image_alloc(data, linesize, w, h, link->format, 16)) < 0)
@@ -71,7 +72,7 @@ AVFilterBufferRef *avfilter_default_get_video_buffer(AVFilterLink *link, int per
     }
     memset(data[0], 128, i);
 
-    picref->buf->priv= link;
+    picref->buf->priv= pool;
     picref->buf->free= NULL;
 
     return picref;