avfilter/af_aiir: implement mix option

This commit is contained in:
Paul B Mahol 2019-07-08 16:44:53 +02:00
parent 034a9d2507
commit 2a801e8856
2 changed files with 10 additions and 0 deletions

View File

@ -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.

View File

@ -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)
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)
\ \
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
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
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[] = {
{ "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 },