From patchwork Thu Apr 9 11:07:17 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Limin Wang X-Patchwork-Id: 18791 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id 3381544AD15 for ; Thu, 9 Apr 2020 14:07:35 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 1B89C68B7D0; Thu, 9 Apr 2020 14:07:35 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-pg1-f193.google.com (mail-pg1-f193.google.com [209.85.215.193]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 1D50768B5C2 for ; Thu, 9 Apr 2020 14:07:28 +0300 (EEST) Received: by mail-pg1-f193.google.com with SMTP id r4so4833683pgg.4 for ; Thu, 09 Apr 2020 04:07:28 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id; bh=2LwufRGzyj7Ld8TV5mN7gmsZ3ZvtjGQjtb5DRao28Ns=; b=ZdriyIVbONnjhgt4YMEkDIPtUr1vJmWPJbCVitRnOedCZjAiFjy5smD6SHovCsln/B 9flygMOrLsLLDuqUlzC12j4B3QmfUgDPXx5pSbCbnSxyH+Qi3Ry7ykj1HQuJXUoUvOh9 I4kmn4A5ufcOtGDaAohFkB+IEQmZEGh/t6NXzcjeYFbfpd+ocRUQ/kXLJS0HLPp6b3Nt EHPG9jBfuo5R1Ee0jT7uiAXOUyxB/glEaYlL37b+6v8cxVMqdmdqvIto8sjcA7PjOOtB xf/2HbnIPyiWMZL1YyFL0ge1OqERNNJW7aVh5k4Q4tUp0yPG9MVV2bLmMD8wa/YdHY6u yn3A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=2LwufRGzyj7Ld8TV5mN7gmsZ3ZvtjGQjtb5DRao28Ns=; b=RH/B/lupHuSeZELzpIQte0D9FW3MtPdBSclONL22edEtNg+joPvfcMcPortuujxDZC sNY51zTXxPdck/o+uhhGx5Qo/WBrYwlaLi42JqiqFQYVezH2B/zmNOb4kVPUUcY6E1cb WbMC9hui2Zq4xk1D/bliZ1QGQumavzJtCMbjJDVQkdsKf4otMVP5qqEgjlhkADAKXxyA s2Z/Vq/Dytj978vdf9qbt2zd0c/eSPFdEJvibRcyYURZj9M7nVecVyCCBNP/o6WXPCT9 53l1134BaJYmhteQxib/cj3x346tMqQ23OcAoiIUMEnwMQiJjM4ybp+WcMLTpfmbLUEk kd2Q== X-Gm-Message-State: AGi0Pub6ncy3UUfP5d53/gfzAoDNwwGeZn7+uxslBOv8lFZDGWxvb/DQ 1S/jYPTy0lROtT0qTvL1CJxshdPN X-Google-Smtp-Source: APiQypJ80eK+h8sT8r39UVH22geJ5j4xEg1YiuHWxGLucUj0E1ICL0LSY9xgnEODXgJOULzYMYZa7Q== X-Received: by 2002:a63:d351:: with SMTP id u17mr11289593pgi.396.1586430445992; Thu, 09 Apr 2020 04:07:25 -0700 (PDT) Received: from vpn.localdomain ([47.90.99.151]) by smtp.gmail.com with ESMTPSA id k17sm18977042pfp.194.2020.04.09.04.07.24 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Thu, 09 Apr 2020 04:07:25 -0700 (PDT) From: lance.lmwang@gmail.com To: ffmpeg-devel@ffmpeg.org Date: Thu, 9 Apr 2020 19:07:17 +0800 Message-Id: <20200409110720.6965-1-lance.lmwang@gmail.com> X-Mailer: git-send-email 2.9.5 Subject: [FFmpeg-devel] [PATCH v1 1/4] avfilter/af_loudnorm: Add file option for the measured stats 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: Limin Wang MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" From: Limin Wang Signed-off-by: Limin Wang --- doc/filters.texi | 3 +++ libavfilter/af_loudnorm.c | 54 +++++++++++++++++++++++++++++++++++++-- 2 files changed, 55 insertions(+), 2 deletions(-) diff --git a/doc/filters.texi b/doc/filters.texi index 3931d8d79e..738a40df4e 100644 --- a/doc/filters.texi +++ b/doc/filters.texi @@ -4285,6 +4285,9 @@ Options are true or false. Default is false. @item print_format Set print format for stats. Options are summary, json, or none. Default value is none. + +@item file, f +Set file path for the measured stats @end table @section lowpass diff --git a/libavfilter/af_loudnorm.c b/libavfilter/af_loudnorm.c index 314b25fa39..bf530195e4 100644 --- a/libavfilter/af_loudnorm.c +++ b/libavfilter/af_loudnorm.c @@ -20,6 +20,8 @@ /* http://k.ylo.ph/2016/04/04/loudnorm.html */ +#include "libavutil/avstring.h" +#include "libavformat/avio.h" #include "libavutil/opt.h" #include "avfilter.h" #include "internal.h" @@ -62,6 +64,9 @@ typedef struct LoudNormContext { int linear; int dual_mono; enum PrintFormat print_format; + AVIOContext* pb; + char *filename; + void (*print)(AVFilterContext *ctx, const char *msg, ...) av_printf_format(2, 3); double *buf; int buf_size; @@ -119,6 +124,8 @@ static const AVOption loudnorm_options[] = { { "none", 0, 0, AV_OPT_TYPE_CONST, {.i64 = NONE}, 0, 0, FLAGS, "print_format" }, { "json", 0, 0, AV_OPT_TYPE_CONST, {.i64 = JSON}, 0, 0, FLAGS, "print_format" }, { "summary", 0, 0, AV_OPT_TYPE_CONST, {.i64 = SUMMARY}, 0, 0, FLAGS, "print_format" }, + { "file", "set file path for the measured stats", OFFSET(filename), AV_OPT_TYPE_STRING, {.str=NULL}, FLAGS }, + { "f", "set file path for the measured stats", OFFSET(filename), AV_OPT_TYPE_STRING, {.str=NULL}, FLAGS }, { NULL } }; @@ -781,6 +788,30 @@ static int config_input(AVFilterLink *inlink) return 0; } +static void print_log(AVFilterContext *ctx, const char *msg, ...) +{ + va_list va; + + va_start(va, msg); + if (msg) + av_vlog(ctx, AV_LOG_INFO, msg, va); + va_end(va); +} + +static void print_file(AVFilterContext *ctx, const char *msg, ...) +{ + LoudNormContext *s = ctx->priv; + va_list va; + + va_start(va, msg); + if (msg) { + char buf[1024]; + vsnprintf(buf, sizeof(buf), msg, va); + avio_write(s->pb, buf, av_strnlen(buf, sizeof(buf))); + } + va_end(va); +} + static av_cold int init(AVFilterContext *ctx) { LoudNormContext *s = ctx->priv; @@ -799,6 +830,22 @@ static av_cold int init(AVFilterContext *ctx) } } + if (s->print_format != NONE && s->filename) { + s->print = print_file; + } else { + s->print = print_log; + } + + if (s->filename) { + int ret = avio_open(&s->pb, s->filename, AVIO_FLAG_WRITE); + if (ret < 0) { + char buf[128]; + av_strerror(ret, buf, sizeof(buf)); + av_log(ctx, AV_LOG_ERROR, "Could not open %s: %s\n", s->filename, buf); + return ret; + } + } + return 0; } @@ -836,7 +883,7 @@ static av_cold void uninit(AVFilterContext *ctx) break; case JSON: - av_log(ctx, AV_LOG_INFO, + s->print(ctx, "\n{\n" "\t\"input_i\" : \"%.2f\",\n" "\t\"input_tp\" : \"%.2f\",\n" @@ -863,7 +910,7 @@ static av_cold void uninit(AVFilterContext *ctx) break; case SUMMARY: - av_log(ctx, AV_LOG_INFO, + s->print(ctx, "\n" "Input Integrated: %+6.1f LUFS\n" "Input True Peak: %+6.1f dBTP\n" @@ -899,6 +946,9 @@ end: av_freep(&s->limiter_buf); av_freep(&s->prev_smp); av_freep(&s->buf); + + if (s->pb) + avio_closep(&s->pb); } static const AVFilterPad avfilter_af_loudnorm_inputs[] = {