From patchwork Fri May 5 23:53:06 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paul B Mahol X-Patchwork-Id: 41505 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:dca6:b0:f3:34fa:f187 with SMTP id ky38csp841883pzb; Fri, 5 May 2023 16:53:46 -0700 (PDT) X-Google-Smtp-Source: ACHHUZ7dJWcW5/q//yc7fsI+AOjTtYAK0bHULZCxN7+9W+QaGDK+SPZ4HAbWiSpEGvFhfO/lsFqG X-Received: by 2002:a17:907:26c2:b0:8b1:3467:d71b with SMTP id bp2-20020a17090726c200b008b13467d71bmr2628681ejc.48.1683330826285; Fri, 05 May 2023 16:53:46 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1683330826; cv=none; d=google.com; s=arc-20160816; b=e+ouk7IkHUaqNUD8OYfmE3Ujdtk/zFdmeCsdCqbw8UFUWor9CZXqWBOWejw4sFyQln wXH+TIoKICHE9OSySVkP/yQKw2SdgjlMNEJXZM/Fh7VR4zJeFmbul2I7lF+dKAMrz/AF bAyuxvlfcnKEpDakaiOe1DNtdz4yeiYIbrHt7uDP/cedK6MKoQAVV6tld8Vc/ntfGMGS Oje5uKzFSxhC+5CtQP91p/qglm8bebTHTpS3i6UqiYobCe53tWGveSEDhO85Cd/AVC93 yqRWtoFwckkBdqvhBnrWPuaOt3wlgKefwWX2xg78o9DOAkj/KPW3qI5DEMi0IQVFBWKs SWrg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:reply-to:list-subscribe:list-help:list-post :list-archive:list-unsubscribe:list-id:precedence:subject:to :message-id:date:from:mime-version:dkim-signature:delivered-to; bh=a6zQ3ClHdP/1PFfSBaSaQ5Y5gkItZlP6FOOhaTvutAU=; b=yjawkN+cCIz53h2CAVVolzdDWcuwTIi2gC8uaIN+MqN3PVnRLCWKw6utYaYDlDeJzj 2uIpVDDZWHNHBnuexUGF7DvaUOMtd42PVD5xZVRKW/FWa8qXHtoLaWtcU75K30w9tNcn cjCyMCVwb5Lqn1t2QkS3Rcq5MHH6mj0TY+4l+6vf3RhAzk7uvMnFEMFAt+heJBUI7IS4 hwJ1ihTDY228Vcv0Dmawr14/xJOvsByLnISTBoxxzepU8x3Ej6C+umrllsVdxh7y428u nGbnxvqWBfkBkowoZWa3u8XPb1EEHVO5wuNSxwmaUbdreSen4OjNL6JOxy7EgocY04Ar urGA== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20221208 header.b=avJddnCk; 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; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id kt12-20020a170906aacc00b0095ece5cf770si1939699ejb.695.2023.05.05.16.53.45; Fri, 05 May 2023 16:53:46 -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; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20221208 header.b=avJddnCk; 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; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id A235168C1AC; Sat, 6 May 2023 02:53:41 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-vk1-f172.google.com (mail-vk1-f172.google.com [209.85.221.172]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 35B6E68C17B for ; Sat, 6 May 2023 02:53:35 +0300 (EEST) Received: by mail-vk1-f172.google.com with SMTP id 71dfb90a1353d-44ffef66dabso956989e0c.2 for ; Fri, 05 May 2023 16:53:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20221208; t=1683330814; x=1685922814; h=to:subject:message-id:date:from:mime-version:from:to:cc:subject :date:message-id:reply-to; bh=oUhwCkDy+dA+Q3SX8M4AH60eCS/MiZFxVdxb3ilTxfs=; b=avJddnCkYxg5E6fFUXSaCJBFT9OuJZ1wT/BCZuT3/B4VDI35tL+dqfGGnnTd8DL40k XU7YEdThFXUNj+fSzhGjMSC8CwW74HAmkSn5iG46hDafB2uADvpJbElCXaNiWC0VnsF7 CM2+sDrPnOTDtVo9LG5RsGEDcAERNqIWCe6cD5e2gN0StM9mIgYEte8vCAx9e2GEaA5p rMwsgzyiMfDymwUckvsstMZEGQxaZQZCzduNSapR2duJA0PxtT8Wnp2H5NnMe+Sfj4z5 23wzya4jbjpytAfAWsl2hdghViNwGzMXSrB2AD9tryfEnRo10I/kWslF69aCS/wGI41/ AYxg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1683330814; x=1685922814; h=to:subject:message-id:date:from:mime-version:x-gm-message-state :from:to:cc:subject:date:message-id:reply-to; bh=oUhwCkDy+dA+Q3SX8M4AH60eCS/MiZFxVdxb3ilTxfs=; b=Iv6hK1uvxl6L8W1vNBB3BZy1xWHJhxBK5B3yjW4OHee/2r2dg5V9z3oA/K9X4MzvBd 2ZXBUvEA7dJPHxrbFjDfika0KkOgGMEiDwlmeT2NwrDpu3TsZNqbdJy8MdGUJHwyPT7K OhrF+5u9tgzGCZifHg5mhRqeTMw+sj32nVmTD+TwOrGB8OHT2WtXG7veryY0LBbz+s84 UUlRYY58vhUoTJ3oEpcjiciIf3xMe/7Y0jH/lW0ST5NhfsPf2vtDvWD8n78aMoZj4XXY Xh9eH04F+7p5vFz5+fGwhLfNZSf6DE5Td0SlANgxhqjwQokANwPFPf5NQXhjQ1CK9Cda RIDA== X-Gm-Message-State: AC+VfDyiW7RRc7Ktdc+1pat1ECp2GI8lD/mGK5zCmi3bh3frhyhPY1Vg HbIwRLBweDwkW9yQSGBj/5h2/OjKcaC2d63+iS2CB8ew X-Received: by 2002:a1f:3f08:0:b0:43b:3fda:1fba with SMTP id m8-20020a1f3f08000000b0043b3fda1fbamr1028485vka.6.1683330813655; Fri, 05 May 2023 16:53:33 -0700 (PDT) MIME-Version: 1.0 From: Paul B Mahol Date: Sat, 6 May 2023 01:53:06 +0200 Message-ID: To: FFmpeg development discussions and patches X-Content-Filtered-By: Mailman/MimeDel 2.1.29 Subject: [FFmpeg-devel] [PATCH] avfilter/af_replaygain: export results into read-only options X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: 6FoqH0w548bj Attached. From 4c9bf661c74e598c623d05e4a170e5b48150e7cd Mon Sep 17 00:00:00 2001 From: Paul B Mahol Date: Sat, 6 May 2023 01:50:08 +0200 Subject: [PATCH] avfilter/af_replaygain: export results into read-only options Signed-off-by: Paul B Mahol --- doc/filters.texi | 10 ++++++++++ libavfilter/af_replaygain.c | 37 ++++++++++++++++++++++++++++++++----- 2 files changed, 42 insertions(+), 5 deletions(-) diff --git a/doc/filters.texi b/doc/filters.texi index 61c424a5fd..f5fc0811d7 100644 --- a/doc/filters.texi +++ b/doc/filters.texi @@ -6065,6 +6065,16 @@ ReplayGain scanner filter. This filter takes an audio stream as an input and outputs it unchanged. At end of filtering it displays @code{track_gain} and @code{track_peak}. +The filter accepts the following exported read-only options: + +@table @option +@item track_gain +Exported track gain in dB at end of stream. + +@item track_peak +Exported track peak at end of stream. +@end table + @section resample Convert the audio sample format, sample rate and channel layout. It is diff --git a/libavfilter/af_replaygain.c b/libavfilter/af_replaygain.c index 53852ac8bc..128454aa6b 100644 --- a/libavfilter/af_replaygain.c +++ b/libavfilter/af_replaygain.c @@ -23,8 +23,11 @@ * ReplayGain scanner */ +#include + #include "libavutil/avassert.h" #include "libavutil/channel_layout.h" +#include "libavutil/opt.h" #include "audio.h" #include "avfilter.h" #include "internal.h" @@ -306,8 +309,11 @@ static const ReplayGainFreqInfo freqinfos[] = }; typedef struct ReplayGainContext { + const AVClass *class; + uint32_t histogram[HISTOGRAM_SLOTS]; float peak; + float gain; int yule_hist_i, butter_hist_i; const double *yule_coeff_a; const double *yule_coeff_b; @@ -576,13 +582,22 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *in) return ff_filter_frame(outlink, in); } -static av_cold void uninit(AVFilterContext *ctx) +static int request_frame(AVFilterLink *outlink) { + AVFilterContext *ctx = outlink->src; ReplayGainContext *s = ctx->priv; - float gain = calc_replaygain(s->histogram); + int ret = 0; - av_log(ctx, AV_LOG_INFO, "track_gain = %+.2f dB\n", gain); - av_log(ctx, AV_LOG_INFO, "track_peak = %.6f\n", s->peak); + ret = ff_request_frame(ctx->inputs[0]); + + if (ret == AVERROR_EOF) { + s->gain = calc_replaygain(s->histogram); + + av_log(ctx, AV_LOG_INFO, "track_gain = %+.2f dB\n", s->gain); + av_log(ctx, AV_LOG_INFO, "track_peak = %.6f\n", s->peak); + } + + return ret; } static const AVFilterPad replaygain_inputs[] = { @@ -598,14 +613,26 @@ static const AVFilterPad replaygain_outputs[] = { { .name = "default", .type = AVMEDIA_TYPE_AUDIO, + .request_frame = request_frame, }, }; +#define OFFSET(x) offsetof(ReplayGainContext, x) +#define FLAGS AV_OPT_FLAG_AUDIO_PARAM|AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_EXPORT|AV_OPT_FLAG_READONLY + +static const AVOption replaygain_options[] = { + { "track_gain", "track gain (dB)", OFFSET(gain), AV_OPT_TYPE_FLOAT,{.dbl=0}, -FLT_MAX, FLT_MAX, FLAGS }, + { "track_peak", "track peak", OFFSET(peak), AV_OPT_TYPE_FLOAT,{.dbl=0}, -FLT_MAX, FLT_MAX, FLAGS }, + { NULL } +}; + +AVFILTER_DEFINE_CLASS(replaygain); + const AVFilter ff_af_replaygain = { .name = "replaygain", .description = NULL_IF_CONFIG_SMALL("ReplayGain scanner."), - .uninit = uninit, .priv_size = sizeof(ReplayGainContext), + .priv_class = &replaygain_class, .flags = AVFILTER_FLAG_METADATA_ONLY, FILTER_INPUTS(replaygain_inputs), FILTER_OUTPUTS(replaygain_outputs), -- 2.39.1