[FFmpeg-devel,5/5] libavfilter/ebur128: add scale parameter

Submitted by Daniel Molkentin on Oct. 7, 2018, 9:19 p.m.

Details

Message ID 20181007211956.17615-6-daniel@molkentin.de
State New
Headers show

Commit Message

Daniel Molkentin Oct. 7, 2018, 9:19 p.m.
This allows switching between absolute (LUFS) and relativ (LU) display
in the status line.

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 | 42 ++++++++++++++++++++++++++++++++---------
 2 files changed, 37 insertions(+), 13 deletions(-)

Comments

Moritz Barsnick Oct. 8, 2018, 7:21 a.m.
On Sun, Oct 07, 2018 at 23:19:56 +0200, Daniel Molkentin wrote:
> +Sets the display scale for the loudness. Valid parameters are @code{absolute}
> +(in LUFS) or @code{relative} (LU) relative to the target. This only affects the
> +video output, not the summary or continous log output.
                                    ^ continuous

> +    { "scale", "sets display method for the stats", OFFSET(scale), AV_OPT_TYPE_INT, {.i64 = 0}, 0, INT_MAX, V|F, "scaletype" },

Same remark regarding the range as for the other patch.

Adding options (and changing output line format?) might also warrant a
micro-version bump of lavfi, but that's up to others to decide.

Cheers,
Moritz
Daniel Molkentin Oct. 8, 2018, 9:15 p.m.
On 08.10.2018 21:00, Carl Eugen Hoyos wrote:
> 2018-10-08 9:21 GMT+02:00, Moritz Barsnick <barsnick@gmx.net>:
>
>> Adding options (and changing output line format?) might also warrant a
>> micro-version bump of lavfi
> It does.
> Even more so for the changed output line...
If you point me to where it needs bumping, I'll include it in the next
revision of the patchset

Cheers,
  Daniel
Carl Eugen Hoyos Oct. 9, 2018, 12:29 a.m.
2018-10-08 23:15 GMT+02:00, Daniel Molkentin <daniel@molkentin.de>:
> On 08.10.2018 21:00, Carl Eugen Hoyos wrote:
>> 2018-10-08 9:21 GMT+02:00, Moritz Barsnick <barsnick@gmx.net>:
>>
>>> Adding options (and changing output line format?) might also warrant a
>>> micro-version bump of lavfi
>>
>> It does.
>> Even more so for the changed output line...
>
> If you point me to where it needs bumping, I'll include it in the next
> revision of the patchset

libavfilter/version.h, the micro-version.

Carl Eugen

Patch hide | download patch | download mbox

diff --git a/doc/filters.texi b/doc/filters.texi
index 875b412f41..df957fda0f 100644
--- a/doc/filters.texi
+++ b/doc/filters.texi
@@ -19375,10 +19375,10 @@  Set the value displayed by the gauge. Valid values are @code{momentary} and s
 scenarios it may be more useful to observe the short term value instead (e.g.
 live mixing).
 
-@item mabsolute
-Sets whether to display the loudness in LUFS (1, the default) LU relative to
-the target (0). This only affects the video output, not the summary or
-continous log output.
+@item scale
+Sets the display scale for the loudness. Valid parameters are @code{absolute}
+(in LUFS) or @code{relative} (LU) relative to the target. This only affects the
+video output, not the summary or continous log output.
 @end table
 
 @subsection Examples
