summaryrefslogtreecommitdiff
path: root/libavfilter/af_biquads.c
diff options
context:
space:
mode:
authorPaul B Mahol <onemda@gmail.com>2020-11-02 13:24:32 +0100
committerPaul B Mahol <onemda@gmail.com>2020-11-02 13:30:14 +0100
commit2ddd6afd30601f04becb3deab67467caebfad1a9 (patch)
tree25fc66a9b29106e09de738df6522df1c19e820ff /libavfilter/af_biquads.c
parent40ce4ad999e746aacab70c3733df65d2b0e269ad (diff)
downloadffmpeg-2ddd6afd30601f04becb3deab67467caebfad1a9.tar.gz
avfilter/af_biquads: make commands work reliably within biquad filter
Previously changing single coefficient would give unexpected results.
Diffstat (limited to 'libavfilter/af_biquads.c')
-rw-r--r--libavfilter/af_biquads.c21
1 files changed, 15 insertions, 6 deletions
diff --git a/libavfilter/af_biquads.c b/libavfilter/af_biquads.c
index 230266434d..6a81908ff3 100644
--- a/libavfilter/af_biquads.c
+++ b/libavfilter/af_biquads.c
@@ -127,6 +127,9 @@ typedef struct BiquadsContext {
double a0, a1, a2;
double b0, b1, b2;
+ double oa0, oa1, oa2;
+ double ob0, ob1, ob2;
+
ChanCache *cache;
int block_align;
@@ -480,6 +483,12 @@ static int config_filter(AVFilterLink *outlink, int reset)
switch (s->filter_type) {
case biquad:
+ s->a0 = s->oa0;
+ s->a1 = s->oa1;
+ s->a2 = s->oa2;
+ s->b0 = s->ob0;
+ s->b1 = s->ob1;
+ s->b2 = s->ob2;
break;
case equalizer:
s->a0 = 1 + alpha / A;
@@ -1154,12 +1163,12 @@ DEFINE_BIQUAD_FILTER(highshelf, "Apply a high shelf filter.");
#endif /* CONFIG_HIGHSHELF_FILTER */
#if CONFIG_BIQUAD_FILTER
static const AVOption biquad_options[] = {
- {"a0", NULL, OFFSET(a0), AV_OPT_TYPE_DOUBLE, {.dbl=1}, INT32_MIN, INT32_MAX, FLAGS},
- {"a1", NULL, OFFSET(a1), AV_OPT_TYPE_DOUBLE, {.dbl=0}, INT32_MIN, INT32_MAX, FLAGS},
- {"a2", NULL, OFFSET(a2), AV_OPT_TYPE_DOUBLE, {.dbl=0}, INT32_MIN, INT32_MAX, FLAGS},
- {"b0", NULL, OFFSET(b0), AV_OPT_TYPE_DOUBLE, {.dbl=0}, INT32_MIN, INT32_MAX, FLAGS},
- {"b1", NULL, OFFSET(b1), AV_OPT_TYPE_DOUBLE, {.dbl=0}, INT32_MIN, INT32_MAX, FLAGS},
- {"b2", NULL, OFFSET(b2), AV_OPT_TYPE_DOUBLE, {.dbl=0}, INT32_MIN, INT32_MAX, FLAGS},
+ {"a0", NULL, OFFSET(oa0), AV_OPT_TYPE_DOUBLE, {.dbl=1}, INT32_MIN, INT32_MAX, FLAGS},
+ {"a1", NULL, OFFSET(oa1), AV_OPT_TYPE_DOUBLE, {.dbl=0}, INT32_MIN, INT32_MAX, FLAGS},
+ {"a2", NULL, OFFSET(oa2), AV_OPT_TYPE_DOUBLE, {.dbl=0}, INT32_MIN, INT32_MAX, FLAGS},
+ {"b0", NULL, OFFSET(ob0), AV_OPT_TYPE_DOUBLE, {.dbl=0}, INT32_MIN, INT32_MAX, FLAGS},
+ {"b1", NULL, OFFSET(ob1), AV_OPT_TYPE_DOUBLE, {.dbl=0}, INT32_MIN, INT32_MAX, FLAGS},
+ {"b2", NULL, OFFSET(ob2), AV_OPT_TYPE_DOUBLE, {.dbl=0}, INT32_MIN, INT32_MAX, FLAGS},
{"mix", "set mix", OFFSET(mix), AV_OPT_TYPE_DOUBLE, {.dbl=1}, 0, 1, FLAGS},
{"m", "set mix", OFFSET(mix), AV_OPT_TYPE_DOUBLE, {.dbl=1}, 0, 1, FLAGS},
{"channels", "set channels to filter", OFFSET(channels), AV_OPT_TYPE_CHANNEL_LAYOUT, {.i64=-1}, INT64_MIN, INT64_MAX, FLAGS},