[FFmpeg-cvslog] avfilter/af_afftdn: add support for writable input frames

Paul B Mahol git at videolan.org
Sun Feb 27 13:03:28 EET 2022


ffmpeg | branch: master | Paul B Mahol <onemda at gmail.com> | Sun Feb 27 11:49:34 2022 +0100| [2cb482aa7491f15fe8e62c9f366cb25b6ce7db17] | committer: Paul B Mahol

avfilter/af_afftdn: add support for writable input frames

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=2cb482aa7491f15fe8e62c9f366cb25b6ce7db17
---

 libavfilter/af_afftdn.c | 34 +++++++++++++++++-----------------
 1 file changed, 17 insertions(+), 17 deletions(-)

diff --git a/libavfilter/af_afftdn.c b/libavfilter/af_afftdn.c
index 403464baee..d7db625c35 100644
--- a/libavfilter/af_afftdn.c
+++ b/libavfilter/af_afftdn.c
@@ -1164,9 +1164,8 @@ static int output_frame(AVFilterLink *inlink, AVFrame *in)
     AudioFFTDeNoiseContext *s = ctx->priv;
     const int output_mode = ctx->is_disabled ? IN_MODE : s->output_mode;
     const int offset = s->window_length - s->sample_advance;
-    AVFrame *out = NULL;
+    AVFrame *out;
     ThreadData td;
-    int ret = 0;
 
     for (int ch = 0; ch < s->channels; ch++) {
         float *src = (float *)s->winframe->extended_data[ch];
@@ -1225,10 +1224,16 @@ static int output_frame(AVFilterLink *inlink, AVFrame *in)
     ff_filter_execute(ctx, filter_channel, &td, NULL,
                       FFMIN(outlink->channels, ff_filter_get_nb_threads(ctx)));
 
-    out = ff_get_audio_buffer(outlink, in->nb_samples);
-    if (!out) {
-        ret = AVERROR(ENOMEM);
-        goto end;
+    if (av_frame_is_writable(in)) {
+        out = in;
+    } else {
+        out = ff_get_audio_buffer(outlink, in->nb_samples);
+        if (!out) {
+            av_frame_free(&in);
+            return AVERROR(ENOMEM);
+        }
+
+        out->pts = in->pts;
     }
 
     for (int ch = 0; ch < inlink->channels; ch++) {
@@ -1251,23 +1256,18 @@ static int output_frame(AVFilterLink *inlink, AVFrame *in)
                 dst[m] = orig[m] - src[m];
             break;
         default:
+            if (in != out)
+                av_frame_free(&in);
             av_frame_free(&out);
-            ret = AVERROR_BUG;
-            goto end;
+            return AVERROR_BUG;
         }
         memmove(src, src + s->sample_advance, (s->window_length - s->sample_advance) * sizeof(*src));
         memset(src + (s->window_length - s->sample_advance), 0, s->sample_advance * sizeof(*src));
     }
 
-    out->pts = in->pts;
-
-    ret = ff_filter_frame(outlink, out);
-    if (ret < 0)
-        goto end;
-end:
-    av_frame_free(&in);
-
-    return ret;
+    if (out != in)
+        av_frame_free(&in);
+    return ff_filter_frame(outlink, out);
 }
 
 static int activate(AVFilterContext *ctx)



More information about the ffmpeg-cvslog mailing list