From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from ffbox0-bg.ffmpeg.org (ffbox0-bg.ffmpeg.org [79.124.17.100]) by master.gitmailbox.com (Postfix) with ESMTPS id 5DFA64C618 for ; Tue, 9 Sep 2025 12:42:48 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ffmpeg.org; i=@ffmpeg.org; q=dns/txt; s=mail; t=1757421734; h=message-id : date : mime-version : to : references : in-reply-to : reply-to : subject : list-id : list-archive : list-archive : list-help : list-owner : list-post : list-subscribe : list-unsubscribe : from : cc : content-type : content-transfer-encoding : from; bh=8L5Wt/+7BOSnFH3lCtJ74XqxNU+FjoQxH+UHGA9N908=; b=0c7Tk0xZUg1DjYVb9zS395v8WamsXo60kTDw+MwmmdonkVR1FPiU+YLhG1ZrhBrHainqU dBfMZ7qOeljmhxe/UHTfBNxMzl9+uciuAlWqxJoLaLLYaC+R+50x5P1DwHgqNh7dpxQF/yf 8rawD6OOMSOSdvZ7k/2gg8lSaW29gQtak1kUtsWGSLM+1j3uyVfbuX/hDEsLGTJa0XESmqc QDqRukFNddOSwqOGlmBBwzD93FZxMEw/HQctoO8HWAX/DNQIM1b9fPvEjA3XbFMdeOHIVAj mTT2APMbOUaOtO/BItCjOcBKEdw9B3YnuRBaFycnroLMQQz52QYxrhQ9OU7Q== Received: from [172.19.0.4] (unknown [172.19.0.4]) by ffbox0-bg.ffmpeg.org (Postfix) with ESMTP id 3FC1768E7D3; Tue, 9 Sep 2025 15:42:14 +0300 (EEST) ARC-Seal: i=1; cv=none; a=rsa-sha256; d=ffmpeg.org; s=arc; t=1757421732; b=qUE2IJJXWjg5E6rXhNoRULti1YFfNuWBACRByNjkl0Xf3iaG0p+K/Scqx+yaoKvqhvcrK PwPqAqGdnbx70+3RkeTKbNmmI7ThzhwSWURstxDZP464PnYp3Al0T97b8dWbPE1QqAEOuwC tRUv3P1pcKQyIMLqOHduOsjk5mDMbDu7EWjHhlXos97uC3AyCgK17VvEZfgt9XC6UN6M0vs lza88IB/9hA9rqfkdX6WzWl/X0pzrLayILXg7JK0Wws74S2IOVD2nitt/RanElmwhiRfwMQ MtzfTKwqGUULsMJng3UQbjQPtsUZT3oVMrgs1++O0SBWcDVo3Z7QclgQHNhA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=ffmpeg.org; s=arc; t=1757421732; h=from : sender : reply-to : subject : date : message-id : to : cc : mime-version : content-type : content-transfer-encoding : content-id : content-description : resent-date : resent-from : resent-sender : resent-to : resent-cc : resent-message-id : in-reply-to : references : list-id : list-help : list-unsubscribe : list-subscribe : list-post : list-owner : list-archive; bh=t6PNwuKxU4OJp2F/D5w+Kyu4OYHKe42mpAZMS0WCKMU=; b=S3iSUOoUMj44C6TAhM9pl2Vqg6idEAa07pOBTZV8qd5o1JVT77YywhT7Ce2hRTobskveO vBgYDyIkCe5Hh0GQbclEmjx17KMKy8sX4EYTTfMkhu788FplQnWmqNoC6A2t4gTnjiXapV8 E1PWzVGZp2mgWOUa3utxQCS/W9G3qsBr/TDhQd+6+OOqAuHsWb3QfGdbCkW2wrtZ6AhWcEV aSt5mHnfwv1BQJq43NMHDpGxUVry3yyGY+PsRexsE7v4OjeZykxPPXHvHERQG0fo+9Dsn5j e6fGRAohIgGyLKkSEI3QPZWoKAkKWEXQvTafZPrqIZ4n+11RgD6mOfI2ITLQ== ARC-Authentication-Results: i=1; ffmpeg.org; dkim=fail; arc=none; dmarc=fail header.from=mediaarea.net policy.dmarc=none Authentication-Results: ffmpeg.org; dkim=fail; arc=none (Message is not ARC signed); dmarc=fail (Used From Domain Record) header.from=mediaarea.net policy.dmarc=none Received: from 3.mo576.mail-out.ovh.net (3.mo576.mail-out.ovh.net [188.165.52.203]) by ffbox0-bg.ffmpeg.org (Postfix) with ESMTPS id 051B668E8D7 for ; Tue, 9 Sep 2025 15:42:01 +0300 (EEST) Received: from director3.ghost.mail-out.ovh.net (unknown [10.110.43.253]) by mo576.mail-out.ovh.net (Postfix) with ESMTP id 4cLk3S2LCZz62Tl for ; Tue, 9 Sep 2025 12:41:56 +0000 (UTC) Received: from ghost-submission-5b5ff79f4f-dfr9h (unknown [10.110.118.78]) by director3.ghost.mail-out.ovh.net (Postfix) with ESMTPS id 1498BC366E for ; Tue, 9 Sep 2025 12:41:55 +0000 (UTC) Received: from mediaarea.net ([37.59.142.97]) by ghost-submission-5b5ff79f4f-dfr9h with ESMTPSA id OleBNpMgwGiNsQAAWa+E/w (envelope-from ) for ; Tue, 09 Sep 2025 12:41:55 +0000 X-OVh-ClientIp: 84.143.147.172 Message-ID: <890ba184-930c-4f51-9cf5-a9f33ff6f7ad@mediaarea.net> Date: Tue, 9 Sep 2025 14:41:53 +0200 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird To: ffmpeg-devel@ffmpeg.org References: Content-Language: fr In-Reply-To: X-Ovh-Tracer-Id: 2347501308458010873 X-VR-SPAMSTATE: OK X-VR-SPAMSCORE: 0 X-VR-SPAMCAUSE: gggruggvucftvghtrhhoucdtuddrgeeffedrtdeggddvtdeggecutefuodetggdotefrodftvfcurfhrohhfihhlvgemucfqggfjpdevjffgvefmvefgnecuuegrihhlohhuthemucehtddtnecunecujfgurheptgfkffggfgfuvfhfhfgjsehmtderredtvdejnecuhfhrohhmpeflvghrohhmvgcuofgrrhhtihhnvgiiuceojhgvrhhomhgvsehmvgguihgrrghrvggrrdhnvghtqeenucggtffrrghtthgvrhhnpeegveffhffgfeehkeffteffueevieehhfehjeeftdeglefgleetieejheffffduueenucfkphepuddvjedrtddrtddruddpkeegrddugeefrddugeejrddujedvpdefjedrheelrddugedvrdeljeenucevlhhushhtvghrufhiiigvpedtnecurfgrrhgrmhepihhnvghtpeduvdejrddtrddtrddupdhmrghilhhfrhhomhepjhgvrhhomhgvsehmvgguihgrrghrvggrrdhnvghtpdhnsggprhgtphhtthhopedupdhrtghpthhtohepfhhfmhhpvghgqdguvghvvghlsehffhhmphgvghdrohhrghdpoffvtefjohhsthepmhhoheejiegmpdhmohguvgepshhmthhpohhuth Message-ID-Hash: 5QI7MBGSM4E6FWNXZFLFWNBKJAJ6QDCT X-Message-ID-Hash: 5QI7MBGSM4E6FWNXZFLFWNBKJAJ6QDCT X-MailFrom: SRS0=HT8a=3U=mediaarea.net=jerome@ffmpeg.org X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; loop; banned-address; header-match-ffmpeg-devel.ffmpeg.org-0; header-match-ffmpeg-devel.ffmpeg.org-1; header-match-ffmpeg-devel.ffmpeg.org-2; header-match-ffmpeg-devel.ffmpeg.org-3; emergency; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header Content-Disposition: attachment; filename="0007-matroskaenc-write-timecode-in-BlockAddition.patch" X-Content-Filtered-By: Mailman/MimeDel 3.3.10 X-Mailman-Version: 3.3.10 Precedence: list Reply-To: FFmpeg development discussions and patches Subject: [FFmpeg-devel] [PATCH 7/7] matroskaenc: write timecode in BlockAddition List-Id: FFmpeg development discussions and patches Archived-At: Archived-At: List-Archive: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: From: Jerome Martinez via ffmpeg-devel Cc: Jerome Martinez Content-Type: text/plain; charset="us-ascii"; name="0007-matroskaenc-write-timecode-in-BlockAddition.patch" Content-Transfer-Encoding: 7bit Archived-At: List-Archive: List-Post: >>From f7aeb160a8ba2e2eefa6206af2ff5179a88f7343 Mon Sep 17 00:00:00 2001 From: Jerome Martinez Date: Thu, 4 Sep 2025 20:18:08 +0200 Subject: [PATCH 7/7] matroskaenc: write timecode in BlockAddition --- libavformat/matroskaenc.c | 45 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 44 insertions(+), 1 deletion(-) diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c index d304b63663..aa7b8f4443 100644 --- a/libavformat/matroskaenc.c +++ b/libavformat/matroskaenc.c @@ -60,6 +60,7 @@ #include "libavutil/rational.h" #include "libavutil/samplefmt.h" #include "libavutil/stereo3d.h" +#include "libavutil/timecode.h" #include "libavcodec/av1.h" #include "libavcodec/bytestream.h" @@ -81,6 +82,9 @@ #define MAX_SUPPORTED_EBML_LENGTH FFMIN(MAX_EBML_LENGTH, INT_MAX) #define MAX_MATROSKA_BLOCK_ADD_ITU_T_T35 1 /* currently only 1 such element is supported */ +#define MAX_MATROSKA_BLOCK_ADD_SMPTE_12M 64 /* balance between intermediate buffer size and reality of non existence if so many timecodes streams for one content */ + +#define MATROSKA_BLOCK_ADD_ID_SMPTE_12M 101 /* arbitrary value */ #define MODE_MATROSKAv2 0x01 #define MODE_WEBM 0x02 @@ -199,6 +203,7 @@ typedef struct mkv_track { int64_t duration_offset; uint64_t max_blockaddid; int itu_t_t35_count; + int timecode_count; int64_t blockadditionmapping_offset; int codecpriv_offset; unsigned codecpriv_size; ///< size reserved for CodecPrivate excluding header+length field @@ -2825,11 +2830,12 @@ static int mkv_write_block(void *logctx, MatroskaMuxContext *mkv, int force_blockgroup, int64_t relative_packet_pos) { uint8_t t35_buf[6 + AV_HDR_PLUS_MAX_PAYLOAD_SIZE]; + uint8_t timecode_buf[MAX_MATROSKA_BLOCK_ADD_SMPTE_12M][8]; uint8_t *side_data; size_t side_data_size; uint64_t additional_id; unsigned track_number = track->track_num; - EBML_WRITER(11 + MAX_MATROSKA_BLOCK_ADD_ITU_T_T35); + EBML_WRITER(11 + MAX_MATROSKA_BLOCK_ADD_ITU_T_T35 + MAX_MATROSKA_BLOCK_ADD_SMPTE_12M); int ret; mkv->cur_block.track = track; @@ -2908,6 +2914,36 @@ static int mkv_write_block(void *logctx, MatroskaMuxContext *mkv, } } + // Extract timecode from side data and write as BlockAdditional + if (par->codec_type == AVMEDIA_TYPE_VIDEO) { + side_data = av_packet_get_side_data(pkt, AV_PKT_DATA_S12M_TIMECODE, &side_data_size); + if (side_data && side_data_size >= sizeof(uint64_t)) { + uint64_t *side_data_64 = (uint64_t*)side_data; + uint64_t count = side_data_64[0]; + if (side_data_size / sizeof(uint64_t) - 1 >= count ) { + uint64_t written_count = count; + side_data_64++; + if (count > MAX_MATROSKA_BLOCK_ADD_SMPTE_12M) { + if (count > track->timecode_count) { + av_log(logctx, AV_LOG_WARNING, "Too many SMPTE timecode streams in side data, discarding %"PRIu64" timecode streams.\n", count - MAX_MATROSKA_BLOCK_ADD_SMPTE_12M); + } + written_count = MAX_MATROSKA_BLOCK_ADD_SMPTE_12M; + } + for (uint64_t i = 0; i < written_count; i++) { + uint64_t tc = side_data_64[i]; + uint8_t *payload = timecode_buf[i]; + AV_WB64(payload, tc); + av_log(logctx, AV_LOG_DEBUG, "Writing SMPTE timecode from side data, pos %"PRIu64", to BlockAdditional: 0x%016lX (RFC 5484)\n", i + 1, tc); + + int blockaddid = MATROSKA_BLOCK_ADD_ID_SMPTE_12M + i; + mkv_write_blockadditional(&writer, payload, 8, blockaddid); + track->max_blockaddid = FFMAX(track->max_blockaddid, blockaddid); + } + track->timecode_count = FFMAX(track->timecode_count, count); + } + } + } + ebml_writer_close_or_discard_master(&writer); if (!force_blockgroup && writer.nb_elements == 2) { @@ -3320,11 +3356,15 @@ after_cues: int max_block_add_id_count = 0; int max_block_add_id_size = 3 + uint_size(track->max_blockaddid); int block_type_t35_count = 0; + int block_type_timecode_count = 0; if (!track->max_blockaddid) continue; /* check what is possible to write in the reserved space, in priority order */ + for (int i = 0; i < track->timecode_count; i++) { + block_type_timecode_count += mkv_simulate_blockadditional_header(s, &remaining_video_track_space, MATROSKA_BLOCK_ADD_ID_TYPE_SMPTE_12M, MATROSKA_BLOCK_ADD_ID_SMPTE_12M + i); + } for (int i = 0; i < track->itu_t_t35_count; i++) { block_type_t35_count += mkv_simulate_blockadditional_header(s, &remaining_video_track_space, MATROSKA_BLOCK_ADD_ID_TYPE_ITU_T_T35, MATROSKA_BLOCK_ADD_ID_TYPE_ITU_T_T35); } @@ -3344,6 +3384,9 @@ after_cues: for (int i = 0; i < block_type_t35_count; i++) { mkv_write_blockadditional_header(s, MATROSKA_BLOCK_ADD_ID_TYPE_ITU_T_T35, MATROSKA_BLOCK_ADD_ID_ITU_T_T35); } + for (int i = 0; i < block_type_timecode_count; i++) { + mkv_write_blockadditional_header(s, MATROSKA_BLOCK_ADD_ID_TYPE_SMPTE_12M, MATROSKA_BLOCK_ADD_ID_SMPTE_12M + i); + } if (remaining_video_track_space > 1) { put_ebml_void(track_bc, remaining_video_track_space); } -- 2.46.0.windows.1 _______________________________________________ ffmpeg-devel mailing list -- ffmpeg-devel@ffmpeg.org To unsubscribe send an email to ffmpeg-devel-leave@ffmpeg.org