vf_pad: don't give up its own reference to the output buffer.
authorAnton Khirnov <anton@khirnov.net>
Sun, 8 Jul 2012 15:01:17 +0000 (17:01 +0200)
committerAnton Khirnov <anton@khirnov.net>
Fri, 20 Jul 2012 19:08:13 +0000 (21:08 +0200)
libavfilter/vf_pad.c

index de7ae00..037abd5 100644 (file)
@@ -303,6 +303,7 @@ static void start_frame(AVFilterLink *inlink, AVFilterBufferRef *inpicref)
 {
     PadContext *pad = inlink->dst->priv;
     AVFilterBufferRef *outpicref = avfilter_ref_buffer(inpicref, ~0);
 {
     PadContext *pad = inlink->dst->priv;
     AVFilterBufferRef *outpicref = avfilter_ref_buffer(inpicref, ~0);
+    AVFilterBufferRef *for_next_filter;
     int plane;
 
     for (plane = 0; plane < 4 && outpicref->data[plane]; plane++) {
     int plane;
 
     for (plane = 0; plane < 4 && outpicref->data[plane]; plane++) {
@@ -339,12 +340,14 @@ static void start_frame(AVFilterLink *inlink, AVFilterBufferRef *inpicref)
     outpicref->video->w = pad->w;
     outpicref->video->h = pad->h;
 
     outpicref->video->w = pad->w;
     outpicref->video->h = pad->h;
 
-    ff_start_frame(inlink->dst->outputs[0], outpicref);
+    for_next_filter = avfilter_ref_buffer(outpicref, ~0);
+    ff_start_frame(inlink->dst->outputs[0], for_next_filter);
 }
 
 static void end_frame(AVFilterLink *link)
 {
     ff_end_frame(link->dst->outputs[0]);
 }
 
 static void end_frame(AVFilterLink *link)
 {
     ff_end_frame(link->dst->outputs[0]);
+    avfilter_unref_buffer(link->dst->outputs[0]->out_buf);
     avfilter_unref_buffer(link->cur_buf);
 }
 
     avfilter_unref_buffer(link->cur_buf);
 }