Commit 76570349 authored by Kyle Swanson's avatar Kyle Swanson

avfilter/af_loudnorm: add dual_mono option

Signed-off-by: 's avatarKyle Swanson <k@ylo.ph>
parent 6826f16e
...@@ -2765,6 +2765,13 @@ measured_I, measured_LRA, measured_TP, and measured_thresh must also ...@@ -2765,6 +2765,13 @@ measured_I, measured_LRA, measured_TP, and measured_thresh must also
to be specified in order to use this mode. to be specified in order to use this mode.
Options are true or false. Default is true. Options are true or false. Default is true.
@item dual_mono
Treat mono input files as "dual-mono". If a mono file is intended for playback
on a stereo system, its EBU R128 measurement will be perceptually incorrect.
If set to @code{true}, this option will compensate for this effect.
Multi-channel input files are not affected by this option.
Options are true or false. Default is false.
@item print_format @item print_format
Set print format for stats. Options are summary, json, or none. Set print format for stats. Options are summary, json, or none.
Default value is none. Default value is none.
......
...@@ -60,6 +60,7 @@ typedef struct LoudNormContext { ...@@ -60,6 +60,7 @@ typedef struct LoudNormContext {
double measured_thresh; double measured_thresh;
double offset; double offset;
int linear; int linear;
int dual_mono;
enum PrintFormat print_format; enum PrintFormat print_format;
double *buf; double *buf;
...@@ -113,6 +114,7 @@ static const AVOption loudnorm_options[] = { ...@@ -113,6 +114,7 @@ static const AVOption loudnorm_options[] = {
{ "measured_thresh", "measured threshold of input file", OFFSET(measured_thresh), AV_OPT_TYPE_DOUBLE, {.dbl = -70.}, -99., 0., FLAGS }, { "measured_thresh", "measured threshold of input file", OFFSET(measured_thresh), AV_OPT_TYPE_DOUBLE, {.dbl = -70.}, -99., 0., FLAGS },
{ "offset", "set offset gain", OFFSET(offset), AV_OPT_TYPE_DOUBLE, {.dbl = 0.}, -99., 99., FLAGS }, { "offset", "set offset gain", OFFSET(offset), AV_OPT_TYPE_DOUBLE, {.dbl = 0.}, -99., 99., FLAGS },
{ "linear", "normalize linearly if possible", OFFSET(linear), AV_OPT_TYPE_BOOL, {.i64 = 1}, 0, 1, FLAGS }, { "linear", "normalize linearly if possible", OFFSET(linear), AV_OPT_TYPE_BOOL, {.i64 = 1}, 0, 1, FLAGS },
{ "dual_mono", "treat mono input as dual-mono", OFFSET(dual_mono), AV_OPT_TYPE_BOOL, {.i64 = 0}, 0, 1, FLAGS },
{ "print_format", "set print format for stats", OFFSET(print_format), AV_OPT_TYPE_INT, {.i64 = NONE}, NONE, PF_NB -1, FLAGS, "print_format" }, { "print_format", "set print format for stats", OFFSET(print_format), AV_OPT_TYPE_INT, {.i64 = NONE}, NONE, PF_NB -1, FLAGS, "print_format" },
{ "none", 0, 0, AV_OPT_TYPE_CONST, {.i64 = NONE}, 0, 0, FLAGS, "print_format" }, { "none", 0, 0, AV_OPT_TYPE_CONST, {.i64 = NONE}, 0, 0, FLAGS, "print_format" },
{ "json", 0, 0, AV_OPT_TYPE_CONST, {.i64 = JSON}, 0, 0, FLAGS, "print_format" }, { "json", 0, 0, AV_OPT_TYPE_CONST, {.i64 = JSON}, 0, 0, FLAGS, "print_format" },
...@@ -731,6 +733,11 @@ static int config_input(AVFilterLink *inlink) ...@@ -731,6 +733,11 @@ static int config_input(AVFilterLink *inlink)
if (!s->r128_out) if (!s->r128_out)
return AVERROR(ENOMEM); return AVERROR(ENOMEM);
if (inlink->channels == 1 && s->dual_mono) {
ebur128_set_channel(s->r128_in, 0, EBUR128_DUAL_MONO);
ebur128_set_channel(s->r128_out, 0, EBUR128_DUAL_MONO);
}
s->buf_size = frame_size(inlink->sample_rate, 3000) * inlink->channels; s->buf_size = frame_size(inlink->sample_rate, 3000) * inlink->channels;
s->buf = av_malloc_array(s->buf_size, sizeof(*s->buf)); s->buf = av_malloc_array(s->buf_size, sizeof(*s->buf));
if (!s->buf) if (!s->buf)
......
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