From b70d89a033dacf53758256f875f1b23ce0ae13f1 Mon Sep 17 00:00:00 2001 From: Robert Nagy Date: Mon, 16 Apr 2012 08:17:25 +0200 Subject: lavfi: add avfilter_unref_bufferp() Signed-off-by: Anton Khirnov --- doc/APIchanges | 3 +++ libavfilter/avfilter.h | 12 ++++++++++++ libavfilter/buffer.c | 6 ++++++ 3 files changed, 21 insertions(+) diff --git a/doc/APIchanges b/doc/APIchanges index f936d5feda..8770b6d570 100644 --- a/doc/APIchanges +++ b/doc/APIchanges @@ -13,6 +13,9 @@ libavutil: 2011-04-18 API changes, most recent first: +2012-07-xx - xxxxxxx - lavfi 3.0.0 - avfilter.h + Add avfilter_unref_bufferp(). + 2012-07-10 - 5fade8a - lavu 51.37.0 Add av_malloc_array() and av_mallocz_array() diff --git a/libavfilter/avfilter.h b/libavfilter/avfilter.h index 10d64ad614..7fbdd8a2fb 100644 --- a/libavfilter/avfilter.h +++ b/libavfilter/avfilter.h @@ -195,9 +195,21 @@ AVFilterBufferRef *avfilter_ref_buffer(AVFilterBufferRef *ref, int pmask); * buffer, the buffer itself is also automatically freed. * * @param ref reference to the buffer, may be NULL + * + * @note it is recommended to use avfilter_unref_bufferp() instead of this + * function */ void avfilter_unref_buffer(AVFilterBufferRef *ref); +/** + * Remove a reference to a buffer and set the pointer to NULL. + * If this is the last reference to the buffer, the buffer itself + * is also automatically freed. + * + * @param ref pointer to the buffer reference + */ +void avfilter_unref_bufferp(AVFilterBufferRef **ref); + #if FF_API_AVFILTERPAD_PUBLIC /** * A filter pad used for either input or output. diff --git a/libavfilter/buffer.c b/libavfilter/buffer.c index be0da26ea1..e3ebc9b8c7 100644 --- a/libavfilter/buffer.c +++ b/libavfilter/buffer.c @@ -84,6 +84,12 @@ void avfilter_unref_buffer(AVFilterBufferRef *ref) av_free(ref); } +void avfilter_unref_bufferp(AVFilterBufferRef **ref) +{ + avfilter_unref_buffer(*ref); + *ref = NULL; +} + int avfilter_copy_frame_props(AVFilterBufferRef *dst, const AVFrame *src) { dst->pts = src->pts; -- cgit v1.2.3 From 51a8049be8be096b50a1613d65433f9c7949e1a2 Mon Sep 17 00:00:00 2001 From: Anton Khirnov Date: Wed, 11 Jul 2012 09:58:43 +0200 Subject: vf_aspect: clear AVFilterLink.cur_buf in start_frame(). The buffer is passed on to the next filter, so we shouldn't keep any pointers to it. --- libavfilter/vf_aspect.c | 1 + 1 file changed, 1 insertion(+) diff --git a/libavfilter/vf_aspect.c b/libavfilter/vf_aspect.c index 4b58e5ea47..1bedd519c3 100644 --- a/libavfilter/vf_aspect.c +++ b/libavfilter/vf_aspect.c @@ -69,6 +69,7 @@ static void start_frame(AVFilterLink *link, AVFilterBufferRef *picref) AspectContext *aspect = link->dst->priv; picref->video->pixel_aspect = aspect->aspect; + link->cur_buf = NULL; ff_start_frame(link->dst->outputs[0], picref); } -- cgit v1.2.3 From 0fe010a36f6604ea8fd9be04c895395d215177dd Mon Sep 17 00:00:00 2001 From: Anton Khirnov Date: Sun, 8 Jul 2012 04:07:05 +0200 Subject: vf_delogo: don't store two pointers to one AVFilterBufferRef. --- libavfilter/vf_delogo.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/libavfilter/vf_delogo.c b/libavfilter/vf_delogo.c index c2487396d7..2f9e1f9cac 100644 --- a/libavfilter/vf_delogo.c +++ b/libavfilter/vf_delogo.c @@ -226,7 +226,7 @@ static void start_frame(AVFilterLink *inlink, AVFilterBufferRef *inpicref) outpicref->video->w = outlink->w; outpicref->video->h = outlink->h; } else - outpicref = inpicref; + outpicref = avfilter_ref_buffer(inpicref, ~0); outlink->out_buf = outpicref; ff_start_frame(outlink, avfilter_ref_buffer(outpicref, ~0)); @@ -240,7 +240,7 @@ static void end_frame(AVFilterLink *inlink) AVFilterLink *outlink = inlink->dst->outputs[0]; AVFilterBufferRef *inpicref = inlink ->cur_buf; AVFilterBufferRef *outpicref = outlink->out_buf; - int direct = inpicref == outpicref; + int direct = inpicref->buf == outpicref->buf; int hsub0 = av_pix_fmt_descriptors[inlink->format].log2_chroma_w; int vsub0 = av_pix_fmt_descriptors[inlink->format].log2_chroma_h; int plane; @@ -261,8 +261,7 @@ static void end_frame(AVFilterLink *inlink) ff_draw_slice(outlink, 0, inlink->h, 1); ff_end_frame(outlink); avfilter_unref_buffer(inpicref); - if (!direct) - avfilter_unref_buffer(outpicref); + avfilter_unref_buffer(outpicref); } AVFilter avfilter_vf_delogo = { -- cgit v1.2.3 From d19499c7960fba97e6142dc72d49825e834e3419 Mon Sep 17 00:00:00 2001 From: Anton Khirnov Date: Sun, 8 Jul 2012 04:07:05 +0200 Subject: vf_gradfun: don't store two pointers to one AVFilterBufferRef. --- libavfilter/vf_gradfun.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/libavfilter/vf_gradfun.c b/libavfilter/vf_gradfun.c index 71749fe7a9..735bd503a0 100644 --- a/libavfilter/vf_gradfun.c +++ b/libavfilter/vf_gradfun.c @@ -191,7 +191,7 @@ static void start_frame(AVFilterLink *inlink, AVFilterBufferRef *inpicref) outpicref->video->w = outlink->w; outpicref->video->h = outlink->h; } else - outpicref = inpicref; + outpicref = avfilter_ref_buffer(inpicref, ~0); outlink->out_buf = outpicref; ff_start_frame(outlink, avfilter_ref_buffer(outpicref, ~0)); @@ -226,8 +226,7 @@ static void end_frame(AVFilterLink *inlink) ff_draw_slice(outlink, 0, inlink->h, 1); ff_end_frame(outlink); avfilter_unref_buffer(inpic); - if (outpic != inpic) - avfilter_unref_buffer(outpic); + avfilter_unref_buffer(outpic); } AVFilter avfilter_vf_gradfun = { -- cgit v1.2.3 From 7155763b78fcc1f158e02f4d44d251a1e597f0cc Mon Sep 17 00:00:00 2001 From: Anton Khirnov Date: Sun, 8 Jul 2012 04:20:22 +0200 Subject: vf_drawtext: don't give up its own reference to the input buffer. Directly forwarding the input buffer to the next filter means that drawtext no longer owns any references to it and thus shouldn't refer to it in any way. --- libavfilter/vf_drawtext.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/libavfilter/vf_drawtext.c b/libavfilter/vf_drawtext.c index 22a9480aba..fd2ec8deae 100644 --- a/libavfilter/vf_drawtext.c +++ b/libavfilter/vf_drawtext.c @@ -812,6 +812,7 @@ static void start_frame(AVFilterLink *inlink, AVFilterBufferRef *inpicref) { AVFilterContext *ctx = inlink->dst; DrawTextContext *dtext = ctx->priv; + AVFilterBufferRef *buf_out; int fail = 0; if (dtext_prepare_text(ctx) < 0) { @@ -850,7 +851,8 @@ static void start_frame(AVFilterLink *inlink, AVFilterBufferRef *inpicref) (int)dtext->var_values[VAR_N], dtext->var_values[VAR_T], dtext->x, dtext->y, dtext->x+dtext->w, dtext->y+dtext->h); - ff_start_frame(inlink->dst->outputs[0], inpicref); + buf_out = avfilter_ref_buffer(inpicref, ~0); + ff_start_frame(inlink->dst->outputs[0], buf_out); } static void end_frame(AVFilterLink *inlink) @@ -866,6 +868,7 @@ static void end_frame(AVFilterLink *inlink) ff_draw_slice(outlink, 0, picref->video->h, 1); ff_end_frame(outlink); + avfilter_unref_buffer(inlink->cur_buf); } AVFilter avfilter_vf_drawtext = { -- cgit v1.2.3 From ad8b6326aa00b87a87814d11707adf31ad2eaf28 Mon Sep 17 00:00:00 2001 From: Anton Khirnov Date: Sun, 8 Jul 2012 05:34:20 +0200 Subject: vf_overlay: don't access a buffer reference that's been given away. --- libavfilter/vf_overlay.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/libavfilter/vf_overlay.c b/libavfilter/vf_overlay.c index 9852853a52..b9d64b9495 100644 --- a/libavfilter/vf_overlay.c +++ b/libavfilter/vf_overlay.c @@ -214,7 +214,6 @@ static void start_frame(AVFilterLink *inlink, AVFilterBufferRef *inpicref) AVFilterContext *ctx = inlink->dst; OverlayContext *over = ctx->priv; - inlink->dst->outputs[0]->out_buf = outpicref; outpicref->pts = av_rescale_q(outpicref->pts, ctx->inputs[MAIN]->time_base, ctx->outputs[0]->time_base); @@ -324,7 +323,7 @@ static void draw_slice(AVFilterLink *inlink, int y, int h, int slice_dir) { AVFilterContext *ctx = inlink->dst; AVFilterLink *outlink = ctx->outputs[0]; - AVFilterBufferRef *outpicref = outlink->out_buf; + AVFilterBufferRef *outpicref = inlink->cur_buf; OverlayContext *over = ctx->priv; if (over->overpicref && -- cgit v1.2.3 From f493c644cd9671965ba886cfaffd3aa7a648c02d Mon Sep 17 00:00:00 2001 From: Anton Khirnov Date: Sun, 8 Jul 2012 17:01:17 +0200 Subject: vf_pad: don't give up its own reference to the output buffer. --- libavfilter/vf_pad.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/libavfilter/vf_pad.c b/libavfilter/vf_pad.c index de7ae0086b..037abd5d57 100644 --- a/libavfilter/vf_pad.c +++ b/libavfilter/vf_pad.c @@ -303,6 +303,7 @@ static void start_frame(AVFilterLink *inlink, AVFilterBufferRef *inpicref) { 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++) { @@ -339,12 +340,14 @@ static void start_frame(AVFilterLink *inlink, AVFilterBufferRef *inpicref) 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]); + avfilter_unref_buffer(link->dst->outputs[0]->out_buf); avfilter_unref_buffer(link->cur_buf); } -- cgit v1.2.3 From 9203fa0b3225cfb79b37270b2db1200d9183b3b8 Mon Sep 17 00:00:00 2001 From: Anton Khirnov Date: Sun, 8 Jul 2012 17:01:17 +0200 Subject: vf_fieldorder: don't give up its own reference to the output buffer. --- libavfilter/vf_fieldorder.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/libavfilter/vf_fieldorder.c b/libavfilter/vf_fieldorder.c index 55e72389b2..b3cce19fcb 100644 --- a/libavfilter/vf_fieldorder.c +++ b/libavfilter/vf_fieldorder.c @@ -121,12 +121,13 @@ static void start_frame(AVFilterLink *inlink, AVFilterBufferRef *inpicref) AVFilterContext *ctx = inlink->dst; AVFilterLink *outlink = ctx->outputs[0]; - AVFilterBufferRef *outpicref; + AVFilterBufferRef *outpicref, *for_next_filter; outpicref = avfilter_ref_buffer(inpicref, ~0); outlink->out_buf = outpicref; - ff_start_frame(outlink, outpicref); + for_next_filter = avfilter_ref_buffer(outpicref, ~0); + ff_start_frame(outlink, for_next_filter); } static void draw_slice(AVFilterLink *inlink, int y, int h, int slice_dir) @@ -213,6 +214,7 @@ static void end_frame(AVFilterLink *inlink) ff_end_frame(outlink); avfilter_unref_buffer(inpicref); + avfilter_unref_bufferp(&outlink->out_buf); } AVFilter avfilter_vf_fieldorder = { -- cgit v1.2.3 From 0393af4f0b9a536fb2a005c94aeb3a476db2645b Mon Sep 17 00:00:00 2001 From: Anton Khirnov Date: Wed, 11 Jul 2012 11:00:48 +0200 Subject: vf_settb: simplify start_frame(). Avoid pointless filter ref/unref. Just use the reference passed to start_frame(). --- libavfilter/vf_settb.c | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/libavfilter/vf_settb.c b/libavfilter/vf_settb.c index 62084bf9e8..ccd41ccf4a 100644 --- a/libavfilter/vf_settb.c +++ b/libavfilter/vf_settb.c @@ -108,18 +108,17 @@ static void start_frame(AVFilterLink *inlink, AVFilterBufferRef *picref) { AVFilterContext *ctx = inlink->dst; AVFilterLink *outlink = ctx->outputs[0]; - AVFilterBufferRef *picref2 = picref; if (av_cmp_q(inlink->time_base, outlink->time_base)) { - picref2 = avfilter_ref_buffer(picref, ~0); - picref2->pts = av_rescale_q(picref->pts, inlink->time_base, outlink->time_base); + int64_t orig_pts = picref->pts; + picref->pts = av_rescale_q(picref->pts, inlink->time_base, outlink->time_base); av_log(ctx, AV_LOG_DEBUG, "tb:%d/%d pts:%"PRId64" -> tb:%d/%d pts:%"PRId64"\n", - inlink ->time_base.num, inlink ->time_base.den, picref ->pts, - outlink->time_base.num, outlink->time_base.den, picref2->pts); - avfilter_unref_buffer(picref); + inlink ->time_base.num, inlink ->time_base.den, orig_pts, + outlink->time_base.num, outlink->time_base.den, picref->pts); } + inlink->cur_buf = NULL; - ff_start_frame(outlink, picref2); + ff_start_frame(outlink, picref); } AVFilter avfilter_vf_settb = { -- cgit v1.2.3 From 5b50ae94e66547b25fc010d7e4bb1de5788a459c Mon Sep 17 00:00:00 2001 From: Anton Khirnov Date: Wed, 11 Jul 2012 09:58:43 +0200 Subject: vf_slicify: clear AVFilterLink.cur_buf in start_frame(). The buffer is passed on to the next filter, so we shouldn't keep any pointers to it. --- libavfilter/vf_slicify.c | 1 + 1 file changed, 1 insertion(+) diff --git a/libavfilter/vf_slicify.c b/libavfilter/vf_slicify.c index e256c4561b..e35407586e 100644 --- a/libavfilter/vf_slicify.c +++ b/libavfilter/vf_slicify.c @@ -73,6 +73,7 @@ static void start_frame(AVFilterLink *link, AVFilterBufferRef *picref) slice->h = FFMAX(8, slice->h & (-1 << slice->vshift)); av_log(link->dst, AV_LOG_DEBUG, "h:%d\n", slice->h); + link->cur_buf = NULL; ff_start_frame(link->dst->outputs[0], picref); } -- cgit v1.2.3 From 533fd5b5b468131cfe164455783c351eb69af657 Mon Sep 17 00:00:00 2001 From: Anton Khirnov Date: Sun, 15 Jul 2012 11:12:10 +0200 Subject: vsrc_testsrc: avoid an unnecessary avfilter_ref_buffer(). --- libavfilter/vsrc_testsrc.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/libavfilter/vsrc_testsrc.c b/libavfilter/vsrc_testsrc.c index c8e1aa61aa..f2bbbac0e6 100644 --- a/libavfilter/vsrc_testsrc.c +++ b/libavfilter/vsrc_testsrc.c @@ -143,10 +143,9 @@ static int request_frame(AVFilterLink *outlink) test->nb_frame++; test->fill_picture_fn(outlink->src, picref); - ff_start_frame(outlink, avfilter_ref_buffer(picref, ~0)); - ff_draw_slice(outlink, 0, picref->video->h, 1); + ff_start_frame(outlink, picref); + ff_draw_slice(outlink, 0, test->h, 1); ff_end_frame(outlink); - avfilter_unref_buffer(picref); return 0; } -- cgit v1.2.3 From 07bad27810cdd7d3171cbd542119aa051646377c Mon Sep 17 00:00:00 2001 From: Anton Khirnov Date: Sat, 14 Jul 2012 17:09:43 +0200 Subject: lavfi: unref AVFilterLink.cur_buf in ff_end_frame(). This reduces code duplication and prevents stale pointers from remaining on the link. --- libavfilter/fifo.c | 1 + libavfilter/split.c | 2 -- libavfilter/vf_crop.c | 1 - libavfilter/vf_delogo.c | 1 - libavfilter/vf_drawtext.c | 1 - libavfilter/vf_fieldorder.c | 1 - libavfilter/vf_fps.c | 1 + libavfilter/vf_frei0r.c | 1 - libavfilter/vf_gradfun.c | 1 - libavfilter/vf_hqdn3d.c | 1 - libavfilter/vf_libopencv.c | 1 - libavfilter/vf_overlay.c | 1 - libavfilter/vf_pad.c | 1 - libavfilter/vf_select.c | 2 -- libavfilter/vf_transpose.c | 1 - libavfilter/vf_unsharp.c | 1 - libavfilter/video.c | 7 +++---- 17 files changed, 5 insertions(+), 20 deletions(-) diff --git a/libavfilter/fifo.c b/libavfilter/fifo.c index e09e3192ba..e1faf74855 100644 --- a/libavfilter/fifo.c +++ b/libavfilter/fifo.c @@ -91,6 +91,7 @@ static int add_to_queue(AVFilterLink *inlink, AVFilterBufferRef *buf) static void start_frame(AVFilterLink *inlink, AVFilterBufferRef *buf) { add_to_queue(inlink, buf); + inlink->cur_buf = NULL; } static void queue_pop(FifoContext *s) diff --git a/libavfilter/split.c b/libavfilter/split.c index a3f6ef2337..33cb226b93 100644 --- a/libavfilter/split.c +++ b/libavfilter/split.c @@ -89,8 +89,6 @@ static void end_frame(AVFilterLink *inlink) for (i = 0; i < ctx->nb_outputs; i++) ff_end_frame(ctx->outputs[i]); - - avfilter_unref_buffer(inlink->cur_buf); } AVFilter avfilter_vf_split = { diff --git a/libavfilter/vf_crop.c b/libavfilter/vf_crop.c index 6d124c19d3..6988fcffa9 100644 --- a/libavfilter/vf_crop.c +++ b/libavfilter/vf_crop.c @@ -317,7 +317,6 @@ static void end_frame(AVFilterLink *link) CropContext *crop = link->dst->priv; crop->var_values[VAR_N] += 1.0; - avfilter_unref_buffer(link->cur_buf); ff_end_frame(link->dst->outputs[0]); } diff --git a/libavfilter/vf_delogo.c b/libavfilter/vf_delogo.c index 2f9e1f9cac..f9c5ad76be 100644 --- a/libavfilter/vf_delogo.c +++ b/libavfilter/vf_delogo.c @@ -260,7 +260,6 @@ static void end_frame(AVFilterLink *inlink) ff_draw_slice(outlink, 0, inlink->h, 1); ff_end_frame(outlink); - avfilter_unref_buffer(inpicref); avfilter_unref_buffer(outpicref); } diff --git a/libavfilter/vf_drawtext.c b/libavfilter/vf_drawtext.c index fd2ec8deae..eac7245bfb 100644 --- a/libavfilter/vf_drawtext.c +++ b/libavfilter/vf_drawtext.c @@ -868,7 +868,6 @@ static void end_frame(AVFilterLink *inlink) ff_draw_slice(outlink, 0, picref->video->h, 1); ff_end_frame(outlink); - avfilter_unref_buffer(inlink->cur_buf); } AVFilter avfilter_vf_drawtext = { diff --git a/libavfilter/vf_fieldorder.c b/libavfilter/vf_fieldorder.c index b3cce19fcb..05882d13fe 100644 --- a/libavfilter/vf_fieldorder.c +++ b/libavfilter/vf_fieldorder.c @@ -213,7 +213,6 @@ static void end_frame(AVFilterLink *inlink) } ff_end_frame(outlink); - avfilter_unref_buffer(inpicref); avfilter_unref_bufferp(&outlink->out_buf); } diff --git a/libavfilter/vf_fps.c b/libavfilter/vf_fps.c index bcc6a69814..f78e008c7d 100644 --- a/libavfilter/vf_fps.c +++ b/libavfilter/vf_fps.c @@ -175,6 +175,7 @@ static void end_frame(AVFilterLink *inlink) int64_t delta; int i; + inlink->cur_buf = NULL; s->frames_in++; /* discard frames until we get the first timestamp */ if (s->pts == AV_NOPTS_VALUE) { diff --git a/libavfilter/vf_frei0r.c b/libavfilter/vf_frei0r.c index 93ec92afa6..87c9276e3e 100644 --- a/libavfilter/vf_frei0r.c +++ b/libavfilter/vf_frei0r.c @@ -352,7 +352,6 @@ static void end_frame(AVFilterLink *inlink) frei0r->update(frei0r->instance, inpicref->pts * av_q2d(inlink->time_base) * 1000, (const uint32_t *)inpicref->data[0], (uint32_t *)outpicref->data[0]); - avfilter_unref_buffer(inpicref); ff_draw_slice(outlink, 0, outlink->h, 1); ff_end_frame(outlink); avfilter_unref_buffer(outpicref); diff --git a/libavfilter/vf_gradfun.c b/libavfilter/vf_gradfun.c index 735bd503a0..b6583d7098 100644 --- a/libavfilter/vf_gradfun.c +++ b/libavfilter/vf_gradfun.c @@ -225,7 +225,6 @@ static void end_frame(AVFilterLink *inlink) ff_draw_slice(outlink, 0, inlink->h, 1); ff_end_frame(outlink); - avfilter_unref_buffer(inpic); avfilter_unref_buffer(outpic); } diff --git a/libavfilter/vf_hqdn3d.c b/libavfilter/vf_hqdn3d.c index af69d417c4..79adaea663 100644 --- a/libavfilter/vf_hqdn3d.c +++ b/libavfilter/vf_hqdn3d.c @@ -322,7 +322,6 @@ static void end_frame(AVFilterLink *inlink) ff_draw_slice(outlink, 0, inpic->video->h, 1); ff_end_frame(outlink); - avfilter_unref_buffer(inpic); avfilter_unref_buffer(outpic); } diff --git a/libavfilter/vf_libopencv.c b/libavfilter/vf_libopencv.c index ac892d948f..f04d4690b5 100644 --- a/libavfilter/vf_libopencv.c +++ b/libavfilter/vf_libopencv.c @@ -365,7 +365,6 @@ static void end_frame(AVFilterLink *inlink) ocv->end_frame_filter(ctx, &inimg, &outimg); fill_picref_from_iplimage(outpicref, &outimg, inlink->format); - avfilter_unref_buffer(inpicref); ff_draw_slice(outlink, 0, outlink->h, 1); ff_end_frame(outlink); avfilter_unref_buffer(outpicref); diff --git a/libavfilter/vf_overlay.c b/libavfilter/vf_overlay.c index b9d64b9495..1230763e4e 100644 --- a/libavfilter/vf_overlay.c +++ b/libavfilter/vf_overlay.c @@ -339,7 +339,6 @@ static void draw_slice(AVFilterLink *inlink, int y, int h, int slice_dir) static void end_frame(AVFilterLink *inlink) { ff_end_frame(inlink->dst->outputs[0]); - avfilter_unref_buffer(inlink->cur_buf); } static void null_draw_slice(AVFilterLink *inlink, int y, int h, int slice_dir) { } diff --git a/libavfilter/vf_pad.c b/libavfilter/vf_pad.c index 037abd5d57..b0d5c5fb2f 100644 --- a/libavfilter/vf_pad.c +++ b/libavfilter/vf_pad.c @@ -348,7 +348,6 @@ 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); } static void draw_send_bar_slice(AVFilterLink *link, int y, int h, int slice_dir, int before_slice) diff --git a/libavfilter/vf_select.c b/libavfilter/vf_select.c index 719885e401..91d48f07da 100644 --- a/libavfilter/vf_select.c +++ b/libavfilter/vf_select.c @@ -258,14 +258,12 @@ static void draw_slice(AVFilterLink *inlink, int y, int h, int slice_dir) static void end_frame(AVFilterLink *inlink) { SelectContext *select = inlink->dst->priv; - AVFilterBufferRef *picref = inlink->cur_buf; if (select->select) { if (select->cache_frames) return; ff_end_frame(inlink->dst->outputs[0]); } - avfilter_unref_buffer(picref); } static int request_frame(AVFilterLink *outlink) diff --git a/libavfilter/vf_transpose.c b/libavfilter/vf_transpose.c index f78244e6bd..e772e8b119 100644 --- a/libavfilter/vf_transpose.c +++ b/libavfilter/vf_transpose.c @@ -192,7 +192,6 @@ static void end_frame(AVFilterLink *inlink) } } - avfilter_unref_buffer(inpic); ff_draw_slice(outlink, 0, outpic->video->h, 1); ff_end_frame(outlink); avfilter_unref_buffer(outpic); diff --git a/libavfilter/vf_unsharp.c b/libavfilter/vf_unsharp.c index ddfbf2cd3c..3d28759ddf 100644 --- a/libavfilter/vf_unsharp.c +++ b/libavfilter/vf_unsharp.c @@ -225,7 +225,6 @@ static void end_frame(AVFilterLink *link) apply_unsharp(out->data[1], out->linesize[1], in->data[1], in->linesize[1], cw, ch, &unsharp->chroma); apply_unsharp(out->data[2], out->linesize[2], in->data[2], in->linesize[2], cw, ch, &unsharp->chroma); - avfilter_unref_buffer(in); ff_draw_slice(link->dst->outputs[0], 0, link->h, 1); ff_end_frame(link->dst->outputs[0]); avfilter_unref_buffer(out); diff --git a/libavfilter/video.c b/libavfilter/video.c index feaaebab86..e507f973b4 100644 --- a/libavfilter/video.c +++ b/libavfilter/video.c @@ -162,7 +162,8 @@ AVFilterBufferRef *ff_get_video_buffer(AVFilterLink *link, int perms, int w, int void ff_null_start_frame(AVFilterLink *link, AVFilterBufferRef *picref) { - ff_start_frame(link->dst->outputs[0], picref); + AVFilterBufferRef *buf_out = avfilter_ref_buffer(picref, ~0); + ff_start_frame(link->dst->outputs[0], buf_out); } static void default_start_frame(AVFilterLink *inlink, AVFilterBufferRef *picref) @@ -223,9 +224,6 @@ static void default_end_frame(AVFilterLink *inlink) if (inlink->dst->nb_outputs) outlink = inlink->dst->outputs[0]; - avfilter_unref_buffer(inlink->cur_buf); - inlink->cur_buf = NULL; - if (outlink) { if (outlink->out_buf) { avfilter_unref_buffer(outlink->out_buf); @@ -250,6 +248,7 @@ void ff_end_frame(AVFilterLink *link) avfilter_unref_buffer(link->src_buf); link->src_buf = NULL; } + avfilter_unref_bufferp(&link->cur_buf); } void ff_null_draw_slice(AVFilterLink *link, int y, int h, int slice_dir) -- cgit v1.2.3 From 4c9080a7ef18ad71fb0a75c8d1c1803edd780edd Mon Sep 17 00:00:00 2001 From: Anton Khirnov Date: Sat, 14 Jul 2012 17:09:43 +0200 Subject: lavfi: unref AVFilterLink.out_buf in ff_end_frame(). This reduces code duplication and prevents stale pointers from remaining on the link. --- libavfilter/vf_delogo.c | 1 - libavfilter/vf_fieldorder.c | 1 - libavfilter/vf_frei0r.c | 1 - libavfilter/vf_gradfun.c | 1 - libavfilter/vf_hqdn3d.c | 1 - libavfilter/vf_libopencv.c | 1 - libavfilter/vf_pad.c | 1 - libavfilter/vf_transpose.c | 1 - libavfilter/vf_unsharp.c | 1 - libavfilter/video.c | 5 +---- 10 files changed, 1 insertion(+), 13 deletions(-) diff --git a/libavfilter/vf_delogo.c b/libavfilter/vf_delogo.c index f9c5ad76be..9c6e4881a0 100644 --- a/libavfilter/vf_delogo.c +++ b/libavfilter/vf_delogo.c @@ -260,7 +260,6 @@ static void end_frame(AVFilterLink *inlink) ff_draw_slice(outlink, 0, inlink->h, 1); ff_end_frame(outlink); - avfilter_unref_buffer(outpicref); } AVFilter avfilter_vf_delogo = { diff --git a/libavfilter/vf_fieldorder.c b/libavfilter/vf_fieldorder.c index 05882d13fe..1ddec1521a 100644 --- a/libavfilter/vf_fieldorder.c +++ b/libavfilter/vf_fieldorder.c @@ -213,7 +213,6 @@ static void end_frame(AVFilterLink *inlink) } ff_end_frame(outlink); - avfilter_unref_bufferp(&outlink->out_buf); } AVFilter avfilter_vf_fieldorder = { diff --git a/libavfilter/vf_frei0r.c b/libavfilter/vf_frei0r.c index 87c9276e3e..98d34abe3b 100644 --- a/libavfilter/vf_frei0r.c +++ b/libavfilter/vf_frei0r.c @@ -354,7 +354,6 @@ static void end_frame(AVFilterLink *inlink) (uint32_t *)outpicref->data[0]); ff_draw_slice(outlink, 0, outlink->h, 1); ff_end_frame(outlink); - avfilter_unref_buffer(outpicref); } AVFilter avfilter_vf_frei0r = { diff --git a/libavfilter/vf_gradfun.c b/libavfilter/vf_gradfun.c index b6583d7098..873c0d0d8e 100644 --- a/libavfilter/vf_gradfun.c +++ b/libavfilter/vf_gradfun.c @@ -225,7 +225,6 @@ static void end_frame(AVFilterLink *inlink) ff_draw_slice(outlink, 0, inlink->h, 1); ff_end_frame(outlink); - avfilter_unref_buffer(outpic); } AVFilter avfilter_vf_gradfun = { diff --git a/libavfilter/vf_hqdn3d.c b/libavfilter/vf_hqdn3d.c index 79adaea663..221ff2e21e 100644 --- a/libavfilter/vf_hqdn3d.c +++ b/libavfilter/vf_hqdn3d.c @@ -322,7 +322,6 @@ static void end_frame(AVFilterLink *inlink) ff_draw_slice(outlink, 0, inpic->video->h, 1); ff_end_frame(outlink); - avfilter_unref_buffer(outpic); } AVFilter avfilter_vf_hqdn3d = { diff --git a/libavfilter/vf_libopencv.c b/libavfilter/vf_libopencv.c index f04d4690b5..1e8185fc38 100644 --- a/libavfilter/vf_libopencv.c +++ b/libavfilter/vf_libopencv.c @@ -367,7 +367,6 @@ static void end_frame(AVFilterLink *inlink) ff_draw_slice(outlink, 0, outlink->h, 1); ff_end_frame(outlink); - avfilter_unref_buffer(outpicref); } AVFilter avfilter_vf_ocv = { diff --git a/libavfilter/vf_pad.c b/libavfilter/vf_pad.c index b0d5c5fb2f..6ce70bd684 100644 --- a/libavfilter/vf_pad.c +++ b/libavfilter/vf_pad.c @@ -347,7 +347,6 @@ static void start_frame(AVFilterLink *inlink, AVFilterBufferRef *inpicref) static void end_frame(AVFilterLink *link) { ff_end_frame(link->dst->outputs[0]); - avfilter_unref_buffer(link->dst->outputs[0]->out_buf); } static void draw_send_bar_slice(AVFilterLink *link, int y, int h, int slice_dir, int before_slice) diff --git a/libavfilter/vf_transpose.c b/libavfilter/vf_transpose.c index e772e8b119..ed75866c83 100644 --- a/libavfilter/vf_transpose.c +++ b/libavfilter/vf_transpose.c @@ -194,7 +194,6 @@ static void end_frame(AVFilterLink *inlink) ff_draw_slice(outlink, 0, outpic->video->h, 1); ff_end_frame(outlink); - avfilter_unref_buffer(outpic); } AVFilter avfilter_vf_transpose = { diff --git a/libavfilter/vf_unsharp.c b/libavfilter/vf_unsharp.c index 3d28759ddf..2a0fe00660 100644 --- a/libavfilter/vf_unsharp.c +++ b/libavfilter/vf_unsharp.c @@ -227,7 +227,6 @@ static void end_frame(AVFilterLink *link) ff_draw_slice(link->dst->outputs[0], 0, link->h, 1); ff_end_frame(link->dst->outputs[0]); - avfilter_unref_buffer(out); } static void draw_slice(AVFilterLink *link, int y, int h, int slice_dir) diff --git a/libavfilter/video.c b/libavfilter/video.c index e507f973b4..f61eafe19e 100644 --- a/libavfilter/video.c +++ b/libavfilter/video.c @@ -225,10 +225,6 @@ static void default_end_frame(AVFilterLink *inlink) outlink = inlink->dst->outputs[0]; if (outlink) { - if (outlink->out_buf) { - avfilter_unref_buffer(outlink->out_buf); - outlink->out_buf = NULL; - } ff_end_frame(outlink); } } @@ -249,6 +245,7 @@ void ff_end_frame(AVFilterLink *link) link->src_buf = NULL; } avfilter_unref_bufferp(&link->cur_buf); + avfilter_unref_bufferp(&link->out_buf); } void ff_null_draw_slice(AVFilterLink *link, int y, int h, int slice_dir) -- cgit v1.2.3