Commit 2a801e88 authored by Paul B Mahol's avatar Paul B Mahol

avfilter/af_aiir: implement mix option

parent 034a9d25
...@@ -1409,6 +1409,10 @@ single-precision floating-point ...@@ -1409,6 +1409,10 @@ single-precision floating-point
16-bit integers 16-bit integers
@end table @end table
@item mix
How much to use filtered signal in output. Default is 1.
Range is between 0 and 1.
@item response @item response
Show IR frequency response, magnitude and phase in additional video stream. Show IR frequency response, magnitude and phase in additional video stream.
By default it is disabled. By default it is disabled.
......
...@@ -57,6 +57,7 @@ typedef struct AudioIIRContext { ...@@ -57,6 +57,7 @@ typedef struct AudioIIRContext {
const AVClass *class; const AVClass *class;
char *a_str, *b_str, *g_str; char *a_str, *b_str, *g_str;
double dry_gain, wet_gain; double dry_gain, wet_gain;
double mix;
int format; int format;
int process; int process;
int precision; int precision;
...@@ -124,6 +125,7 @@ static int iir_ch_## name(AVFilterContext *ctx, void *arg, int ch, int nb_jobs) ...@@ -124,6 +125,7 @@ static int iir_ch_## name(AVFilterContext *ctx, void *arg, int ch, int nb_jobs)
AudioIIRContext *s = ctx->priv; \ AudioIIRContext *s = ctx->priv; \
const double ig = s->dry_gain; \ const double ig = s->dry_gain; \
const double og = s->wet_gain; \ const double og = s->wet_gain; \
const double mix = s->mix; \
ThreadData *td = arg; \ ThreadData *td = arg; \
AVFrame *in = td->in, *out = td->out; \ AVFrame *in = td->in, *out = td->out; \
const type *src = (const type *)in->extended_data[ch]; \ const type *src = (const type *)in->extended_data[ch]; \
...@@ -152,6 +154,7 @@ static int iir_ch_## name(AVFilterContext *ctx, void *arg, int ch, int nb_jobs) ...@@ -152,6 +154,7 @@ static int iir_ch_## name(AVFilterContext *ctx, void *arg, int ch, int nb_jobs)
\ \
oc[0] = sample; \ oc[0] = sample; \
sample *= og; \ sample *= og; \
sample = sample * mix + ic[0] * (1. - mix); \
if (need_clipping && sample < min) { \ if (need_clipping && sample < min) { \
(*clippings)++; \ (*clippings)++; \
dst[n] = min; \ dst[n] = min; \
...@@ -177,6 +180,7 @@ static int iir_ch_serial_## name(AVFilterContext *ctx, void *arg, int ch, int nb ...@@ -177,6 +180,7 @@ static int iir_ch_serial_## name(AVFilterContext *ctx, void *arg, int ch, int nb
AudioIIRContext *s = ctx->priv; \ AudioIIRContext *s = ctx->priv; \
const double ig = s->dry_gain; \ const double ig = s->dry_gain; \
const double og = s->wet_gain; \ const double og = s->wet_gain; \
const double mix = s->mix; \
ThreadData *td = arg; \ ThreadData *td = arg; \
AVFrame *in = td->in, *out = td->out; \ AVFrame *in = td->in, *out = td->out; \
const type *src = (const type *)in->extended_data[ch]; \ const type *src = (const type *)in->extended_data[ch]; \
...@@ -207,6 +211,7 @@ static int iir_ch_serial_## name(AVFilterContext *ctx, void *arg, int ch, int nb ...@@ -207,6 +211,7 @@ static int iir_ch_serial_## name(AVFilterContext *ctx, void *arg, int ch, int nb
o1 = o0; \ o1 = o0; \
o0 *= og; \ o0 *= og; \
\ \
o0 = o0 * mix + (1. - mix) * sample; \
if (need_clipping && o0 < min) { \ if (need_clipping && o0 < min) { \
(*clippings)++; \ (*clippings)++; \
dst[n] = min; \ dst[n] = min; \
...@@ -1074,6 +1079,7 @@ static const AVOption aiir_options[] = { ...@@ -1074,6 +1079,7 @@ static const AVOption aiir_options[] = {
{ "flt", "single-precision floating-point", 0, AV_OPT_TYPE_CONST, {.i64=1}, 0, 0, AF, "precision" }, { "flt", "single-precision floating-point", 0, AV_OPT_TYPE_CONST, {.i64=1}, 0, 0, AF, "precision" },
{ "i32", "32-bit integers", 0, AV_OPT_TYPE_CONST, {.i64=2}, 0, 0, AF, "precision" }, { "i32", "32-bit integers", 0, AV_OPT_TYPE_CONST, {.i64=2}, 0, 0, AF, "precision" },
{ "i16", "16-bit integers", 0, AV_OPT_TYPE_CONST, {.i64=3}, 0, 0, AF, "precision" }, { "i16", "16-bit integers", 0, AV_OPT_TYPE_CONST, {.i64=3}, 0, 0, AF, "precision" },
{ "mix", "set mix", OFFSET(mix), AV_OPT_TYPE_DOUBLE, {.dbl=1}, 0, 1, AF },
{ "response", "show IR frequency response", OFFSET(response), AV_OPT_TYPE_BOOL, {.i64=0}, 0, 1, VF }, { "response", "show IR frequency response", OFFSET(response), AV_OPT_TYPE_BOOL, {.i64=0}, 0, 1, VF },
{ "channel", "set IR channel to display frequency response", OFFSET(ir_channel), AV_OPT_TYPE_INT, {.i64=0}, 0, 1024, VF }, { "channel", "set IR channel to display frequency response", OFFSET(ir_channel), AV_OPT_TYPE_INT, {.i64=0}, 0, 1024, VF },
{ "size", "set video size", OFFSET(w), AV_OPT_TYPE_IMAGE_SIZE, {.str = "hd720"}, 0, 0, VF }, { "size", "set video size", OFFSET(w), AV_OPT_TYPE_IMAGE_SIZE, {.str = "hd720"}, 0, 0, VF },
......
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