[FFmpeg-devel,3/5] libavfilter/ebur128: add gaugetype option

Submitted by Daniel Molkentin on Oct. 7, 2018, 4:02 p.m.

Details

Message ID 20181007160229.18250-4-daniel@molkentin.de
State New
Headers show

Commit Message

Daniel Molkentin Oct. 7, 2018, 4:02 p.m.
Allow to show short term instead of momentary. Useful for monitoring
whilst live mixing.

Signed-off-by: Daniel Molkentin <daniel@molkentin.de>
Signed-off-by: Conrad Zelck <c.zelck@imail.de>
---
 doc/filters.texi        |  8 +++++++-
 libavfilter/f_ebur128.c | 18 ++++++++++++++++--
 2 files changed, 23 insertions(+), 3 deletions(-)

Comments

Paul B Mahol Oct. 7, 2018, 4:07 p.m.
On 10/7/18, Daniel Molkentin <daniel@molkentin.de> wrote:
> Allow to show short term instead of momentary. Useful for monitoring
> whilst live mixing.
>
> Signed-off-by: Daniel Molkentin <daniel@molkentin.de>
> Signed-off-by: Conrad Zelck <c.zelck@imail.de>
> ---
>  doc/filters.texi        |  8 +++++++-
>  libavfilter/f_ebur128.c | 18 ++++++++++++++++--
>  2 files changed, 23 insertions(+), 3 deletions(-)

Please use AV_OPT_TYPE_INT in combination of AV_OPT_TYPE_CONST, like
all filters do.

Using strcmp is fragile and ugly.

