diff options
author | Kyle Swanson <k@ylo.ph> | 2016-06-07 11:55:02 -0500 |
---|---|---|
committer | Kyle Swanson <k@ylo.ph> | 2016-06-09 13:06:30 -0500 |
commit | 765703498aa52f38c88afb09754821b17cf60045 (patch) | |
tree | 182e1c36c11332d925985289234ffd915d959b8e | |
parent | 6826f16e4a3629c801396dca3ada8a78fc506e85 (diff) | |
download | ffmpeg-765703498aa52f38c88afb09754821b17cf60045.tar.gz |
avfilter/af_loudnorm: add dual_mono option
Signed-off-by: Kyle Swanson <k@ylo.ph>
-rw-r--r-- | doc/filters.texi | 7 | ||||
-rw-r--r-- | libavfilter/af_loudnorm.c | 7 |
2 files changed, 14 insertions, 0 deletions
diff --git a/doc/filters.texi b/doc/filters.texi index c311f56a24..22347346b0 100644 --- a/doc/filters.texi +++ b/doc/filters.texi @@ -2765,6 +2765,13 @@ measured_I, measured_LRA, measured_TP, and measured_thresh must also to be specified in order to use this mode. 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 Set print format for stats. Options are summary, json, or none. Default value is none. diff --git a/libavfilter/af_loudnorm.c b/libavfilter/af_loudnorm.c index 9d27c16b98..604697e6f7 100644 --- a/libavfilter/af_loudnorm.c +++ b/libavfilter/af_loudnorm.c @@ -60,6 +60,7 @@ typedef struct LoudNormContext { double measured_thresh; double offset; int linear; + int dual_mono; enum PrintFormat print_format; double *buf; @@ -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 }, { "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 }, + { "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" }, { "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" }, @@ -731,6 +733,11 @@ static int config_input(AVFilterLink *inlink) if (!s->r128_out) 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 = av_malloc_array(s->buf_size, sizeof(*s->buf)); if (!s->buf) |