PR #24078 opened by Théo Valette (theovalette)
URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/24078
Patch URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/24078.patch

When a MOV `tmcd` data track is explicitly stream-copied, its four-byte frame 
counter remains unchanged but the output sample description currently clears 
the timecode flags. A drop-frame counter such as `01:00:00;00` is consequently 
read back as non-drop-frame `00:59:56:12`.

The MOV demuxer retains the input `tmcd` sample description in codec extradata. 
The muxer reconstructs that description from `MOVTrack.timecode_flags`, but 
only muxer-generated metadata timecode tracks initialized the field. Copied 
tracks therefore wrote its zero-initialized value.

Initialize the complete 32-bit flags field from validated codec extradata when 
setting up a copied `tmcd` track. This preserves drop-frame and the other 
defined timecode flags without changing the media packet. The existing 
`fate-copy-trac236` stream-copy test contains three drop-frame `tmcd` tracks; 
its reference checksum is updated to cover the preserved descriptions.

Tests:

- Self-contained issue reproducer: fixed output reports `01:00:00;00`, flag 
word `00000001`, and the unchanged packet MD5 
`c6284ce0070c9f5dc266182e85ffd541`.
- `make fate-copy-trac236` with the official FATE sample path configured
- `make fate-lavf-mov`
- Minimal MOV-only configure, build, stream copy, and probe
- `git diff --check HEAD^ HEAD`
- `tools/patcheck` (only the minor-change changelog hint)

Fixes https://code.ffmpeg.org/FFmpeg/FFmpeg/issues/20841


From 100d4fa65b53f17b6b0ef0107007b1f8c34386d3 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Th=C3=A9o=20Valette?=
 <[email protected]>
Date: Tue, 11 Aug 2026 14:35:20 +0200
Subject: [PATCH] avformat/movenc: preserve timecode flags when copying tmcd
 tracks
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

The MOV demuxer retains tmcd timecode flags in codec extradata, but copied
tracks never initialize MOVTrack.timecode_flags. mov_write_tmcd_tag()
therefore writes zero when reconstructing the sample description, causing
unchanged frame counters to be interpreted as non-drop-frame.

Initialize the complete flags field from sample-description extradata for
copied tmcd tracks. fate-copy-trac236 covers three drop-frame tmcd tracks.

Fixes issue #20841.

Reported-by: unsword01 <[email protected]>
Signed-off-by: Théo Valette <[email protected]>
---
 libavformat/movenc.c        | 3 +++
 tests/ref/fate/copy-trac236 | 2 +-
 2 files changed, 4 insertions(+), 1 deletion(-)

diff --git a/libavformat/movenc.c b/libavformat/movenc.c
index 2a3226c70f..bd8e2b2127 100644
--- a/libavformat/movenc.c
+++ b/libavformat/movenc.c
@@ -8633,6 +8633,9 @@ static int mov_init(AVFormatContext *s)
             }
         } else if (st->codecpar->codec_type == AVMEDIA_TYPE_DATA) {
             track->timescale = st->time_base.den;
+            if (track->tag == MKTAG('t','m','c','d') &&
+                st->codecpar->extradata_size >= 8)
+                track->timecode_flags = AV_RB32(st->codecpar->extradata + 4);
         } else {
             track->timescale = mov->movie_timescale;
         }
diff --git a/tests/ref/fate/copy-trac236 b/tests/ref/fate/copy-trac236
index 016492cf23..187d598900 100644
--- a/tests/ref/fate/copy-trac236
+++ b/tests/ref/fate/copy-trac236
@@ -1,4 +1,4 @@
-1683aff9357630012ded47d7e45d2c8a *tests/data/fate/copy-trac236.mov
+1aba24bd0b58133d3c59bccde9daad08 *tests/data/fate/copy-trac236.mov
 630918 tests/data/fate/copy-trac236.mov
 #tb 0: 100/2997
 #media_type 0: video
-- 
2.52.0

_______________________________________________
ffmpeg-devel mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to