[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