avilter/af_afir: add irfmt option
This commit is contained in:
parent
e08a876e67
commit
0baca07759
@ -1193,6 +1193,10 @@ select gain to noise approach, this is most popular one.
|
|||||||
Set gain to be applied to IR coefficients before filtering.
|
Set gain to be applied to IR coefficients before filtering.
|
||||||
Allowed range is 0 to 1. This can be set even with @var{again} used.
|
Allowed range is 0 to 1. This can be set even with @var{again} used.
|
||||||
|
|
||||||
|
@item irfmt
|
||||||
|
Set format of IR stream. Can be @code{mono} or @code{input}.
|
||||||
|
Default is @code{input}.
|
||||||
|
|
||||||
@item maxir
|
@item maxir
|
||||||
Set max allowed Impulse Response filter duration in seconds. Default is 30 seconds.
|
Set max allowed Impulse Response filter duration in seconds. Default is 30 seconds.
|
||||||
Allowed range is 0.1 to 60 seconds.
|
Allowed range is 0.1 to 60 seconds.
|
||||||
|
@ -533,7 +533,7 @@ static int query_formats(AVFilterContext *ctx)
|
|||||||
AV_PIX_FMT_RGB0,
|
AV_PIX_FMT_RGB0,
|
||||||
AV_PIX_FMT_NONE
|
AV_PIX_FMT_NONE
|
||||||
};
|
};
|
||||||
int ret, i;
|
int ret;
|
||||||
|
|
||||||
if (s->response) {
|
if (s->response) {
|
||||||
AVFilterLink *videolink = ctx->outputs[1];
|
AVFilterLink *videolink = ctx->outputs[1];
|
||||||
@ -543,12 +543,25 @@ static int query_formats(AVFilterContext *ctx)
|
|||||||
}
|
}
|
||||||
|
|
||||||
layouts = ff_all_channel_counts();
|
layouts = ff_all_channel_counts();
|
||||||
if ((ret = ff_channel_layouts_ref(layouts, &ctx->outputs[0]->in_channel_layouts)) < 0)
|
if (!layouts)
|
||||||
return ret;
|
return AVERROR(ENOMEM);
|
||||||
|
|
||||||
for (i = 0; i < 2; i++) {
|
if (s->ir_format) {
|
||||||
layouts = ff_all_channel_counts();
|
ret = ff_set_common_channel_layouts(ctx, layouts);
|
||||||
if ((ret = ff_channel_layouts_ref(layouts, &ctx->inputs[i]->out_channel_layouts)) < 0)
|
if (ret < 0)
|
||||||
|
return ret;
|
||||||
|
} else {
|
||||||
|
AVFilterChannelLayouts *mono = NULL;
|
||||||
|
|
||||||
|
ret = ff_add_channel_layout(&mono, AV_CH_LAYOUT_MONO);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
if ((ret = ff_channel_layouts_ref(layouts, &ctx->inputs[0]->out_channel_layouts)) < 0)
|
||||||
|
return ret;
|
||||||
|
if ((ret = ff_channel_layouts_ref(layouts, &ctx->outputs[0]->in_channel_layouts)) < 0)
|
||||||
|
return ret;
|
||||||
|
if ((ret = ff_channel_layouts_ref(mono, &ctx->inputs[1]->out_channel_layouts)) < 0)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -565,14 +578,6 @@ static int config_output(AVFilterLink *outlink)
|
|||||||
AVFilterContext *ctx = outlink->src;
|
AVFilterContext *ctx = outlink->src;
|
||||||
AudioFIRContext *s = ctx->priv;
|
AudioFIRContext *s = ctx->priv;
|
||||||
|
|
||||||
if (ctx->inputs[0]->channels != ctx->inputs[1]->channels &&
|
|
||||||
ctx->inputs[1]->channels != 1) {
|
|
||||||
av_log(ctx, AV_LOG_ERROR,
|
|
||||||
"Second input must have same number of channels as first input or "
|
|
||||||
"exactly 1 channel.\n");
|
|
||||||
return AVERROR(EINVAL);
|
|
||||||
}
|
|
||||||
|
|
||||||
s->one2many = ctx->inputs[1]->channels == 1;
|
s->one2many = ctx->inputs[1]->channels == 1;
|
||||||
outlink->sample_rate = ctx->inputs[0]->sample_rate;
|
outlink->sample_rate = ctx->inputs[0]->sample_rate;
|
||||||
outlink->time_base = ctx->inputs[0]->time_base;
|
outlink->time_base = ctx->inputs[0]->time_base;
|
||||||
@ -739,6 +744,9 @@ static const AVOption afir_options[] = {
|
|||||||
{ "dc", "DC gain", 0, AV_OPT_TYPE_CONST, {.i64=1}, 0, 0, AF, "gtype" },
|
{ "dc", "DC gain", 0, AV_OPT_TYPE_CONST, {.i64=1}, 0, 0, AF, "gtype" },
|
||||||
{ "gn", "gain to noise", 0, AV_OPT_TYPE_CONST, {.i64=2}, 0, 0, AF, "gtype" },
|
{ "gn", "gain to noise", 0, AV_OPT_TYPE_CONST, {.i64=2}, 0, 0, AF, "gtype" },
|
||||||
{ "irgain", "set IR gain", OFFSET(ir_gain), AV_OPT_TYPE_FLOAT, {.dbl=1}, 0, 1, AF },
|
{ "irgain", "set IR gain", OFFSET(ir_gain), AV_OPT_TYPE_FLOAT, {.dbl=1}, 0, 1, AF },
|
||||||
|
{ "irfmt", "set IR format", OFFSET(ir_format), AV_OPT_TYPE_INT, {.i64=1}, 0, 1, AF, "irfmt" },
|
||||||
|
{ "mono", "single channel", 0, AV_OPT_TYPE_CONST, {.i64=0}, 0, 0, AF, "irfmt" },
|
||||||
|
{ "input", "same as input", 0, AV_OPT_TYPE_CONST, {.i64=1}, 0, 0, AF, "irfmt" },
|
||||||
{ "maxir", "set max IR length", OFFSET(max_ir_len), AV_OPT_TYPE_FLOAT, {.dbl=30}, 0.1, 60, AF },
|
{ "maxir", "set max IR length", OFFSET(max_ir_len), AV_OPT_TYPE_FLOAT, {.dbl=30}, 0.1, 60, 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 },
|
||||||
|
@ -41,6 +41,7 @@ typedef struct AudioFIRContext {
|
|||||||
int again;
|
int again;
|
||||||
int gtype;
|
int gtype;
|
||||||
float ir_gain;
|
float ir_gain;
|
||||||
|
int ir_format;
|
||||||
float max_ir_len;
|
float max_ir_len;
|
||||||
int response;
|
int response;
|
||||||
int w, h;
|
int w, h;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user