[FFmpeg-cvslog] avfilter/adynamicequalizer_template: refactor and improve output

Paul B Mahol git at videolan.org
Wed Jul 5 02:49:29 EEST 2023


ffmpeg | branch: master | Paul B Mahol <onemda at gmail.com> | Wed Jul  5 01:11:22 2023 +0200| [8622dcb39b6554dfcb54c2c95c8dcca96b46d60b] | committer: Paul B Mahol

avfilter/adynamicequalizer_template: refactor and improve output

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

 libavfilter/adynamicequalizer_template.c | 46 +++++++++++++-------------------
 libavfilter/af_adynamicequalizer.c       | 12 +--------
 2 files changed, 20 insertions(+), 38 deletions(-)

diff --git a/libavfilter/adynamicequalizer_template.c b/libavfilter/adynamicequalizer_template.c
index a6b35aa93e..4f7d58c939 100644
--- a/libavfilter/adynamicequalizer_template.c
+++ b/libavfilter/adynamicequalizer_template.c
@@ -167,13 +167,16 @@ static int fn(filter_channels)(AVFilterContext *ctx, void *arg, int jobnr, int n
         ftype *dst = (ftype *)out->extended_data[ch];
         ftype *state = (ftype *)s->state->extended_data[ch];
         const ftype threshold = detection == 0 ? state[5] : s->threshold;
+        ftype fa[3], fm[3];
 
         if (detection < 0)
             state[5] = threshold;
 
+        memcpy(fa, state +  8, sizeof(fa));
+        memcpy(fm, state + 11, sizeof(fm));
+
         for (int n = 0; n < out->nb_samples; n++) {
             ftype detect, gain, v, listen;
-            ftype fa[3], fm[3];
             ftype k, g;
 
             detect = listen = fn(get_svf)(src[n], dm, da, state);
@@ -182,46 +185,32 @@ static int fn(filter_channels)(AVFilterContext *ctx, void *arg, int jobnr, int n
             if (detection > 0)
                 state[5] = FMAX(state[5], detect);
 
-            if (direction == 0) {
-                if (detect < threshold) {
-                    if (mode == 0)
-                        detect = ONE / CLIP(ONE + makeup + (threshold - detect) * ratio, ONE, range);
-                    else
-                        detect = CLIP(ONE + makeup + (threshold - detect) * ratio, ONE, range);
+            if (mode >= 0) {
+                if (direction == 0 && detect < threshold) {
+                    detect = CLIP(ONE + makeup + (threshold - detect) * ratio, ONE, range);
+                    if (!mode)
+                        detect = ONE / detect;
+                } else if (direction == 1 && detect > threshold) {
+                    detect = CLIP(ONE + makeup + (detect - threshold) * ratio, ONE, range);
+                    if (!mode)
+                        detect = ONE / detect;
                 } else {
                     detect = ONE;
                 }
-            } else {
-                if (detect > threshold) {
-                    if (mode == 0)
-                        detect = ONE / CLIP(ONE + makeup + (detect - threshold) * ratio, ONE, range);
-                    else
-                        detect = CLIP(ONE + makeup + (detect - threshold) * ratio, ONE, range);
-                } else {
-                    detect = ONE;
-                }
-            }
 
-            if (direction == 0) {
-                if (detect > state[4]) {
-                    detect = iattack * detect + attack * state[4];
-                } else {
-                    detect = irelease * detect + release * state[4];
-                }
-            } else {
-                if (detect < state[4]) {
+                if ((direction == 0 && detect > state[4]) || (direction == 1 && detect < state[4])) {
                     detect = iattack * detect + attack * state[4];
                 } else {
                     detect = irelease * detect + release * state[4];
                 }
             }
 
-            if (state[4] != detect || n == 0) {
+            if (state[4] != detect) {
                 state[4] = gain = detect;
 
                 switch (tftype) {
                 case 0:
-                    k = ONE / (tqfactor * gain);
+                    k = itqfactor / gain;
 
                     fa[0] = ONE / (ONE + fg * (fg + k));
                     fa[1] = fg * fa[0];
@@ -262,6 +251,9 @@ static int fn(filter_channels)(AVFilterContext *ctx, void *arg, int jobnr, int n
             v = mode == -1 ? listen : v;
             dst[n] = ctx->is_disabled ? src[n] : v;
         }
+
+        memcpy(state +  8, fa, sizeof(fa));
+        memcpy(state + 11, fm, sizeof(fm));
     }
 
     return 0;
diff --git a/libavfilter/af_adynamicequalizer.c b/libavfilter/af_adynamicequalizer.c
index a3aeee91c5..5a2c8efb2a 100644
--- a/libavfilter/af_adynamicequalizer.c
+++ b/libavfilter/af_adynamicequalizer.c
@@ -96,26 +96,16 @@ static int config_input(AVFilterLink *inlink)
     AudioDynamicEqualizerContext *s = ctx->priv;
 
     s->format = inlink->format;
-    s->state = ff_get_audio_buffer(inlink, 8);
+    s->state = ff_get_audio_buffer(inlink, 16);
     if (!s->state)
         return AVERROR(ENOMEM);
 
     switch (s->format) {
     case AV_SAMPLE_FMT_DBLP:
-        for (int ch = 0; ch < inlink->ch_layout.nb_channels; ch++) {
-            double *state = (double *)s->state->extended_data[ch];
-
-            state[4] = 1.;
-        }
         s->filter_prepare  = filter_prepare_double;
         s->filter_channels = filter_channels_double;
         break;
     case AV_SAMPLE_FMT_FLTP:
-        for (int ch = 0; ch < inlink->ch_layout.nb_channels; ch++) {
-            float *state = (float *)s->state->extended_data[ch];
-
-            state[4] = 1.;
-        }
         s->filter_prepare  = filter_prepare_float;
         s->filter_channels = filter_channels_float;
         break;



More information about the ffmpeg-cvslog mailing list