summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--doc/filters.texi19
-rw-r--r--libavfilter/af_adynamicequalizer.c62
2 files changed, 67 insertions, 14 deletions
diff --git a/doc/filters.texi b/doc/filters.texi
index 01a71223a1..50e1682144 100644
--- a/doc/filters.texi
+++ b/doc/filters.texi
@@ -1007,15 +1007,15 @@ A description of the accepted options follows.
@table @option
@item threshold
Set the detection threshold used to trigger equalization.
-Threshold detection is using bandpass filter.
+Threshold detection is using detection filter.
Default value is 0. Allowed range is from 0 to 100.
@item dfrequency
-Set the detection frequency in Hz used for bandpass filter used to trigger equalization.
+Set the detection frequency in Hz used for detection filter used to trigger equalization.
Default value is 1000 Hz. Allowed range is between 2 and 1000000 Hz.
@item dqfactor
-Set the detection resonance factor for bandpass filter used to trigger equalization.
+Set the detection resonance factor for detection filter used to trigger equalization.
Default value is 1. Allowed range is from 0.001 to 1000.
@item tfrequency
@@ -1053,7 +1053,7 @@ Set the mode of filter operation, can be one of the following:
@table @samp
@item listen
-Output only isolated bandpass signal.
+Output only isolated detection signal.
@item cut
Cut frequencies above detection threshold.
@item boost
@@ -1061,6 +1061,17 @@ Boost frequencies bellow detection threshold.
@end table
Default mode is @samp{cut}.
+@item dftype
+Set the type of detection filter, can be one of the following:
+
+@table @samp
+@item bandpass
+@item lowpass
+@item highpass
+@item peak
+@end table
+Default type is @samp{bandpass}.
+
@item tftype
Set the type of target filter, can be one of the following:
diff --git a/libavfilter/af_adynamicequalizer.c b/libavfilter/af_adynamicequalizer.c
index 0e44922c1e..594eedb4e3 100644
--- a/libavfilter/af_adynamicequalizer.c
+++ b/libavfilter/af_adynamicequalizer.c
@@ -41,7 +41,8 @@ typedef struct AudioDynamicEqualizerContext {
int mode;
int direction;
int detection;
- int type;
+ int tftype;
+ int dftype;
AVFrame *state;
} AudioDynamicEqualizerContext;
@@ -105,12 +106,14 @@ static int filter_channels(AVFilterContext *ctx, void *arg, int jobnr, int nb_jo
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 tftype = s->tftype;
const int mode = s->mode;
- const int type = s->type;
- double da[3], dm[3];
+ double k, da[3], dm[3];
- {
- double k = 1. / dqfactor;
+ switch (dftype) {
+ case 0:
+ k = 1. / dqfactor;
da[0] = 1. / (1. + dg * (dg + k));
da[1] = dg * da[0];
@@ -119,6 +122,40 @@ static int filter_channels(AVFilterContext *ctx, void *arg, int jobnr, int nb_jo
dm[0] = 0.;
dm[1] = k;
dm[2] = 0.;
+ break;
+ case 1:
+ k = 1. / dqfactor;
+
+ da[0] = 1. / (1. + dg * (dg + k));
+ da[1] = dg * da[0];
+ da[2] = dg * da[1];
+
+ dm[0] = 0.;
+ dm[1] = 0.;
+ dm[2] = 1.;
+ break;
+ case 2:
+ k = 1. / dqfactor;
+
+ da[0] = 1. / (1. + dg * (dg + k));
+ da[1] = dg * da[0];
+ da[2] = dg * da[1];
+
+ dm[0] = 0.;
+ dm[1] = -k;
+ dm[2] = -1.;
+ break;
+ case 3:
+ k = 1. / dqfactor;
+
+ da[0] = 1. / (1. + dg * (dg + k));
+ da[1] = dg * da[0];
+ da[2] = dg * da[1];
+
+ dm[0] = 0.;
+ dm[1] = -k;
+ dm[2] = -2.;
+ break;
}
for (int ch = start; ch < end; ch++) {
@@ -169,7 +206,7 @@ static int filter_channels(AVFilterContext *ctx, void *arg, int jobnr, int nb_jo
if (state[4] != detect || n == 0) {
state[4] = gain = detect;
- switch (type) {
+ switch (tftype) {
case 0:
k = 1. / (tqfactor * gain);
@@ -279,10 +316,15 @@ static const AVOption adynamicequalizer_options[] = {
{ "listen", 0, 0, AV_OPT_TYPE_CONST, {.i64=-1}, 0, 0, FLAGS, "mode" },
{ "cut", 0, 0, AV_OPT_TYPE_CONST, {.i64=0}, 0, 0, FLAGS, "mode" },
{ "boost", 0, 0, AV_OPT_TYPE_CONST, {.i64=1}, 0, 0, FLAGS, "mode" },
- { "tftype", "set target filter type", OFFSET(type), AV_OPT_TYPE_INT, {.i64=0}, 0, 2, FLAGS, "type" },
- { "bell", 0, 0, AV_OPT_TYPE_CONST, {.i64=0}, 0, 0, FLAGS, "type" },
- { "lowshelf", 0, 0, AV_OPT_TYPE_CONST, {.i64=1}, 0, 0, FLAGS, "type" },
- { "highshelf",0, 0, AV_OPT_TYPE_CONST, {.i64=2}, 0, 0, FLAGS, "type" },
+ { "dftype", "set detection filter type",OFFSET(dftype), AV_OPT_TYPE_INT, {.i64=0}, 0, 3, FLAGS, "dftype" },
+ { "bandpass", 0, 0, AV_OPT_TYPE_CONST, {.i64=0}, 0, 0, FLAGS, "dftype" },
+ { "lowpass", 0, 0, AV_OPT_TYPE_CONST, {.i64=1}, 0, 0, FLAGS, "dftype" },
+ { "highpass", 0, 0, AV_OPT_TYPE_CONST, {.i64=2}, 0, 0, FLAGS, "dftype" },
+ { "peak", 0, 0, AV_OPT_TYPE_CONST, {.i64=3}, 0, 0, FLAGS, "dftype" },
+ { "tftype", "set target filter type", OFFSET(tftype), AV_OPT_TYPE_INT, {.i64=0}, 0, 2, FLAGS, "tftype" },
+ { "bell", 0, 0, AV_OPT_TYPE_CONST, {.i64=0}, 0, 0, FLAGS, "tftype" },
+ { "lowshelf", 0, 0, AV_OPT_TYPE_CONST, {.i64=1}, 0, 0, FLAGS, "tftype" },
+ { "highshelf",0, 0, AV_OPT_TYPE_CONST, {.i64=2}, 0, 0, FLAGS, "tftype" },
{ "direction", "set direction", OFFSET(direction), AV_OPT_TYPE_INT, {.i64=0}, 0, 1, FLAGS, "direction" },
{ "downward", 0, 0, AV_OPT_TYPE_CONST, {.i64=0}, 0, 0, FLAGS, "direction" },
{ "upward", 0, 0, AV_OPT_TYPE_CONST, {.i64=1}, 0, 0, FLAGS, "direction" },