From patchwork Sun Oct 7 16:02:27 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Daniel Molkentin X-Patchwork-Id: 10586 Delivered-To: ffmpegpatchwork@gmail.com Received: by 2002:ab0:73d2:0:0:0:0:0 with SMTP id m18csp2672537uaq; Sun, 7 Oct 2018 09:03:19 -0700 (PDT) X-Google-Smtp-Source: ACcGV61juVlEq/+XQNb0jmgtDCz2pfwtqOdM/zUl4EfpwP6Q5glOHksp4y6rUkCCoHdzxS0HRlsd X-Received: by 2002:a1c:3e48:: with SMTP id l69-v6mr12621573wma.143.1538928199551; Sun, 07 Oct 2018 09:03:19 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1538928199; cv=none; d=google.com; s=arc-20160816; b=elD+BEVW0ICgjKV5fAkOX180avNcUcf2mkR+HSaZgmVkvWy5KHFBurNGAxwe7TsvYS sVyT77WAMCQF4kC7c3SNfieQWdmeH58Fs2QIq+LPqbm0XZqqSC8ILkQlucRTcW4e1Ymb SWouRC+Yiu685pFa5NavPzVDuEKFDv3QY7GIilxKNI3nwyxtb8XmoGO8pyQTux5Rcq2w u8ryltFHLaVfu5kOKrR/Pl8tBs1vD5OGXFn8IFiAsXySs+vjvTT2oYJkkJCLsbtKnMBg tqRbrbm1VoNInrAupF79Ile6maN25pW6Dfd+T0e7FMLHAL0BeSm6fccbGvtyrPzVN9J+ plew== 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:references:in-reply-to:message-id:date :to:from:delivered-to; bh=GxrEF8sJj2F5et3ihz+4DqutDdUcIVCmMbb3wGJGHko=; b=E7IXJea0tSm+GVNMu0CfvVNmA01ZdMlgkZGkMqmp+ABJF065BkzDN4PqY/qtp73eGO EQ7YLR9FRzQ711cT+DDtrvUeIHQRpBpkgwcoLuBssiZFL3PvhZtmec0n2wRVqTqppH4e dZbviH8gmyP+My2vcMwynZM/Hb952LnQ94vUuPBi/LFtKcypaHefL/Y1STr/sg8Qw4ZQ E8UBkrCj3bW1zvu03kyjUpanWfvVj3nj72fjXzCpdobmJu7rgiMOX5An+SoEBmiwmRiP 7LWJ03/MrrBIKeshk1KSmBp5PrTsbrXZ39d+QQfcaOc3rRGLF16fopH53ZhDbDSbrX35 DAYw== 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 r13-v6si11487099wrt.313.2018.10.07.09.03.19; Sun, 07 Oct 2018 09:03:19 -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 97C3168A180; Sun, 7 Oct 2018 19:02:31 +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 76AC368A0A0 for ; Sun, 7 Oct 2018 19:02:24 +0300 (EEST) Received: from localhost (localhost4.localdomain4 [127.0.0.1]) by mail.molkentin.net (Postfix) with ESMTP id BA563D0393; Sun, 7 Oct 2018 18:02:45 +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 TcMbSaXSGnEr; Sun, 7 Oct 2018 18:02:44 +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 7D530D0515; Sun, 7 Oct 2018 18:02:43 +0200 (CEST) From: Daniel Molkentin To: ffmpeg-devel@ffmpeg.org Date: Sun, 7 Oct 2018 18:02:27 +0200 Message-Id: <20181007160229.18250-4-daniel@molkentin.de> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20181007160229.18250-1-daniel@molkentin.de> References: <20181007160229.18250-1-daniel@molkentin.de> 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 | 8 +++++++- libavfilter/f_ebur128.c | 18 ++++++++++++++++-- 2 files changed, 23 insertions(+), 3 deletions(-) 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);