From patchwork Wed Feb 21 07:39:15 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Allan Cady X-Patchwork-Id: 46407 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:1b29:b0:19e:cdac:8cce with SMTP id ch41csp148240pzb; Tue, 20 Feb 2024 23:39:36 -0800 (PST) X-Forwarded-Encrypted: i=2; AJvYcCWFW34Xe3kbEu7dk8Oa+CVOc/qGc320skhiDtZQJIBqgRCmISf41vkCbzMIQ2/7ol37R443hm7Rop/S7shv12kexWHePU7DL0rmVw== X-Google-Smtp-Source: AGHT+IGkknbDOriuNk14/7dmNSXZIvbRKIjNKtfp+ctE9b+XN1WIepXbAyNA/qx9sumxXBF8q5g+ X-Received: by 2002:a17:906:7f18:b0:a3e:7d76:6559 with SMTP id d24-20020a1709067f1800b00a3e7d766559mr9106922ejr.33.1708501176371; Tue, 20 Feb 2024 23:39:36 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1708501176; cv=none; d=google.com; s=arc-20160816; b=xruhd2gJHTN7jeKaypsFaEgiDSBnzZPtrUTlnKnu7ztJBXyqzlL3zYNRYzRlYLvsG3 injhnofGEV8rDbr1w1Pa1DS+jNdTjRBbs/qkqEfgKk4/GgnDLc7VyH43oQh6NcvKo5V6 IAaVmo2IyIinzviRUbzTaUTp68E1sAkE5xMheCJtyyT0XudbT36R+B5SVR0cdvMsZDyd r0tKR+bEpI4KeodCwbpYpgFGDw7ighlrMdNnDvdaNNNzQLQKoJgWU+jN18l9OUO5QMiI Ih5R+XEydgmesTVnSsFysBg0mrWcHeXwjJNuAmV+BfKZBDJvz8lteCQQBRMNUJoe6eSE 8T2w== 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:references:mime-version:message-id:date :to:delivered-to; bh=AzT01O2zQw/HTReN34AAh5atp2DQxcTmgGfg8vdSQK4=; fh=S/YeFcuJTzNpwnQtYNnkaO46vjyvP+066YP8Vbwnj3k=; b=uUkdpLPr1bRw/cMLVRrSiKexh0MtgR1Bhs9Emf9boJGDHnRGMR5+/obbBHkAwUU/fN J43DXpwU00sBm0oUll3wYjDrcGtXomEOwZ70btAeNUdl7FRa/mj3niw4wRpJsEJYRnfh 4b+eyMb+rwOZLWNuTt635E70YqeIxapfuVy+Yc/acQc2Rt5vbQV+6tBNYwvuPWL7Yr9y gwnJR9ZS8Vw+TArFXxzDM9N4L/Hv5gcHHBewJYRdpzh75jvxP6RZWzXk301wm9Eyq+Fr Fkz2Xc7RIpMWfxJ1qSzaeHfLc4Husfs4qJsGg6aufsp79gXwzFQ3adUjAxkU4E/MWNZV purg==; 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 pk18-20020a170906d7b200b00a3ea08a5d9csi2567646ejb.54.2024.02.20.23.39.35; Tue, 20 Feb 2024 23:39:36 -0800 (PST) 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 6449C68D15B; Wed, 21 Feb 2024 09:39:32 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from sonic314-15.consmr.mail.bf2.yahoo.com (sonic314-15.consmr.mail.bf2.yahoo.com [74.6.132.125]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id BA41468D0CF for ; Wed, 21 Feb 2024 09:39:25 +0200 (EET) X-SONIC-DKIM-SIGN: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1708501163; bh=ndpnYx2ygisO6JmAOj1ITWpHfXnzOVAh3o1Y784hxC9=; h=X-Sonic-MF:From:To:Subject:Date:From:Subject; b=dUXkQcKqmWM9C9Su1ex7UIteVZ8DtSV9gyYIYRA9nZPdyTfFV8O4ylT0mhD2f6cnd3xZaqSczfVN/ttkhsiNpLVBxp9VAE8PwQi6ibs606/11SYWWUWRR5/YWIWipAUhvMQOfF6wdkaSadao4FuynlN79J4z4kyAaI5veZBxdpdcFVadsEGjIk1t8d/Q0Mmp2eaQu8TFqlJZ5+Iti4ttwPSTTlbW3u7sNxBSalUQW//hoKiPIeQq0+RzLU93SYJ1D9K/hujtY1/Ivnpeti84+5RuXxbRso+eAiUmmgz3oTx6e97JXcC7xBJkAwRNRBxB8LoQgdufaw2Q7oLe2GXMjw== X-YMail-OSG: TZdkvCEVM1lWqBFKDidtdo8zIaBg6AAna7yLLNAvOWUmiEcPHzxKZK2YNW9OMzU keVBQFb75bHv13GTSJzqjw0Qlo2MToBcqYXBHtHpDk_SBpfahuVF3xDVh0pkyyJrx6qiNxJrMpSp 3SliYhzAcj5Dnv02cMoKbOFEnmaGyyJSft32sO2HV5gkZZzF59alKT7l3dsTBXc7pdgC4Lsr9_Ff pVP9v0mkyaNQ6Cnp16C1xwxcr0vIn7yCk4iXOTBg0J9dyBlhaPyEiKCAITsRxeV24UfFRlfiOJzu HNP3HIQc6rTzKQ9NiK8ZT5Z1.N5O3S5fZkeCbyJsfZhc9aFgqEI7Bj7fL9U_GAVZ6y9hEkfFNQZ2 ZK6S03YwWMShif_HL2DypwEOG2gti5Q39gN0.CEUVUMQ50fjCecL5_Bc70ZgPIC3EpgZS8EVHY5o TPgYuWh1OGhljvHuxIu7qbXvgp3CtkGl_f4_jldkq7gdbySULxg2ETGb6P1K9t_EgvjSEVFzSOJP _cCbRl96mbM2SnmLF4JIns0on9I_JK_m.2SF4FRRltU28kJy3KolqHIN6GmXACQv3xAED0M8mh4F n3SHKseVyvZWX1gm5vA6Zhz2HQC7kE1R6YSAKYVu_2gaMTUAFC32aX.3aoGfAgMupHu372QGUksq HQGR.2HJtNx.mPN_fnh_B7OyceuWgyYdEXqPnRnxUn6DjihwIHC0N4zZYEu9y07qQFSsNnEErlAb vQPRvC3.TsBSiIDPdZcB_l9eyL409v39STP3YncUNKpTqQrBlamWIuCfJN.ksHFStK5UcvUrX4_H rZRR2Bsq2cfJXYmzlCmJvd3PQfQBBWiJCEFa6w85H9QO80AQRGzxHX4hFH.8E7qg7TWN2ibSrwdY uHUfkkTv6z5RhNzBSthleBs17vsk.txcqEq7v8YBOv7nFcTFNiTzhdkggiS0BU5Ouz1COpUvbAC4 zAl.0ex3mMojY8xaDgjbRO.ISNL7tEG3zHatMnGN7AGyFtIBpC7lQF2Nb73KZtquRkVPr9IkWKE5 EmICKUpJfYjzdTC6ZLZRlOJ0YhslaJfwN6pIX4CCU9ArCHDCdH_qUZcmjp3cV1aCeIGp7z1s0QZB 5NFzJUi7QMgjU4PU1MWb6b.QRsmKd4rj6QJMqCC5zPbUDtuoi47Lg_e0YoS9k22ty4zvmsCkyIiV 86Ti9Y4T0QFn1effiMzdBd5z7JsJKEys0FTc_chAVRTKOQ1SqFOZ9y2CgsjUwYPmGK8r3hJNOy7V 1pR6j1XnyZseA3m..Z94xmjSzX2zmDqDUvTDTP6aV8MivU5_gwymN8XJkNUV_wdIgjlLp7v9tN9M IhqDMmlU_4IhjafJdT3RNYuloxSWs76EY9RDh5dQ_ZdQmMn2QyTOvXPLbXUYsvMVq4tS9qgvOA0I UJMEX4FcjAS6wxXa4PhbsJHXxudnR0QHbtiM2XsOoLoBAt.qmLNmzFMUht8SKhrRp51Nn60dtBoe ZxWrJ51IabtBF85D8TDSeesLt164Irq8_r4woklOjpJyGCy86COWJAqaKyU7GV3avOPv6cjal0hc Rw6Yto9H6SQQ1URf.WHdHX3Ru4gZebrW7rgac_hWdRUrX0lGoAV6P8do3SDS9e2PCx2I6PlnxAKF a0fcEg6t8KeY0VKZGCv3WWsO5pxMMfj5g0876xFR1B82iBuz6rnuJ_HC.gP8yX755nBibAk5XCLK yifVhxH1iCTAOHC9ZxPBgImrR7ATrJFxgqXH1OXAGWwO1YVMNz1vfKiEbfh4DsfyPssxMgJqqjQn PziYU52JktZbPfFz.1h3b8CIOZkeRyPX5VzsV8tuL.CvXeGzQ6zlZD52XCV7lkxVkZTfDVJu2Rkm 5tE9HIpnSEE1TIKojJrAbjgSiPDw7jzQcU5Du4hRbZVSp9XI6frRyiR1wNxWYEUYzk6JdfOvpa.b p.k.KEPryGn_HxL9uZIHAXcGUQfRtPh7pfOozsxBSkdCzsDjRJobCOUqdsvdKoXCl6E_MgAZ.BOi w5DOjOlYnh7t3oz5lORT8RgAggXOMOdwWFGT.OWg2GjOdAK1vsppFsWWeFFXLaYTDfYsCRN.xN6j EVTabuyzkL1leam26kWUy0Zrk3QNLTRTNqbm62yEmENcbkAF.96heYCwJrKUxf1FsSmQkr0u0nCA pOIB.RpuKclySssCGNj_hmpYEDMduKHIEUAvAsMtDxCVveKqb6frYuEbPVm0A88B7xHfJwco0AlE rs3eQH2vFaJhukSc0OYC1LRCtAFq7Yh3q7EuiM0ICm3wQrAPzlovLAbfnyNHAbd0- X-Sonic-MF: X-Sonic-ID: 8eb77491-09fa-4713-b1d2-ac11db44d940 Received: from sonic.gate.mail.ne1.yahoo.com by sonic314.consmr.mail.bf2.yahoo.com with HTTP; Wed, 21 Feb 2024 07:39:23 +0000 Received: by hermes--production-gq1-5c57879fdf-nxlqc (Yahoo Inc. Hermes SMTP Server) with ESMTPA ID af067c0c4cd25c73df52591616ec3ebe; Wed, 21 Feb 2024 07:39:20 +0000 (UTC) To: ffmpeg-devel@ffmpeg.org Date: Tue, 20 Feb 2024 23:39:15 -0800 Message-Id: <20240221073915.26055-1-allancady@yahoo.com> X-Mailer: git-send-email 2.25.1 MIME-Version: 1.0 References: <20240221073915.26055-1-allancady.ref@yahoo.com> Subject: [FFmpeg-devel] [PATCH] libavutil/timestamp.h: Fix loss of precision in timestamps for silencedetect on long files 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: SKeJi3MmjYy6 When the silencedetect audio 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 format specifier ("%.6g" in libavutil/timestamp.h) limits the total field width to six significant digits. As the offset into the file increases, digits drop off the end, until eventually, for offsets greater than 100000 seconds (about 28 hours), fractions of a second disappear altogether, and the timestamps are logged as whole seconds. This patch changes the format to "%.6f" for silencedetect, which will give microsecond precision for all timestamps regardless of offset. libavutil/timestamp.h exposes a macro, av_ts2timestr, as the public interface. This macro was used by silencedetect.c, as well as other source files. In order to fix the issue for silencedetect without affecting other files and tests, I have added a new macro, av_ts2timestr_fixed_precision, which uses the new format specifier. The original av_ts_make_time_string remains, with the original behavior. timestamp.h also exposes a function, av_ts_make_time_string, which was called only from av_ts2timestr. After this patch, both of the macros now use a new function, av_ts_make_time_string_format, which takes a format specifier as an argument, so the function av_ts_make_time_string is no longer used. I've left it in place, but flagged it for deprecation with FF_API_AV_MAKETIMESTRING. The test reference file filter-metadata-silencedetect has been updated to match the new functionality. Signed-off-by: Allan Cady --- libavfilter/af_silencedetect.c | 12 +++---- libavutil/timestamp.h | 34 +++++++++++++++++--- libavutil/version.h | 1 + tests/ref/fate/filter-metadata-silencedetect | 2 +- 4 files changed, 38 insertions(+), 11 deletions(-) diff --git a/libavfilter/af_silencedetect.c b/libavfilter/af_silencedetect.c index 845c65bfed..f1a8096540 100644 --- a/libavfilter/af_silencedetect.c +++ b/libavfilter/af_silencedetect.c @@ -86,11 +86,11 @@ static av_always_inline void update(SilenceDetectContext *s, AVFrame *insamples, s->start[channel] = insamples->pts + av_rescale_q(current_sample / s->channels + 1 - nb_samples_notify * s->independent_channels / s->channels, (AVRational){ 1, s->last_sample_rate }, time_base); set_meta(insamples, s->mono ? channel + 1 : 0, "silence_start", - av_ts2timestr(s->start[channel], &time_base)); + av_ts2timestr_fixed_precision(s->start[channel], &time_base)); if (s->mono) av_log(s, AV_LOG_INFO, "channel: %d | ", channel); av_log(s, AV_LOG_INFO, "silence_start: %s\n", - av_ts2timestr(s->start[channel], &time_base)); + av_ts2timestr_fixed_precision(s->start[channel], &time_base)); } } } else { @@ -101,15 +101,15 @@ static av_always_inline void update(SilenceDetectContext *s, AVFrame *insamples, int64_t duration_ts = end_pts - s->start[channel]; if (insamples) { set_meta(insamples, s->mono ? channel + 1 : 0, "silence_end", - av_ts2timestr(end_pts, &time_base)); + av_ts2timestr_fixed_precision(end_pts, &time_base)); set_meta(insamples, s->mono ? channel + 1 : 0, "silence_duration", - av_ts2timestr(duration_ts, &time_base)); + av_ts2timestr_fixed_precision(duration_ts, &time_base)); } if (s->mono) av_log(s, AV_LOG_INFO, "channel: %d | ", channel); av_log(s, AV_LOG_INFO, "silence_end: %s | silence_duration: %s\n", - av_ts2timestr(end_pts, &time_base), - av_ts2timestr(duration_ts, &time_base)); + av_ts2timestr_fixed_precision(end_pts, &time_base), + av_ts2timestr_fixed_precision(duration_ts, &time_base)); } s->nb_null_samples[channel] = 0; s->start[channel] = INT64_MIN; diff --git a/libavutil/timestamp.h b/libavutil/timestamp.h index 9ae64da8a1..b483b5e12d 100644 --- a/libavutil/timestamp.h +++ b/libavutil/timestamp.h @@ -31,6 +31,8 @@ #endif #define AV_TS_MAX_STRING_SIZE 32 +#define AV_TS_FMT_DEFAULT "%.6g" +#define AV_TS_FMT_FIXED_PRECISION_6 "%.6f" /** * Fill the provided buffer with a string containing a timestamp @@ -53,9 +55,14 @@ 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) +#if FF_API_AV_MAKETIMESTRING /** + * This function is probably deprecated. It was originally called by + * av_ts_make_time_string defined below, which now uses av_ts_make_time_string_format. + * instead. Nothing external references this function directly. + * * Fill the provided buffer with a string containing a timestamp time - * representation. + * representation, using the default format AV_TS_FMT_DEFAULT. * * @param buf a buffer with size in bytes of at least AV_TS_MAX_STRING_SIZE * @param ts the timestamp to represent @@ -65,14 +72,33 @@ 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, 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); + else snprintf(buf, AV_TS_MAX_STRING_SIZE, AV_TS_FMT_DEFAULT, av_q2d(*tb) * ts); return buf; } +#endif /** - * Convenience macro, the return value should be used only directly in + * Fill the provided buffer with a string containing a timestamp time + * representation. + * + * @param buf a buffer with size in bytes of at least AV_TS_MAX_STRING_SIZE + * @param ts the timestamp to represent + * @param tb the timebase of the timestamp + * @param format format string for timestamp output, e.g. AV_TS_FMT_DEFAULT. + * @return the buffer in input + */ +static inline char *av_ts_make_time_string_format(char *buf, int64_t ts, AVRational *tb, const char *format) +{ + if (ts == AV_NOPTS_VALUE) snprintf(buf, AV_TS_MAX_STRING_SIZE, "NOPTS"); + else snprintf(buf, AV_TS_MAX_STRING_SIZE, format, av_q2d(*tb) * ts); + return buf; +} + +/** + * Convenience macros, the return values should be used only directly in * function arguments but never stand-alone. */ -#define av_ts2timestr(ts, tb) av_ts_make_time_string((char[AV_TS_MAX_STRING_SIZE]){0}, ts, tb) +#define av_ts2timestr(ts, tb) av_ts_make_time_string_format((char[AV_TS_MAX_STRING_SIZE]){0}, ts, tb, AV_TS_FMT_DEFAULT) +#define av_ts2timestr_fixed_precision(ts, tb) av_ts_make_time_string_format((char[AV_TS_MAX_STRING_SIZE]){0}, ts, tb, AV_TS_FMT_FIXED_PRECISION_6) #endif /* AVUTIL_TIMESTAMP_H */ diff --git a/libavutil/version.h b/libavutil/version.h index 9f45af93df..a2daeda772 100644 --- a/libavutil/version.h +++ b/libavutil/version.h @@ -119,6 +119,7 @@ #define FF_API_FRAME_KEY (LIBAVUTIL_VERSION_MAJOR < 59) #define FF_API_PALETTE_HAS_CHANGED (LIBAVUTIL_VERSION_MAJOR < 59) #define FF_API_VULKAN_CONTIGUOUS_MEMORY (LIBAVUTIL_VERSION_MAJOR < 59) +#define FF_API_AV_MAKETIMESTRING (LIBAVUTIL_VERSION_MAJOR < 59) /** * @} 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