diff --git a/libavfilter/f_ebur128.c b/libavfilter/f_ebur128.c
index 53f21c9d14..259d2036fc 100644
--- a/libavfilter/f_ebur128.c
+++ b/libavfilter/f_ebur128.c
@@ -146,6 +146,7 @@  typedef struct EBUR128Context {
     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
     int gauge_type;                 ///< whether gauge shows momentary or short
+    int scale;                      ///< display scale type of statistics
 } EBUR128Context;
 
 enum {
@@ -159,6 +160,10 @@  enum {
     GAUGE_TYPE_SHORTTERM = 1,
 };
 
+enum {
+    SCALE_TYPE_ABSOLUTE = 0,
+    SCALE_TYPE_RELATIVE = 1,
+};
 
 #define OFFSET(x) offsetof(EBUR128Context, x)
 #define A AV_OPT_FLAG_AUDIO_PARAM
@@ -182,6 +187,11 @@  static const AVOption ebur128_options[] = {
     { "gauge", "set gauge display type", OFFSET(gauge_type), AV_OPT_TYPE_INT, {.i64 = 0 }, 0, INT_MAX, V|F, "gaugetype" },
         { "momentary",   "display momentary value",   0, AV_OPT_TYPE_CONST, {.i64 = GAUGE_TYPE_MOMENTARY}, INT_MIN, INT_MAX, V|F, "gaugetype" },
         { "shortterm",   "display short-term value",  0, AV_OPT_TYPE_CONST, {.i64 = GAUGE_TYPE_SHORTTERM}, INT_MIN, INT_MAX, V|F, "gaugetype" },
+    { "scale", "sets display method for the stats", OFFSET(scale), AV_OPT_TYPE_INT, {.i64 = 0}, 0, INT_MAX, V|F, "scaletype" },
+        { "absolute",   "display absolute values (LUFS)",          0, AV_OPT_TYPE_CONST, {.i64 = SCALE_TYPE_ABSOLUTE}, INT_MIN, INT_MAX, V|F, "scaletype" },
+        { "LUFS",       "display absolute values (LUFS)",          0, AV_OPT_TYPE_CONST, {.i64 = SCALE_TYPE_ABSOLUTE}, INT_MIN, INT_MAX, V|F, "scaletype" },
+        { "relative",   "display values relative to target (LU)",  0, AV_OPT_TYPE_CONST, {.i64 = SCALE_TYPE_RELATIVE}, INT_MIN, INT_MAX, V|F, "scaletype" },
+        { "LU",         "display values relative to target (LU)",  0, AV_OPT_TYPE_CONST, {.i64 = SCALE_TYPE_RELATIVE}, INT_MIN, INT_MAX, V|F, "scaletype" },
     { NULL },
 };
 
@@ -758,7 +768,7 @@  static int filter_frame(AVFilterLink *inlink, AVFrame *insamples)
                 loudness_3000 -= ebur128->pan_law;
             }
 
-#define LOG_FMT "TARGET:%d     M:%6.1f S:%6.1f     I:%6.1f LUFS     LRA:%6.1f LU"
+#define LOG_FMT "TARGET:%d LUFS    M:%6.1f S:%6.1f     I:%6.1f %s       LRA:%6.1f LU"
 
             /* push one video frame */
             if (ebur128->do_video) {
@@ -796,10 +806,17 @@  static int filter_frame(AVFilterLink *inlink, AVFrame *insamples)
                 }
 
                 /* draw textual info */
-                drawtext(pic, PAD, PAD - PAD/2, FONT16, font_colors,
-                         LOG_FMT "     ", // padding to erase trailing characters
-                         ebur128->target, loudness_400, loudness_3000,
-                         ebur128->integrated_loudness, ebur128->loudness_range);
+                if (ebur128->scale == SCALE_TYPE_ABSOLUTE) {
+                    drawtext(pic, PAD, PAD - PAD/2, FONT16, font_colors,
+                             LOG_FMT "     ", // padding to erase trailing characters
+                             ebur128->target, loudness_400, loudness_3000,
+                             ebur128->integrated_loudness, "LUFS", ebur128->loudness_range);
+                } else {
+                    drawtext(pic, PAD, PAD - PAD/2, FONT16, font_colors,
+                             LOG_FMT "     ", // padding to erase trailing characters
+                             ebur128->target, loudness_400-ebur128->target, loudness_3000-ebur128->target,
+                             ebur128->integrated_loudness-ebur128->target, "LU", ebur128->loudness_range);
+                }
 
                 /* set pts and push frame */
                 pic->pts = pts;
@@ -839,10 +856,17 @@  static int filter_frame(AVFilterLink *inlink, AVFrame *insamples)
                 SET_META_PEAK(true,   TRUE);
             }
 
-            av_log(ctx, ebur128->loglevel, "t: %-10s " LOG_FMT,
-                   av_ts2timestr(pts, &outlink->time_base),
-                   ebur128->target, loudness_400, loudness_3000,
-                   ebur128->integrated_loudness, ebur128->loudness_range);
+            if (ebur128->scale == SCALE_TYPE_ABSOLUTE) {
+                av_log(ctx, ebur128->loglevel, "t: %-10s " LOG_FMT,
+                       av_ts2timestr(pts, &outlink->time_base),
+                       ebur128->target, loudness_400, loudness_3000,
+                       ebur128->integrated_loudness, "LUFS", ebur128->loudness_range);
+            } else {
+                av_log(ctx, ebur128->loglevel, "t: %-10s " LOG_FMT,
+                       av_ts2timestr(pts, &outlink->time_base),
+                       ebur128->target, loudness_400-ebur128->target, loudness_3000-ebur128->target,
+                       ebur128->integrated_loudness-ebur128->target, "LU", ebur128->loudness_range);
+            }
 
 #define PRINT_PEAKS(str, sp, ptype) do {                            \
     if (ebur128->peak_mode & PEAK_MODE_ ## ptype ## _PEAKS) {       \