avfilter/af_adynamicequalizer: factor detection filter code

pull/389/head
Paul B Mahol 2 years ago
parent 51504cf279
commit 153aaae457
  1. 79
      libavfilter/af_adynamicequalizer.c

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

Loading…
Cancel
Save