diff options
author | Daniel Molkentin <daniel@molkentin.de> | 2018-10-09 14:32:56 +0200 |
---|---|---|
committer | Paul B Mahol <onemda@gmail.com> | 2018-10-10 19:26:41 +0200 |
commit | d445bcb137faa9210b5773b4973e72e1af6a314a (patch) | |
tree | dfab764d17fbf85c4ecf29072bd91ddf85748b05 | |
parent | d587390988e1f11428de52f13209861559076fc3 (diff) | |
download | ffmpeg-d445bcb137faa9210b5773b4973e72e1af6a314a.tar.gz |
libavfilter/ebur128: introduce target range
This eases meeting the target level during live mixing.
Signed-off-by: Daniel Molkentin <daniel@molkentin.de>
Signed-off-by: Conrad Zelck <c.zelck@imail.de>
-rw-r--r-- | doc/filters.texi | 3 | ||||
-rw-r--r-- | libavfilter/f_ebur128.c | 33 |
2 files changed, 26 insertions, 10 deletions
diff --git a/doc/filters.texi b/doc/filters.texi index 7f2baed9b5..3783a8a421 100644 --- a/doc/filters.texi +++ b/doc/filters.texi @@ -19284,6 +19284,9 @@ short-term loudness (3 seconds of analysis), and the gauge on the right is for the momentary loudness (400 milliseconds), but can optionally be configured to instead display short-term loudness (see @var{gauge}). +The green area marks a +/- 1LU target range around the target loudness +(-23LUFS by default, unless modified through @var{target}). + More information about the Loudness Recommendation EBU R128 on @url{http://tech.ebu.ch/loudness}. diff --git a/libavfilter/f_ebur128.c b/libavfilter/f_ebur128.c index c74dac94da..688c7bf135 100644 --- a/libavfilter/f_ebur128.c +++ b/libavfilter/f_ebur128.c @@ -114,6 +114,8 @@ typedef struct EBUR128Context { int meter; ///< select a EBU mode between +9 and +18 int scale_range; ///< the range of LU values according to the meter int y_zero_lu; ///< the y value (pixel position) for 0 LU + int y_opt_max; ///< the y value (pixel position) for 1 LU + int y_opt_min; ///< the y value (pixel position) for -1 LU int *y_line_ref; ///< y reference values for drawing the LU lines in the graph and the gauge /* audio */ @@ -188,22 +190,31 @@ static const AVOption ebur128_options[] = { AVFILTER_DEFINE_CLASS(ebur128); static const uint8_t graph_colors[] = { - 0xdd, 0x66, 0x66, // value above 0LU non reached - 0x66, 0x66, 0xdd, // value below 0LU non reached - 0x96, 0x33, 0x33, // value above 0LU reached - 0x33, 0x33, 0x96, // value below 0LU reached - 0xdd, 0x96, 0x96, // value above 0LU line non reached - 0x96, 0x96, 0xdd, // value below 0LU line non reached - 0xdd, 0x33, 0x33, // value above 0LU line reached - 0x33, 0x33, 0xdd, // value below 0LU line reached + 0xdd, 0x66, 0x66, // value above 1LU non reached below -1LU (impossible) + 0x66, 0x66, 0xdd, // value below 1LU non reached below -1LU + 0x96, 0x33, 0x33, // value above 1LU reached below -1LU (impossible) + 0x33, 0x33, 0x96, // value below 1LU reached below -1LU + 0xdd, 0x96, 0x96, // value above 1LU line non reached below -1LU (impossible) + 0x96, 0x96, 0xdd, // value below 1LU line non reached below -1LU + 0xdd, 0x33, 0x33, // value above 1LU line reached below -1LU (impossible) + 0x33, 0x33, 0xdd, // value below 1LU line reached below -1LU + 0xdd, 0x66, 0x66, // value above 1LU non reached above -1LU + 0x66, 0xdd, 0x66, // value below 1LU non reached above -1LU + 0x96, 0x33, 0x33, // value above 1LU reached above -1LU + 0x33, 0x96, 0x33, // value below 1LU reached above -1LU + 0xdd, 0x96, 0x96, // value above 1LU line non reached above -1LU + 0x96, 0xdd, 0x96, // value below 1LU line non reached above -1LU + 0xdd, 0x33, 0x33, // value above 1LU line reached above -1LU + 0x33, 0xdd, 0x33, // value below 1LU line reached above -1LU }; static const uint8_t *get_graph_color(const EBUR128Context *ebur128, int v, int y) { - const int below0 = y > ebur128->y_zero_lu; + const int above_opt_max = y > ebur128->y_opt_max; + const int below_opt_min = y < ebur128->y_opt_min; const int reached = y >= v; const int line = ebur128->y_line_ref[y] || y == ebur128->y_zero_lu; - const int colorid = 4*line + 2*reached + below0; + const int colorid = 8*below_opt_min+ 4*line + 2*reached + above_opt_max; return graph_colors + 3*colorid; } @@ -337,6 +348,8 @@ static int config_video_output(AVFilterLink *outlink) /* draw graph */ ebur128->y_zero_lu = lu_to_y(ebur128, 0); + ebur128->y_opt_max = lu_to_y(ebur128, 1); + ebur128->y_opt_min = lu_to_y(ebur128, -1); p = outpicref->data[0] + ebur128->graph.y * outpicref->linesize[0] + ebur128->graph.x * 3; for (y = 0; y < ebur128->graph.h; y++) { |