diff options
author | Paul B Mahol <onemda@gmail.com> | 2021-10-22 09:34:51 +0200 |
---|---|---|
committer | Paul B Mahol <onemda@gmail.com> | 2021-10-22 09:36:54 +0200 |
commit | 444cf3fca8dab2da9b95cc36920667f76d0f796c (patch) | |
tree | f51b9716f3f53b7d9df3beae97c20e91dfa66b4b /libavfilter/vf_bilateral.c | |
parent | cf0881bcfc88b4afb62a4647b0e09809e9612a5b (diff) | |
download | ffmpeg-444cf3fca8dab2da9b95cc36920667f76d0f796c.tar.gz |
avfilter/vf_bilateral: add direct aka writable frame support
Diffstat (limited to 'libavfilter/vf_bilateral.c')
-rw-r--r-- | libavfilter/vf_bilateral.c | 24 |
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); } |