---
libavfilter/vf_hqdn3d.c | 21 ++++++++++++++++++++-
1 files changed, 20 insertions(+), 1 deletions(-)
diff --git a/libavfilter/vf_hqdn3d.c b/libavfilter/vf_hqdn3d.c
index cbc4ab9..5a90df3 100644
--- a/libavfilter/vf_hqdn3d.c
+++ b/libavfilter/vf_hqdn3d.c
@@ -294,6 +294,23 @@ static int config_input(AVFilterLink *inlink)
return 0;
}
+static void start_frame(AVFilterLink *inlink, AVFilterBufferRef *inpicref)
+{
+ AVFilterLink *outlink = inlink->dst->outputs[0];
+ AVFilterBufferRef *outpicref;
+
+ if (inpicref->perms & AV_PERM_PRESERVE) {
+ outpicref = ff_get_video_buffer(outlink, AV_PERM_WRITE, outlink->w,
outlink->h);
+ avfilter_copy_buffer_ref_props(outpicref, inpicref);
+ outpicref->video->w = outlink->w;
+ outpicref->video->h = outlink->h;
+ } else
+ outpicref = inpicref;
+
+ outlink->out_buf = outpicref;
+ ff_start_frame(outlink, avfilter_ref_buffer(outpicref, ~0));
+}
+
static void null_draw_slice(AVFilterLink *link, int y, int h, int slice_dir) {
}
static void end_frame(AVFilterLink *inlink)
@@ -315,7 +332,8 @@ 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);
+ if (outpic != inpic)
+ avfilter_unref_buffer(outpic);
}
AVFilter avfilter_vf_hqdn3d = {
@@ -329,6 +347,7 @@ AVFilter avfilter_vf_hqdn3d = {
.inputs = (AVFilterPad[]) {{ .name = "default",
.type = AVMEDIA_TYPE_VIDEO,
+ .start_frame = start_frame,
.draw_slice = null_draw_slice,
.config_props = config_input,
.end_frame = end_frame },
--
1.7.4.1
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel