From patchwork Sun Oct 7 19:23:47 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Daniel Molkentin X-Patchwork-Id: 10571 Delivered-To: ffmpegpatchwork@gmail.com Received: by 2002:ab0:73d2:0:0:0:0:0 with SMTP id m18csp2824865uaq; Sun, 7 Oct 2018 12:24:15 -0700 (PDT) X-Google-Smtp-Source: ACcGV61UkahlDrneRdO1O8yGkj2cprTP55nHIJZs10/bXvxz+KOkjMU3W64nAMxBApJWZrV1wWKO X-Received: by 2002:a1c:2846:: with SMTP id o67-v6mr13024407wmo.60.1538940255618; Sun, 07 Oct 2018 12:24:15 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1538940255; cv=none; d=google.com; s=arc-20160816; b=KWwgXdt5IVbjRJZh225Cj1Wf4xO28wa7muTgjWAZToeAll8mGWlLi0ULtVOMiyu7Ad cFYqL9idjmJWcMhVyMabP3fXyZssTr4NZXBab6+q6c019NVsGqYDLldseuUokAjx87d9 IaoNgVRxTo1AwjXb1wwS7Ji79AO5ZUS52ez6axCqvrWCxbMwjJJtBXESn+u9vunKv5kZ BsjFeH+rlgQYGrQmhJaPiZ1biAPmkbVkcQ2N3J/2/ErRsVMkJwDVClf5hlU8MszwTByM 5t2BdC4pnwb1ILfDUYAezn8poD83ImogOsQbSKFAMqGUQS9UFBSJjjkMa1v2r5X1yPbO /GBA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:mime-version:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:message-id:date:to:from:delivered-to; bh=WWDJrKVAdb0pNqlPQUrTVupdKCHBA/TfTdAsONkoUg4=; b=BA0azrqX0DWmBn6uAxgLz7BaEfWf8R0VpvCg/ehKlzyO9m4Z/LPnE6aRs2GJEQ0Xyk eHGpeQW5OlxrMRTsP0NXlhe7z1JqClUVJydZn4CgdSOR6k+ta4v+7bh/tpuL9FF3otfy IrNm+ZZQyJnXdLXF+yW0CuM1P2a4Dm5GO8o/BDfWK9WeqSDThL6ifJhScAtVG+iDbr+0 E3LVN+ntVB4VUwWHXCchrtSgf5BUJm4C5gAvhfBU4VWR4lqFYABxBDDXO2IuyEtcAYuT 2NOr1/dX8bxVJCKelq9I/jDTHwn7Fwqnv4uybCeKdDczCctIZoD8z+vl6eu8P0hbzb8Z CPfg== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id b7-v6si10300731wrj.176.2018.10.07.12.24.13; Sun, 07 Oct 2018 12:24:15 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id A2181689CCB; Sun, 7 Oct 2018 22:23:50 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail.molkentin.net (mail.molkentin.net [138.201.121.149]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 9B4FD68070E for ; Sun, 7 Oct 2018 22:23:43 +0300 (EEST) Received: from localhost (localhost4.localdomain4 [127.0.0.1]) by mail.molkentin.net (Postfix) with ESMTP id D9E0BDD073; Sun, 7 Oct 2018 21:24:04 +0200 (CEST) X-Virus-Scanned: amavisd-new at example.com Received: from mail.molkentin.net ([127.0.0.1]) by localhost (mail.molkentin.net [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id FKC1GsGDZLjI; Sun, 7 Oct 2018 21:24:03 +0200 (CEST) Received: from oldnewthing.club.berlin.ccc.de (dancefloor-nat.fuckup.club.berlin.ccc.de [195.160.172.42]) (using TLSv1.2 with cipher DHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) (Authenticated sender: daniel@molkentin.de) by mail.molkentin.net (Postfix) with ESMTPSA id 6360DDCE0D; Sun, 7 Oct 2018 21:24:03 +0200 (CEST) From: Daniel Molkentin To: ffmpeg-devel@ffmpeg.org Date: Sun, 7 Oct 2018 21:23:47 +0200 Message-Id: <20181007192347.2230-1-daniel@molkentin.de> X-Mailer: git-send-email 2.17.1 Subject: [FFmpeg-devel] [PATCH 3/5] libavfilter/ebur128: add gaugetype option X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Cc: Conrad Zelck , Daniel Molkentin MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Allow to show short term instead of momentary. Useful for monitoring whilst live mixing. Signed-off-by: Daniel Molkentin Signed-off-by: Conrad Zelck --- doc/filters.texi | 9 ++++++++- libavfilter/f_ebur128.c | 21 +++++++++++++++++++-- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/doc/filters.texi b/doc/filters.texi index bd5154f9be..0363daffbb 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,12 @@ 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 @code{momentary} and s +@code{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..9fd4bcef0a 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 { @@ -151,6 +152,12 @@ enum { PEAK_MODE_TRUE_PEAKS = 1<<2, }; +enum { + GAUGE_TYPE_MOMENTARY = 0, + GAUGE_TYPE_SHORTTERM = 1, +}; + + #define OFFSET(x) offsetof(EBUR128Context, x) #define A AV_OPT_FLAG_AUDIO_PARAM #define V AV_OPT_FLAG_VIDEO_PARAM @@ -170,6 +177,9 @@ 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", "set gauge display type", OFFSET(gauge_type), AV_OPT_TYPE_INT, {.i64 = 0 }, 0, INT_MAX, V|F, "type" }, + { "momentary", "display momentary value", 0, AV_OPT_TYPE_CONST, {.i64 = GAUGE_TYPE_MOMENTARY}, INT_MIN, INT_MAX, V|F, "type" }, + { "shortterm", "display short-term value", 0, AV_OPT_TYPE_CONST, {.i64 = GAUGE_TYPE_SHORTTERM}, INT_MIN, INT_MAX, V|F, "type" }, { NULL }, }; @@ -741,9 +751,16 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *insamples) if (ebur128->do_video) { int x, y, ret; uint8_t *p; + double gauge_value; + + if (ebur128->gauge_type == GAUGE_TYPE_MOMENTARY) { + 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 +772,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);