1
0
mirror of https://github.com/FFmpeg/FFmpeg.git synced 2025-08-10 06:10:52 +02:00

avfilter/af_loudnorm: add dual_mono option

Signed-off-by: Kyle Swanson <k@ylo.ph>
This commit is contained in:
Kyle Swanson
2016-06-07 11:55:02 -05:00
parent 6826f16e4a
commit 765703498a
2 changed files with 14 additions and 0 deletions

View File

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

View File

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