From patchwork Mon Mar 11 02:56:07 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Allan Cady X-Patchwork-Id: 46947 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:dc95:b0:1a1:738b:6bc0 with SMTP id ky21csp985204pzb; Sun, 10 Mar 2024 19:56:31 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCUrLQ8LssM3E6oavMUZpBw3Tt4ggrv7oDrVkrGBE/M+sxVGPDsLgZ8t7FIXwbIM1nkGmzewwIvWbFPviG4SGb7k5D4cewKDSO9zsA== X-Google-Smtp-Source: AGHT+IFJ9Zqzrw8zyieHG9OxqOfXmL4JecaHBYyY1WcSWMkW/c5uaPPzAm8r4xa+iKwHftVa9T1E X-Received: by 2002:a17:906:4116:b0:a46:2b98:fdac with SMTP id j22-20020a170906411600b00a462b98fdacmr606800ejk.20.1710125791057; Sun, 10 Mar 2024 19:56:31 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1710125791; cv=none; d=google.com; s=arc-20160816; b=EjWsijnUjGnWP9oamWBzGAp3/uZZ+tJO7jwyaEvAY+JPci2WzP1d6EoxkRsdXOgfiR XAk+1gwuC6Qa5D46PNC/XnOPLABz2oucnFCvMciFkWTfTmGUJuigR9f532llfhjOTUxC L07TVOEv1d+v149kRuwreyJ6kQTvQF/l7O+pWWAmSx052rIYI4uXnIVj/EAFTbdNUr96 P7cSsrtT6gIPCUw+tIEFJ6POzIYVORszYQ2pta+m5VZchCLR+163+CLKsRmQBHIb++15 57RzbxUpYkeMOxHIn0hcQu4/1zIQY8dQmHBMPz+MfBYBxNTzakWmCthTzvvK0Sh8dAp0 FLsw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:cc:reply-to:from :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:mime-version:references:in-reply-to :message-id:date:to:delivered-to; bh=WdyekvOq7XzrIUBFkAcWiKIPHxUlzDDS9JFMlam8qnU=; fh=S/YeFcuJTzNpwnQtYNnkaO46vjyvP+066YP8Vbwnj3k=; b=MmHnNhoJOBFjhFmR5TW/uzMiZK+f/nQmvfeNL6IP/bXWaA5ZJCj/Q9MHhIiSDeFxsF 6qeobiY4SlA5k6f8nT6asSMouVhXUnOwAUqC8TayPUV8CxD6jB+aa5GDOy/b400g1wSS oNJKACOY/D+f60ZT09guL3epwT/ZZB85/slQovB8YSNnSbKVskKtuseLT/g7r8omgBS4 wu61D6MJfi6rxEZ3cD8HcTsNoZNEGBHR916ZzrYFPGh5MeCZR03O7kOz3z8HCUhh2sKz 1sFP3nh0MS7QkkqKk4WzE9cNBPcC1u/SccIzfieWO8COc8GKQe2a2WPxl+2s97yZGJkJ c3/Q==; dara=google.com 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 gc12-20020a170906c8cc00b00a440fd73855si2134927ejb.590.2024.03.10.19.56.30; Sun, 10 Mar 2024 19:56:31 -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 065F068B43D; Mon, 11 Mar 2024 04:56:27 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from sonic313-15.consmr.mail.bf2.yahoo.com (sonic313-15.consmr.mail.bf2.yahoo.com [74.6.133.125]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id E13AA68B43D for ; Mon, 11 Mar 2024 04:56:19 +0200 (EET) X-SONIC-DKIM-SIGN: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1710125777; bh=lrfWA7KSsjT7wwbXyyT84FFZpilePgY/4728TYxXBFL=; h=X-Sonic-MF:From:To:Subject:Date:From:Subject; b=qcHec0GHTZJF1XpnDftdW1CFFzaj3G+y2lwzD3Tw3OIyrhXE0+ZHFA0fW9XYXweiYJXF18eIEaIsfGqVy+/dNg/cAjamUmvFKnQYRZWEKrxGTD/G1z3hlOas8nSB/vntWH/J2ckASBv/vRsVoeK7A9xQKkRGDjTgVWzLwo4Mgex5RFaKPkItCYrmOLLI5JCRZO+/wpNXM6yPjWsNeakUWczuSHbw0/7rdtk/QEcKZ39y11li80ffK2i20gZfP0o5uyaSLhzDddmmh1K5+WqOV3NsRGvtmpunllGWOM4AyqWM7MzcmBiUOGq/z5AW5FzAnk2JbA3YuceMF9KAzqgr3Q== X-YMail-OSG: g7TISdAVM1kH1afNPmkl2Se60FZcPgrAXe_agzMkkt_TnoUN0rB.DpGfZSeZb13 07nCxeTLbicahoJx48GUJl9pBNi1UoSWbPiYwqm0ror_F3yDLb7Jn_AHTVt8_cgLXj6I4TKV3N4i rmvOIVD9JqtSbejgwId7MQ85Re7sBwCo1_K5njs9cRALmGkp.ltJQ3zc59ejlCE.74kQQ1VBzW5U vNXHko_ALFiDW77ZolTbLCdwtiQ2ms37rZqKBNLkoBWmtGAnwoyZDzroBnpVRGIbSp9hFTdak3u5 y27jLw6hJrdqCdPwKVGWgltxefticcTLRl5l3r9aSGlf4DOFfzkN8mdWnKXS1WOXWGloqrY8gz3T QEMrR0ZaYzgXrfcomwNlAXpzZvj3TxGEVRnH_XgQqy.ExbgKYPXncWHzOw2mLtBJOiFsPoAOPhCS G3LOWJm6sd7qrqyNQ.3it0D9yMr3lxYbmz9X84Gc5L4odfKA.p6Jgv7vcEDRGKXodnqYqby8A5.m XU9YEG2F5QPWIhh1IlSnTZF8gAdmI6YLdYCTO2PmuDr4_p7Ogywja2jk4Vck8z8rNE3.dxpXtVlM tLpM55G_1eklEr8kzzgxLULgIK4htT9lgPko.HnbYtUMjY4bOMINIGZeZ68vSDDZEFanUZjAZs07 0.oiE5LK1L6Mja4Fi1Ns7Vr6bko0u4U6.yBgZ2DwNoD8gWuY4zypjm7IEFFH6j0ikWOUaOo3TZP2 yMz9k212I6jVf.bs7l29_DI9tWKOTojEAqj2UbI1msyJfAi2vh5UA0BQpHm3N13emyW5fkWaUI_. nKbFEF1HL1huZ9HNPuqouuTuHLclUspYywYcOty4NDCltX6H7iLAcvc_jSE975zxklIosYqtXh3q 8oR1GrMUf9cNodSoPE5bC4FvMcEpGOYuwH37I6pYPdTJ2z04Ga8S5eKZeS_5.6Co61g6LFi85PVs E7O1tibwYBJlKBqIig8lN3qT4i.mJrRSlVUfjbYnNZARiKH69YTwGRWk8WMu1N2OGkR0yAoMAket Z54YfGFGYBXUO8k9bztdITdSKzDL7D6nLhxwld_Uv0EzXhH75rZ6gL5.OcicyEgl1NvhyH7vdlaI iQk5t07nP6xI.P3EQcFgfYtcR2z_HcKajwdO8TgFQvUciaQ9rNylLQd9qqbhOlUXH_xAzycyKvMy BvG9MiMdaeb.R.9FGQ7Q2tJMaoLJ0GbaamEi09HVZe8HQNafDV3LT9KT5GKP8qMQoxwzOHXJrRis WT8nhUfdTFv5iFN5bjXI136v5fTZHTi3IPw0zdasMaqFdZdhHs12BJpXew4VF_6BjQWedX6C__kr 1fS2pisyptOWrLaWytf0Gt9wnt_xS5jA.daDWVe.XZNpG7eCE3nPckJqksXCRcos2vzqCiknJETX dwDx1JH2ThWpN9P4jKVe1BTH3uc4W3jri9uin.BSE.Mxqt2dEsyC577uYecQWH6wqMKpbZRUWhEa gygpusVVbQ0X8fnRECNmLuY_XFS4BnLDQXgmGOSYIlOJNJ7YgPVBg5IA13dQS9CJKKA7RWy9pwDV VFprei4CQcpc4B.KWUnD4Q85Bi_RUlN6UJxuoqoiDyJoRl8GGCb47h_YFYchYhzupuceVjXEzaWx FPd3mIGXr.qptZ0bMSN3qp.ppnrmoCSkm8iqICBFmXJEw2qgn3v1yfLCz8Y_PD.L5puEVYDWphyq xz3b9r4aKdVoxB1_7OnfZTOwMj00WE5o3CbGnSCfdFygX2J9vTFMHRCa7G59kOOlDOTx80EyvQS1 rY_c7G0CWfmqZPQTp_MvbGevaeIykI2GuVP4WQu.w4cQm.lj384TesDEOCGea7L9CxyeAmpDxRfz QKUbe6KAhBjjStE44kCyAzH_MaTY_nj9U3Z_dqifCeNojzBElbjs.21BXajlo8R4SclH76wdWm33 37wchdprHa5iW11th2eNiZ6VLNQ9MgeEFDWhWqOEwB090Gl0FkkU8nqk8w3W51K0fdeD2D.W2jXN q0pteC2jDc22pr.LMYjCWaOKSll16cumXrtKrhPOfGe8kJhUFGObeEM.4ChD9baus5WAe93LUXs0 JZTBPdwDhSqjD1yoFlegSsWak3kvBCz0PZOZ4D7gjg_DNOFiV5STrnZ2nTU1qZC5q7HDZcGNsU.W lCVL4Qhbpp7jmZYOVFD_63XwHKGrOj1y63MQHGHpupsuXFV94cZg7WC469nXU41IGTkuG.Xt_rTL HTpZkKZVDt98AV4gtUE5B7f31jgJD1GiiNwxVX6zvqDn4_unNkwY- X-Sonic-MF: X-Sonic-ID: 00f852bd-31ff-4803-9d7e-bd48a3e161d7 Received: from sonic.gate.mail.ne1.yahoo.com by sonic313.consmr.mail.bf2.yahoo.com with HTTP; Mon, 11 Mar 2024 02:56:17 +0000 Received: by hermes--production-gq1-5c57879fdf-nxlqc (Yahoo Inc. Hermes SMTP Server) with ESMTPA ID fe1672e20a8d6bf4297ce7c827e70259; Mon, 11 Mar 2024 02:56:13 +0000 (UTC) To: ffmpeg-devel@ffmpeg.org Date: Sun, 10 Mar 2024 19:56:07 -0700 Message-Id: <20240311025607.3468624-1-allancady@yahoo.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: References: MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH] When the silencedetect filter is run against long files, the output timestamps gradually lose precision as the scan proceeds further into the file. This is because the output is formatted (in libavutil/timestamp.h) as "%.6g", which limits the total field length. Eventually, for offsets greater than 100000 seconds (about 28 hours), fractions of a second disappear altogether, and the timestamps are logged as whole seconds. 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: , X-Patchwork-Original-From: Allan Cady via ffmpeg-devel From: Allan Cady Reply-To: FFmpeg development discussions and patches Cc: Allan Cady Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: 0PI/cNH0AQ2I From: "Allan Cady" I propose changing the format to "%.6f", which will give microsecond precision for all timestamps, regardless of offset. Trailing zeros can be trimmed from the fraction, without losing precision. If the length of the fixed-precision formatted timestamp exceeds the length of the allocated buffer (AV_TS_MAX_STRING_SIZE, currently 32, less one for the terminating null), then we can fall back to scientific notation, though this seems almost certain to never occur, because 32 characters would allow a maximum timestamp value of (32 - 1 - 6 - 1) = 24 characters. By my calculation, 10^24 seconds is about six orders of magnitude greater than the age of the universe. The fix proposed here follows the following logic: 1) Try formatting the number of seconds using "%.6f". This will always result in a string with six decimal digits in the fraction, possibly including trailing zeros. (e.g. "897234.73200"). 2) Check if that string would overflow the buffer. If it would, then format it using scientific notation ("%.8g"). 3) If the original fixed-point format fits, then trim any trailing zeros and decimal point, and return that result. Making this change broke two fate tests, filter-metadata-scdet, and filter-metadata-silencedetect. To correct this, I've modified tests/ref/fate/filter-metadata-scdet and tests/ref/fate/filter-metadata-silencedetect to match the new output. Signed-off-by: Allan Cady --- libavutil/timestamp.h | 53 +++++++++++++++++++- tests/ref/fate/filter-metadata-scdet | 12 ++--- tests/ref/fate/filter-metadata-silencedetect | 2 +- 3 files changed, 58 insertions(+), 9 deletions(-) diff --git a/libavutil/timestamp.h b/libavutil/timestamp.h index 2b37781eba..2f04f9bb2b 100644 --- a/libavutil/timestamp.h +++ b/libavutil/timestamp.h @@ -25,6 +25,7 @@ #define AVUTIL_TIMESTAMP_H #include "avutil.h" +#include #if defined(__cplusplus) && !defined(__STDC_FORMAT_MACROS) && !defined(PRId64) #error missing -D__STDC_FORMAT_MACROS / #define __STDC_FORMAT_MACROS @@ -53,6 +54,32 @@ static inline char *av_ts_make_string(char *buf, int64_t ts) */ #define av_ts2str(ts) av_ts_make_string((char[AV_TS_MAX_STRING_SIZE]){0}, ts) +/** + * Strip trailing zeros and decimal point from a string. Performed + * in-place on input buffer. For local use only by av_ts_make_time_string. + * + * e.g.: + * "752.378000" -> "752.378" + * "4.0" -> "4" + * "97300" -> "97300" + */ +static inline void av_ts_strip_trailing_zeros_and_decimal_point(char *str) { + if (strchr(str, '.')) + { + int i; + for (i = strlen(str) - 1; i >= 0 && str[i] == '0'; i--) { + str[i] = '\0'; + } + + // Remove decimal point if it's the last character + if (i >= 0 && str[i] == '.') { + str[i] = '\0'; + } + + // String was modified in place; no need for return value. + } +} + /** * Fill the provided buffer with a string containing a timestamp time * representation. @@ -65,8 +92,30 @@ static inline char *av_ts_make_string(char *buf, int64_t ts) static inline char *av_ts_make_time_string(char *buf, int64_t ts, const AVRational *tb) { - if (ts == AV_NOPTS_VALUE) snprintf(buf, AV_TS_MAX_STRING_SIZE, "NOPTS"); - else snprintf(buf, AV_TS_MAX_STRING_SIZE, "%.6g", av_q2d(*tb) * ts); + if (ts == AV_NOPTS_VALUE) + { + snprintf(buf, AV_TS_MAX_STRING_SIZE, "NOPTS"); + } + else + { + const int max_fraction_digits = 6; + + // Convert 64-bit timestamp to double, using rational timebase + double seconds = av_q2d(*tb) * ts; + + int length = snprintf(NULL, 0, "%.*f", max_fraction_digits, seconds); + if (length <= AV_TS_MAX_STRING_SIZE - 1) + { + snprintf(buf, AV_TS_MAX_STRING_SIZE, "%.*f", max_fraction_digits, seconds); + av_ts_strip_trailing_zeros_and_decimal_point(buf); + } + else + { + snprintf(buf, AV_TS_MAX_STRING_SIZE, "%.8g", seconds); + } + + } + return buf; } diff --git a/tests/ref/fate/filter-metadata-scdet b/tests/ref/fate/filter-metadata-scdet index ca5dbaaefc..d385920fcd 100644 --- a/tests/ref/fate/filter-metadata-scdet +++ b/tests/ref/fate/filter-metadata-scdet @@ -1,11 +1,11 @@ pts=1620|tag:lavfi.scd.score=59.252|tag:lavfi.scd.mafd=60.175|tag:lavfi.scd.time=2.7 pts=4140|tag:lavfi.scd.score=36.070|tag:lavfi.scd.mafd=44.209|tag:lavfi.scd.time=6.9 -pts=5800|tag:lavfi.scd.score=55.819|tag:lavfi.scd.mafd=55.819|tag:lavfi.scd.time=9.66667 +pts=5800|tag:lavfi.scd.score=55.819|tag:lavfi.scd.mafd=55.819|tag:lavfi.scd.time=9.666667 pts=6720|tag:lavfi.scd.score=18.580|tag:lavfi.scd.mafd=22.505|tag:lavfi.scd.time=11.2 pts=8160|tag:lavfi.scd.score=49.240|tag:lavfi.scd.mafd=49.444|tag:lavfi.scd.time=13.6 -pts=9760|tag:lavfi.scd.score=51.497|tag:lavfi.scd.mafd=51.801|tag:lavfi.scd.time=16.2667 -pts=14080|tag:lavfi.scd.score=34.165|tag:lavfi.scd.mafd=34.337|tag:lavfi.scd.time=23.4667 -pts=15700|tag:lavfi.scd.score=58.310|tag:lavfi.scd.mafd=58.315|tag:lavfi.scd.time=26.1667 -pts=18500|tag:lavfi.scd.score=16.504|tag:lavfi.scd.mafd=19.603|tag:lavfi.scd.time=30.8333 +pts=9760|tag:lavfi.scd.score=51.497|tag:lavfi.scd.mafd=51.801|tag:lavfi.scd.time=16.266667 +pts=14080|tag:lavfi.scd.score=34.165|tag:lavfi.scd.mafd=34.337|tag:lavfi.scd.time=23.466667 +pts=15700|tag:lavfi.scd.score=58.310|tag:lavfi.scd.mafd=58.315|tag:lavfi.scd.time=26.166667 +pts=18500|tag:lavfi.scd.score=16.504|tag:lavfi.scd.mafd=19.603|tag:lavfi.scd.time=30.833333 pts=20040|tag:lavfi.scd.score=13.764|tag:lavfi.scd.mafd=19.060|tag:lavfi.scd.time=33.4 -pts=21760|tag:lavfi.scd.score=64.451|tag:lavfi.scd.mafd=64.551|tag:lavfi.scd.time=36.2667 +pts=21760|tag:lavfi.scd.score=64.451|tag:lavfi.scd.mafd=64.551|tag:lavfi.scd.time=36.266667 diff --git a/tests/ref/fate/filter-metadata-silencedetect b/tests/ref/fate/filter-metadata-silencedetect index bc53fea047..e66ffe5fdd 100644 --- a/tests/ref/fate/filter-metadata-silencedetect +++ b/tests/ref/fate/filter-metadata-silencedetect @@ -1,5 +1,5 @@ pts=0|tag:lavfi.silence_duration=0.523107|tag:lavfi.silence_end=0.690023|tag:lavfi.silence_start=0.736417 -pts=46080|tag:lavfi.silence_start=1.27626|tag:lavfi.silence_end=1.80751|tag:lavfi.silence_duration=0.531247 +pts=46080|tag:lavfi.silence_start=1.276259|tag:lavfi.silence_end=1.807506|tag:lavfi.silence_duration=0.531247 pts=92160 pts=138240 pts=184320