summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul B Mahol <onemda@gmail.com>2021-10-22 09:34:51 +0200
committerPaul B Mahol <onemda@gmail.com>2021-10-22 09:36:54 +0200
commit444cf3fca8dab2da9b95cc36920667f76d0f796c (patch)
treef51b9716f3f53b7d9df3beae97c20e91dfa66b4b
parentcf0881bcfc88b4afb62a4647b0e09809e9612a5b (diff)
avfilter/vf_bilateral: add direct aka writable frame support
-rw-r--r--libavfilter/vf_bilateral.c24
1 files changed, 15 insertions, 9 deletions
diff --git a/libavfilter/vf_bilateral.c b/libavfilter/vf_bilateral.c
index 8fe341f70d..b236efe6c3 100644
--- a/libavfilter/vf_bilateral.c
+++ b/libavfilter/vf_bilateral.c
@@ -297,18 +297,23 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *in)
AVFilterLink *outlink = ctx->outputs[0];
AVFrame *out;
- out = ff_get_video_buffer(outlink, outlink->w, outlink->h);
- if (!out) {
- av_frame_free(&in);
- return AVERROR(ENOMEM);
+ if (av_frame_is_writable(in)) {
+ out = in;
+ } else {
+ out = ff_get_video_buffer(outlink, outlink->w, outlink->h);
+ if (!out) {
+ av_frame_free(&in);
+ return AVERROR(ENOMEM);
+ }
+ av_frame_copy_props(out, in);
}
- av_frame_copy_props(out, in);
for (int plane = 0; plane < s->nb_planes; plane++) {
if (!(s->planes & (1 << plane))) {
- av_image_copy_plane(out->data[plane], out->linesize[plane],
- in->data[plane], in->linesize[plane],
- s->planewidth[plane] * ((s->depth + 7) / 8), s->planeheight[plane]);
+ if (out != in)
+ av_image_copy_plane(out->data[plane], out->linesize[plane],
+ in->data[plane], in->linesize[plane],
+ s->planewidth[plane] * ((s->depth + 7) / 8), s->planeheight[plane]);
continue;
}
@@ -322,7 +327,8 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *in)
in->linesize[plane] / 2, out->linesize[plane] / 2);
}
- av_frame_free(&in);
+ if (out != in)
+ av_frame_free(&in);
return ff_filter_frame(outlink, out);
}