[FFmpeg-cvslog] avfilter/af_adynamicequalizer: factor detection filter code

Paul B Mahol git at videolan.org
Sat Apr 29 00:33:41 EEST 2023


ffmpeg | branch: master | Paul B Mahol <onemda at gmail.com> | Fri Apr 28 22:42:30 2023 +0200| [153aaae45778589dda6573ab45da718e20334d2d] | committer: Paul B Mahol

avfilter/af_adynamicequalizer: factor detection filter code

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

 libavfilter/af_adynamicequalizer.c | 79 ++++++++++++++++++++++----------------
 1 file changed, 46 insertions(+), 33 deletions(-)

diff --git a/libavfilter/af_adynamicequalizer.c b/libavfilter/af_adynamicequalizer.c
index 594eedb4e3..77c98ed105 100644
--- a/libavfilter/af_adynamicequalizer.c
+++ b/libavfilter/af_adynamicequalizer.c
@@ -44,6 +44,7 @@ typedef struct AudioDynamicEqualizerContext {
     int tftype;
     int dftype;
 
+    double da[3], dm[3];
     AVFrame *state;
 } AudioDynamicEqualizerContext;
 
@@ -65,7 +66,7 @@ static int config_input(AVFilterLink *inlink)
     return 0;
 }
 
-static double get_svf(double in, double *m, double *a, double *b)
+static double get_svf(double in, const double *m, const double *a, double *b)
 {
     const double v0 = in;
     const double v3 = v0 - b[1];
@@ -82,34 +83,25 @@ typedef struct ThreadData {
     AVFrame *in, *out;
 } ThreadData;
 
-static int filter_channels(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
+static double get_coef(double x, double sr)
+{
+    return exp(-1000. / (x * sr));
+}
+
+static int filter_prepare(AVFilterContext *ctx)
 {
     AudioDynamicEqualizerContext *s = ctx->priv;
-    ThreadData *td = arg;
-    AVFrame *in = td->in;
-    AVFrame *out = td->out;
-    const double sample_rate = in->sample_rate;
-    const double makeup = s->makeup;
-    const double ratio = s->ratio;
-    const double range = s->range;
+    const double sample_rate = ctx->inputs[0]->sample_rate;
     const double dfrequency = fmin(s->dfrequency, sample_rate * 0.5);
-    const double tfrequency = fmin(s->tfrequency, sample_rate * 0.5);
-    const double release = s->release_coef;
-    const double irelease = 1. - release;
-    const double attack = s->attack_coef;
-    const double iattack = 1. - attack;
-    const double dqfactor = s->dqfactor;
-    const double tqfactor = s->tqfactor;
-    const double fg = tan(M_PI * tfrequency / sample_rate);
     const double dg = tan(M_PI * dfrequency / 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 detection = s->detection;
-    const int direction = s->direction;
+    const double dqfactor = s->dqfactor;
     const int dftype = s->dftype;
-    const int tftype = s->tftype;
-    const int mode = s->mode;
-    double k, da[3], dm[3];
+    double *da = s->da;
+    double *dm = s->dm;
+    double k;
+
+    s->attack_coef = get_coef(s->attack, sample_rate);
+    s->release_coef = get_coef(s->release, sample_rate);
 
     switch (dftype) {
     case 0:
@@ -158,6 +150,35 @@ static int filter_channels(AVFilterContext *ctx, void *arg, int jobnr, int nb_jo
         break;
     }
 
+    return 0;
+}
+
+static int filter_channels(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
+{
+    AudioDynamicEqualizerContext *s = ctx->priv;
+    ThreadData *td = arg;
+    AVFrame *in = td->in;
+    AVFrame *out = td->out;
+    const double sample_rate = in->sample_rate;
+    const double makeup = s->makeup;
+    const double ratio = s->ratio;
+    const double range = s->range;
+    const double tfrequency = fmin(s->tfrequency, sample_rate * 0.5);
+    const double release = s->release_coef;
+    const double irelease = 1. - release;
+    const double attack = s->attack_coef;
+    const double iattack = 1. - attack;
+    const double tqfactor = s->tqfactor;
+    const double 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 detection = s->detection;
+    const int direction = s->direction;
+    const int tftype = s->tftype;
+    const int mode = s->mode;
+    const double *da = s->da;
+    const double *dm = s->dm;
+
     for (int ch = start; ch < end; ch++) {
         const double *src = (const double *)in->extended_data[ch];
         double *dst = (double *)out->extended_data[ch];
@@ -254,16 +275,10 @@ static int filter_channels(AVFilterContext *ctx, void *arg, int jobnr, int nb_jo
     return 0;
 }
 
-static double get_coef(double x, double sr)
-{
-    return exp(-1000. / (x * sr));
-}
-
 static int filter_frame(AVFilterLink *inlink, AVFrame *in)
 {
     AVFilterContext *ctx = inlink->dst;
     AVFilterLink *outlink = ctx->outputs[0];
-    AudioDynamicEqualizerContext *s = ctx->priv;
     ThreadData td;
     AVFrame *out;
 
@@ -278,11 +293,9 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *in)
         av_frame_copy_props(out, in);
     }
 
-    s->attack_coef = get_coef(s->attack, in->sample_rate);
-    s->release_coef = get_coef(s->release, in->sample_rate);
-
     td.in = in;
     td.out = out;
+    filter_prepare(ctx);
     ff_filter_execute(ctx, filter_channels, &td, NULL,
                      FFMIN(outlink->ch_layout.nb_channels, ff_filter_get_nb_threads(ctx)));
 



More information about the ffmpeg-cvslog mailing list