[FFmpeg-cvslog] avfilter/af_loudnorm: add dual_mono option

Kyle Swanson git at videolan.org
Thu Jun 9 23:51:04 CEST 2016


ffmpeg | branch: master | Kyle Swanson <k at ylo.ph> | Tue Jun  7 11:55:02 2016 -0500| [765703498aa52f38c88afb09754821b17cf60045] | committer: Kyle Swanson

avfilter/af_loudnorm: add dual_mono option

Signed-off-by: Kyle Swanson <k at ylo.ph>

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=765703498aa52f38c88afb09754821b17cf60045
---

 doc/filters.texi          |    7 +++++++
 libavfilter/af_loudnorm.c |    7 +++++++
 2 files changed, 14 insertions(+)

diff --git a/doc/filters.texi b/doc/filters.texi
index c311f56..2234734 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.
 
+ at 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 9d27c16..604697e 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)



More information about the ffmpeg-cvslog mailing list