>
> diff --git a/doc/filters.texi b/doc/filters.texi
> index bd5154f9be..40d9006075 100644
> --- a/doc/filters.texi
> +++ b/doc/filters.texi
> @@ -19279,7 +19279,8 @@ time graph to observe the loudness evolution. The
> graphic contains the logged
>  message mentioned above, so it is not printed anymore when this option is
> set,
>  unless the verbose logging is set. The main graphing area contains the
>  short-term loudness (3 seconds of analysis), and the gauge on the right is
> for
> -the momentary loudness (400 milliseconds).
> +the momentary loudness (400 milliseconds), but can optionally be configured
> +to instead display short-term loundness (see @var{gaugetype}).
>
>  More information about the Loudness Recommendation EBU R128 on
>  @url{http://tech.ebu.ch/loudness}.
> @@ -19362,6 +19363,11 @@ Set a specific target level (in LUFS) used as
> relative zero in the visualization
>  This parameter is optional and has a default value of -23LUFS as specified
>  by EBU R128. However, material published online may prefer a level of
> -16LUFS
>  (e.g. for use with podcasts or video platforms).
> +
> +@item gaugetype
> +Set the value displayed by the gauge. Valid values are m (momentary) and s
> (short-term).
> +By default the momentary value will be used, but in certain scenarios it
> may be more useful
> +to observe the short term value instead (e.g. live mixing).
>  @end table
>
>  @subsection Examples
> diff --git a/libavfilter/f_ebur128.c b/libavfilter/f_ebur128.c
> index 89bfcb0b3e..66d4c4dec7 100644
> --- a/libavfilter/f_ebur128.c
> +++ b/libavfilter/f_ebur128.c
> @@ -143,6 +143,7 @@ typedef struct EBUR128Context {
>      int dual_mono;                  ///< whether or not to treat single
> channel input files as dual-mono
>      double pan_law;                 ///< pan law value used to calculate
> dual-mono measurements
>      int target;                     ///< target level in LUFS used to set
> relative zero LU in visualization
> +    char *gauge_type;               ///< whether gauge shows momentary or
> short
>  } EBUR128Context;
>
>  enum {
> @@ -170,6 +171,7 @@ static const AVOption ebur128_options[] = {
>      { "dualmono", "treat mono input files as dual-mono", OFFSET(dual_mono),
> AV_OPT_TYPE_BOOL, {.i64 = 0}, 0, 1, A|F },
>      { "panlaw", "set a specific pan law for dual-mono files",
> OFFSET(pan_law), AV_OPT_TYPE_DOUBLE, {.dbl = -3.01029995663978}, -10.0, 0.0,
> A|F },
>      { "target", "set a specific target level in LUFS (-23 to 0)",
> OFFSET(target), AV_OPT_TYPE_INT, {.i64 = -23}, -23, 0, V|F },
> +    { "gaugetype", "sets whether the gauge shows momentrary (m) or
> short-term (s)", OFFSET(gauge_type), AV_OPT_TYPE_STRING, {.str = "m"},
> CHAR_MIN, CHAR_MAX, V|F },
>      { NULL },
>  };
>
> @@ -517,6 +519,11 @@ static av_cold int init(AVFilterContext *ctx)
>          return ret;
>      }
>
> +    if (strcmp(ebur128->gauge_type, "m") && strcmp(ebur128->gauge_type,
> "s")) {
> +        av_log(ctx, AV_LOG_ERROR, "Value for gaugetype can only be 'm' or
> 's'.\n");
> +        return AVERROR(EINVAL);
> +    }
> +
>      /* summary */
>      av_log(ctx, AV_LOG_VERBOSE, "EBU +%d scale\n", ebur128->meter);
>
> @@ -741,9 +748,16 @@ static int filter_frame(AVFilterLink *inlink, AVFrame
> *insamples)
>              if (ebur128->do_video) {
>                  int x, y, ret;
>                  uint8_t *p;
> +                double gauge_value;
> +
> +                if (!strcmp(ebur128->gauge_type, "m")) {
> +                    gauge_value = loudness_400 - ebur128->target;
> +                } else {
> +                    gauge_value = loudness_3000 - ebur128->target;
> +                }
>
>                  const int y_loudness_lu_graph = lu_to_y(ebur128,
> loudness_3000 - ebur128->target);
> -                const int y_loudness_lu_gauge = lu_to_y(ebur128,
> loudness_400  - ebur128->target);
> +                const int y_loudness_lu_gauge = lu_to_y(ebur128,
> gauge_value);
>
>                  /* draw the graph using the short-term loudness */
>                  p = pic->data[0] + ebur128->graph.y*pic->linesize[0] +
> ebur128->graph.x*3;
> @@ -755,7 +769,7 @@ static int filter_frame(AVFilterLink *inlink, AVFrame
> *insamples)
>                      p += pic->linesize[0];
>                  }
>
> -                /* draw the gauge using the momentary loudness */
> +                /* draw the gauge using either momentary or short-term
> loudness */
>                  p = pic->data[0] + ebur128->gauge.y*pic->linesize[0] +
> ebur128->gauge.x*3;
>                  for (y = 0; y < ebur128->gauge.h; y++) {
>                      const uint8_t *c = get_graph_color(ebur128,
> y_loudness_lu_gauge, y);
> --
> 2.17.1
>
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel@ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>

Patch hide | download patch | download mbox

diff --git a/doc/filters.texi b/doc/filters.texi
index bd5154f9be..40d9006075 100644
--- a/doc/filters.texi
+++ b/doc/filters.texi
@@ -19279,7 +19279,8 @@  time graph to observe the loudness evolution. The graphic contains the logged
 message mentioned above, so it is not printed anymore when this option is set,
 unless the verbose logging is set. The main graphing area contains the
 short-term loudness (3 seconds of analysis), and the gauge on the right is for
-the momentary loudness (400 milliseconds).
+the momentary loudness (400 milliseconds), but can optionally be configured
+to instead display short-term loundness (see @var{gaugetype}).
 
 More information about the Loudness Recommendation EBU R128 on
 @url{http://tech.ebu.ch/loudness}.
@@ -19362,6 +19363,11 @@  Set a specific target level (in LUFS) used as relative zero in the visualization
 This parameter is optional and has a default value of -23LUFS as specified
 by EBU R128. However, material published online may prefer a level of -16LUFS
 (e.g. for use with podcasts or video platforms).
+
+@item gaugetype
+Set the value displayed by the gauge. Valid values are m (momentary) and s (short-term).
+By default the momentary value will be used, but in certain scenarios it may be more useful
+to observe the short term value instead (e.g. live mixing).
 @end table
 
 @subsection Examples
diff --git a/libavfilter/f_ebur128.c b/libavfilter/f_ebur128.c
index 89bfcb0b3e..66d4c4dec7 100644
--- a/libavfilter/f_ebur128.c
+++ b/libavfilter/f_ebur128.c
@@ -143,6 +143,7 @@  typedef struct EBUR128Context {
     int dual_mono;                  ///< whether or not to treat single channel input files as dual-mono
     double pan_law;                 ///< pan law value used to calculate dual-mono measurements
     int target;                     ///< target level in LUFS used to set relative zero LU in visualization
+    char *gauge_type;               ///< whether gauge shows momentary or short
 } EBUR128Context;
 
 enum {
@@ -170,6 +171,7 @@  static const AVOption ebur128_options[] = {
     { "dualmono", "treat mono input files as dual-mono", OFFSET(dual_mono), AV_OPT_TYPE_BOOL, {.i64 = 0}, 0, 1, A|F },
     { "panlaw", "set a specific pan law for dual-mono files", OFFSET(pan_law), AV_OPT_TYPE_DOUBLE, {.dbl = -3.01029995663978}, -10.0, 0.0, A|F },
     { "target", "set a specific target level in LUFS (-23 to 0)", OFFSET(target), AV_OPT_TYPE_INT, {.i64 = -23}, -23, 0, V|F },
+    { "gaugetype", "sets whether the gauge shows momentrary (m) or short-term (s)", OFFSET(gauge_type), AV_OPT_TYPE_STRING, {.str = "m"}, CHAR_MIN, CHAR_MAX, V|F },
     { NULL },
 };
 
@@ -517,6 +519,11 @@  static av_cold int init(AVFilterContext *ctx)
         return ret;
     }
 
+    if (strcmp(ebur128->gauge_type, "m") && strcmp(ebur128->gauge_type, "s")) {
+        av_log(ctx, AV_LOG_ERROR, "Value for gaugetype can only be 'm' or 's'.\n");
+        return AVERROR(EINVAL);
+    }
+
     /* summary */
     av_log(ctx, AV_LOG_VERBOSE, "EBU +%d scale\n", ebur128->meter);
 
@@ -741,9 +748,16 @@  static int filter_frame(AVFilterLink *inlink, AVFrame *insamples)
             if (ebur128->do_video) {
                 int x, y, ret;
                 uint8_t *p;
+                double gauge_value;
+
+                if (!strcmp(ebur128->gauge_type, "m")) {
+                    gauge_value = loudness_400 - ebur128->target;
+                } else {
+                    gauge_value = loudness_3000 - ebur128->target;
+                }
 
                 const int y_loudness_lu_graph = lu_to_y(ebur128, loudness_3000 - ebur128->target);
-                const int y_loudness_lu_gauge = lu_to_y(ebur128, loudness_400  - ebur128->target);
+                const int y_loudness_lu_gauge = lu_to_y(ebur128, gauge_value);
 
                 /* draw the graph using the short-term loudness */
                 p = pic->data[0] + ebur128->graph.y*pic->linesize[0] + ebur128->graph.x*3;
@@ -755,7 +769,7 @@  static int filter_frame(AVFilterLink *inlink, AVFrame *insamples)
                     p += pic->linesize[0];
                 }
 
-                /* draw the gauge using the momentary loudness */
+                /* draw the gauge using either momentary or short-term loudness */
                 p = pic->data[0] + ebur128->gauge.y*pic->linesize[0] + ebur128->gauge.x*3;
                 for (y = 0; y < ebur128->gauge.h; y++) {
                     const uint8_t *c = get_graph_color(ebur128, y_loudness_lu_gauge, y);