[FFmpeg-cvslog] avfilter/af_adynamicequalizer: do detection of threshold first

Paul B Mahol git at videolan.org
Sun Nov 5 16:53:31 EET 2023


ffmpeg | branch: master | Paul B Mahol <onemda at gmail.com> | Sun Nov  5 15:52:46 2023 +0100| [44a0148fadc97798acf6c93016a14e7c956f0825] | committer: Paul B Mahol

avfilter/af_adynamicequalizer: do detection of threshold first

Makes better results in final output if multiple filters are cascaded at once.

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

 libavfilter/adynamicequalizer_template.c | 29 +++++++++++++++++++++--------
 libavfilter/af_adynamicequalizer.c       |  2 ++
 2 files changed, 23 insertions(+), 8 deletions(-)

diff --git a/libavfilter/adynamicequalizer_template.c b/libavfilter/adynamicequalizer_template.c
index d77570da83..c5830db215 100644
--- a/libavfilter/adynamicequalizer_template.c
+++ b/libavfilter/adynamicequalizer_template.c
@@ -158,25 +158,41 @@ static int fn(filter_channels)(AVFilterContext *ctx, void *arg, int jobnr, int n
     const ftype fg = TAN(M_PI * tfrequency / sample_rate);
     const int start = (in->ch_layout.nb_channels * jobnr) / nb_jobs;
     const int end = (in->ch_layout.nb_channels * (jobnr+1)) / nb_jobs;
+    const int is_disabled = ctx->is_disabled;
     const int detection = s->detection;
     const int tftype = s->tftype;
     const ftype *da = fn(s->da);
     const ftype *dm = fn(s->dm);
 
+    if (detection > 0) {
+        for (int ch = start; ch < end; ch++) {
+            const ftype *src = (const ftype *)in->extended_data[ch];
+            ChannelContext *cc = &s->cc[ch];
+            ftype *tstate = fn(cc->tstate);
+
+            for (int n = 0; n < in->nb_samples; n++) {
+                ftype detect = fn(get_svf)(src[n], dm, da, tstate);
+                fn(cc->threshold) = FMAX(fn(cc->threshold), detect);
+            }
+        }
+    } else if (detection < 0) {
+        for (int ch = start; ch < end; ch++) {
+            ChannelContext *cc = &s->cc[ch];
+            fn(cc->threshold) = s->threshold;
+        }
+    }
+
     for (int ch = start; ch < end; ch++) {
         const ftype *src = (const ftype *)in->extended_data[ch];
         ftype *dst = (ftype *)out->extended_data[ch];
         ChannelContext *cc = &s->cc[ch];
-        const ftype threshold = detection == 0 ? fn(cc->threshold) : s->threshold;
+        const ftype threshold = fn(cc->threshold);
         ftype *fa = fn(cc->fa), *fm = fn(cc->fm);
         ftype *fstate = fn(cc->fstate);
         ftype *dstate = fn(cc->dstate);
         ftype gain = fn(cc->gain);
         const int init = cc->init;
 
-        if (detection < 0)
-            fn(cc->threshold) = threshold;
-
         for (int n = 0; n < out->nb_samples; n++) {
             ftype detect, v, listen, new_gain = ONE;
             ftype k, g;
@@ -184,9 +200,6 @@ static int fn(filter_channels)(AVFilterContext *ctx, void *arg, int jobnr, int n
             detect = listen = fn(get_svf)(src[n], dm, da, dstate);
             detect = FABS(detect);
 
-            if (detection > 0)
-                fn(cc->threshold) = FMAX(fn(cc->threshold), detect);
-
             switch (mode) {
             case LISTEN:
                 break;
@@ -258,7 +271,7 @@ static int fn(filter_channels)(AVFilterContext *ctx, void *arg, int jobnr, int n
 
             v = fn(get_svf)(src[n], fm, fa, fstate);
             v = mode == -1 ? listen : v;
-            dst[n] = ctx->is_disabled ? src[n] : v;
+            dst[n] = is_disabled ? src[n] : v;
         }
 
         fn(cc->gain) = gain;
diff --git a/libavfilter/af_adynamicequalizer.c b/libavfilter/af_adynamicequalizer.c
index 9bdd56f7a5..ae51bdd075 100644
--- a/libavfilter/af_adynamicequalizer.c
+++ b/libavfilter/af_adynamicequalizer.c
@@ -36,11 +36,13 @@ typedef struct ChannelContext {
     double fa_double[3], fm_double[3];
     double dstate_double[2];
     double fstate_double[2];
+    double tstate_double[2];
     double gain_double;
     double threshold_double;
     float fa_float[3], fm_float[3];
     float dstate_float[2];
     float fstate_float[2];
+    float tstate_float[2];
     float gain_float;
     float threshold_float;
     int init;



More information about the ffmpeg-cvslog mailing list