Commit 35d60018 authored by Paul B Mahol's avatar Paul B Mahol

avfilter/af_crossfeed: make slope configurable

parent 0ec61fcf
...@@ -3267,6 +3267,10 @@ Set soundstage wideness. Default is 0.5. Allowed range is from 0 to 1. ...@@ -3267,6 +3267,10 @@ Set soundstage wideness. Default is 0.5. Allowed range is from 0 to 1.
This sets cut off frequency of low shelf filter. Default is cut off near This sets cut off frequency of low shelf filter. Default is cut off near
1550 Hz. With range set to 1 cut off frequency is set to 2100 Hz. 1550 Hz. With range set to 1 cut off frequency is set to 2100 Hz.
@item slope
Set curve slope of low shelf filter. Default is 0.5.
Allowed range is from 0.01 to 1.
@item level_in @item level_in
Set input gain. Default is 0.9. Set input gain. Default is 0.9.
......
...@@ -28,6 +28,7 @@ typedef struct CrossfeedContext { ...@@ -28,6 +28,7 @@ typedef struct CrossfeedContext {
double range; double range;
double strength; double strength;
double slope;
double level_in; double level_in;
double level_out; double level_out;
...@@ -62,7 +63,7 @@ static int config_input(AVFilterLink *inlink) ...@@ -62,7 +63,7 @@ static int config_input(AVFilterLink *inlink)
double w0 = 2 * M_PI * (1. - s->range) * 2100 / inlink->sample_rate; double w0 = 2 * M_PI * (1. - s->range) * 2100 / inlink->sample_rate;
double alpha; double alpha;
alpha = sin(w0) / 2 * sqrt((A + 1 / A) * (1 / 0.5 - 1) + 2); alpha = sin(w0) / 2 * sqrt((A + 1 / A) * (1 / s->slope - 1) + 2);
s->a0 = (A + 1) + (A - 1) * cos(w0) + 2 * sqrt(A) * alpha; s->a0 = (A + 1) + (A - 1) * cos(w0) + 2 * sqrt(A) * alpha;
s->a1 = -2 * ((A - 1) + (A + 1) * cos(w0)); s->a1 = -2 * ((A - 1) + (A + 1) * cos(w0));
...@@ -139,6 +140,7 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *in) ...@@ -139,6 +140,7 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *in)
static const AVOption crossfeed_options[] = { static const AVOption crossfeed_options[] = {
{ "strength", "set crossfeed strength", OFFSET(strength), AV_OPT_TYPE_DOUBLE, {.dbl=.2}, 0, 1, FLAGS }, { "strength", "set crossfeed strength", OFFSET(strength), AV_OPT_TYPE_DOUBLE, {.dbl=.2}, 0, 1, FLAGS },
{ "range", "set soundstage wideness", OFFSET(range), AV_OPT_TYPE_DOUBLE, {.dbl=.5}, 0, 1, FLAGS }, { "range", "set soundstage wideness", OFFSET(range), AV_OPT_TYPE_DOUBLE, {.dbl=.5}, 0, 1, FLAGS },
{ "slope", "set curve slope", OFFSET(slope), AV_OPT_TYPE_DOUBLE, {.dbl=.5}, .01, 1, FLAGS },
{ "level_in", "set level in", OFFSET(level_in), AV_OPT_TYPE_DOUBLE, {.dbl=.9}, 0, 1, FLAGS }, { "level_in", "set level in", OFFSET(level_in), AV_OPT_TYPE_DOUBLE, {.dbl=.9}, 0, 1, FLAGS },
{ "level_out", "set level out", OFFSET(level_out), AV_OPT_TYPE_DOUBLE, {.dbl=1.}, 0, 1, FLAGS }, { "level_out", "set level out", OFFSET(level_out), AV_OPT_TYPE_DOUBLE, {.dbl=1.}, 0, 1, FLAGS },
{ NULL } { NULL }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment