From aa4acc111e6ea1117dfec230435fdb26ec7631d9 Mon Sep 17 00:00:00 2001 From: Paul B Mahol Date: Sun, 28 May 2023 14:35:46 +0200 Subject: [PATCH] avfilter/af_silenceremove: use separate variable for size of cache --- libavfilter/af_silenceremove.c | 17 +++++++++++++++-- libavfilter/silenceremove_template.c | 8 +++++--- 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/libavfilter/af_silenceremove.c b/libavfilter/af_silenceremove.c index 6f152146de..c7975a9365 100644 --- a/libavfilter/af_silenceremove.c +++ b/libavfilter/af_silenceremove.c @@ -94,6 +94,7 @@ typedef struct SilenceRemoveContext { int *stop_back; int64_t window_duration; + int cache_size; int start_window_pos; int start_window_size; @@ -224,10 +225,22 @@ static int config_output(AVFilterLink *outlink) AVFilterContext *ctx = outlink->src; SilenceRemoveContext *s = ctx->priv; + switch (s->detection) { + case D_AVG: + case D_RMS: + s->cache_size = 1; + break; + case D_MEDIAN: + case D_PEAK: + case D_PTP: + s->cache_size = s->window_duration; + break; + } + s->start_window = ff_get_audio_buffer(outlink, s->window_duration); s->stop_window = ff_get_audio_buffer(outlink, s->window_duration); - s->start_cache = av_calloc(outlink->ch_layout.nb_channels, s->window_duration * sizeof(*s->start_cache)); - s->stop_cache = av_calloc(outlink->ch_layout.nb_channels, s->window_duration * sizeof(*s->stop_cache)); + s->start_cache = av_calloc(outlink->ch_layout.nb_channels, s->cache_size * sizeof(*s->start_cache)); + s->stop_cache = av_calloc(outlink->ch_layout.nb_channels, s->cache_size * sizeof(*s->stop_cache)); if (!s->start_window || !s->stop_window || !s->start_cache || !s->stop_cache) return AVERROR(ENOMEM); diff --git a/libavfilter/silenceremove_template.c b/libavfilter/silenceremove_template.c index aaaba04f69..8536d5e723 100644 --- a/libavfilter/silenceremove_template.c +++ b/libavfilter/silenceremove_template.c @@ -328,6 +328,7 @@ static void fn(filter_start)(AVFilterContext *ctx, ftype *start_cache = (ftype *)s->start_cache; const int start_silence = s->start_silence; int window_size = start_window_nb_samples; + const int cache_size = s->cache_size; int *front = s->start_front; int *back = s->start_back; @@ -352,7 +353,7 @@ static void fn(filter_start)(AVFilterContext *ctx, ftype start_ow = startw[start_wpos + ch]; ftype tstart; - tstart = fn(s->compute)(start_cache + ch * start_window_nb_samples, + tstart = fn(s->compute)(start_cache + ch * cache_size, start_sample, start_ow, window_size, @@ -423,8 +424,9 @@ static void fn(filter_stop)(AVFilterContext *ctx, const int stop_duration = s->stop_duration; ftype *stop_cache = (ftype *)s->stop_cache; const int stop_silence = s->stop_silence; - const int restart = s->restart; int window_size = stop_window_nb_samples; + const int cache_size = s->cache_size; + const int restart = s->restart; int *front = s->stop_front; int *back = s->stop_back; @@ -446,7 +448,7 @@ static void fn(filter_stop)(AVFilterContext *ctx, ftype stop_ow = stopw[stop_wpos + ch]; ftype tstop; - tstop = fn(s->compute)(stop_cache + ch * stop_window_nb_samples, + tstop = fn(s->compute)(stop_cache + ch * cache_size, stop_sample, stop_ow, window_size,