From 622ca7d798544fc28c6736f90433648248253b88 Mon Sep 17 00:00:00 2001 From: Eli Mallon Date: Mon, 16 Mar 2026 15:04:46 -0700 Subject: [PATCH] Expose track_in_movie and track_in_preview flags on Tkhd The tkhd box has three flag bits: track_enabled (bit 0), track_in_movie (bit 1), and track_in_preview (bit 2). Previously only track_enabled was exposed as a public field. The other two were decoded but discarded, and always written as false on encode. Add `in_movie` and `in_preview` fields to Tkhd so callers can read and write all three flags. Update all test expectations to match the actual flag values in their respective fixtures. Co-Authored-By: Claude Opus 4.6 --- src/moov/mod.rs | 2 ++ src/moov/trak/tkhd.rs | 11 ++++++++++- src/test/av1.rs | 2 ++ src/test/bbb.rs | 4 ++++ src/test/esds.rs | 4 ++++ src/test/flac.rs | 2 ++ src/test/h264.rs | 4 ++++ src/test/hevc.rs | 2 ++ src/test/libavif_anim.rs | 2 ++ src/test/uncompressed.rs | 2 ++ src/test/vp9.rs | 2 ++ 11 files changed, 36 insertions(+), 1 deletion(-) diff --git a/src/moov/mod.rs b/src/moov/mod.rs index ca8109c..61554eb 100644 --- a/src/moov/mod.rs +++ b/src/moov/mod.rs @@ -148,6 +148,8 @@ mod test { modification_time: 3773812694, track_id: 1, enabled: true, + in_movie: true, + in_preview: true, width: 1920.into(), height: 1080.into(), ..Default::default() diff --git a/src/moov/trak/tkhd.rs b/src/moov/trak/tkhd.rs index 985eae5..f39c327 100644 --- a/src/moov/trak/tkhd.rs +++ b/src/moov/trak/tkhd.rs @@ -20,6 +20,8 @@ pub struct Tkhd { pub layer: u16, pub alternate_group: u16, pub enabled: bool, + pub in_movie: bool, + pub in_preview: bool, pub volume: FixedPoint, pub matrix: Matrix, @@ -73,6 +75,8 @@ impl AtomExt for Tkhd { width, height, enabled: ext.track_enabled, + in_movie: ext.track_in_movie, + in_preview: ext.track_in_preview, }) } @@ -96,7 +100,8 @@ impl AtomExt for Tkhd { Ok(TkhdExt { version: TkhdVersion::V1, track_enabled: self.enabled, - ..Default::default() + track_in_movie: self.in_movie, + track_in_preview: self.in_preview, }) } } @@ -190,6 +195,8 @@ mod tests { width: 512.into(), height: 288.into(), enabled: true, + in_movie: true, + in_preview: false, }; let mut buf = Vec::new(); expected.encode(&mut buf).unwrap(); @@ -213,6 +220,8 @@ mod tests { width: 512.into(), height: 288.into(), enabled: true, + in_movie: true, + in_preview: false, }; let mut buf = Vec::new(); expected.encode(&mut buf).unwrap(); diff --git a/src/test/av1.rs b/src/test/av1.rs index e947371..d662a01 100644 --- a/src/test/av1.rs +++ b/src/test/av1.rs @@ -64,6 +64,8 @@ fn av1() { layer: 0, alternate_group: 0, enabled: true, + in_movie: true, + in_preview: false, volume: 0.into(), matrix: Matrix { a: 65536, diff --git a/src/test/bbb.rs b/src/test/bbb.rs index b0a62da..21855cf 100644 --- a/src/test/bbb.rs +++ b/src/test/bbb.rs @@ -47,6 +47,8 @@ fn bbb() { tkhd: Tkhd { track_id: 1, enabled: true, + in_movie: true, + in_preview: false, width: 1280.into(), height: 720.into(), ..Default::default() @@ -129,6 +131,8 @@ fn bbb() { track_id: 2, alternate_group: 1, enabled: true, + in_movie: true, + in_preview: false, volume: 1.into(), ..Default::default() }, diff --git a/src/test/esds.rs b/src/test/esds.rs index 2496a9a..c3c8705 100644 --- a/src/test/esds.rs +++ b/src/test/esds.rs @@ -47,6 +47,8 @@ fn esds() { tkhd: Tkhd { track_id: 1, enabled: true, + in_movie: true, + in_preview: false, width: 1280.into(), height: 720.into(), ..Default::default() @@ -129,6 +131,8 @@ fn esds() { track_id: 2, alternate_group: 1, enabled: true, + in_movie: true, + in_preview: false, volume: 1.into(), ..Default::default() }, diff --git a/src/test/flac.rs b/src/test/flac.rs index 0f963d2..0070e1a 100644 --- a/src/test/flac.rs +++ b/src/test/flac.rs @@ -60,6 +60,8 @@ fn flac() { layer: 0, alternate_group: 0, enabled: true, + in_movie: true, + in_preview: true, volume: 1.into(), matrix: Matrix { a: 65536, diff --git a/src/test/h264.rs b/src/test/h264.rs index 66409d1..dbf0633 100644 --- a/src/test/h264.rs +++ b/src/test/h264.rs @@ -69,6 +69,8 @@ fn avcc_ext() { layer: 0, alternate_group: 0, enabled: true, + in_movie: true, + in_preview: false, volume: 0.into(), matrix: Matrix { a: 65536, @@ -189,6 +191,8 @@ fn avcc_ext() { layer: 0, alternate_group: 1, enabled: true, + in_movie: true, + in_preview: false, volume: 1.into(), matrix: Matrix { a: 65536, diff --git a/src/test/hevc.rs b/src/test/hevc.rs index 03f4f20..8a26f76 100644 --- a/src/test/hevc.rs +++ b/src/test/hevc.rs @@ -59,6 +59,8 @@ fn hevc() { layer: 0, alternate_group: 0, enabled: true, + in_movie: true, + in_preview: false, volume: 0.into(), matrix: Matrix { a: 65536, diff --git a/src/test/libavif_anim.rs b/src/test/libavif_anim.rs index 5539ca0..c95b4eb 100644 --- a/src/test/libavif_anim.rs +++ b/src/test/libavif_anim.rs @@ -160,6 +160,8 @@ fn av1_anim() { layer: 0, alternate_group: 0, enabled: true, + in_movie: false, + in_preview: false, volume: 0.into(), matrix: Matrix { a: 65536, diff --git a/src/test/uncompressed.rs b/src/test/uncompressed.rs index e11ec99..0cc2894 100644 --- a/src/test/uncompressed.rs +++ b/src/test/uncompressed.rs @@ -53,6 +53,8 @@ fn uncompressed() { layer: 0, alternate_group: 0, enabled: true, + in_movie: true, + in_preview: true, volume: 0.into(), matrix: Matrix { a: 65536, diff --git a/src/test/vp9.rs b/src/test/vp9.rs index b528169..c0ba759 100644 --- a/src/test/vp9.rs +++ b/src/test/vp9.rs @@ -84,6 +84,8 @@ fn vp9() { layer: 0, alternate_group: 0, enabled: true, + in_movie: true, + in_preview: true, volume: 0.into(), matrix: Matrix { a: 65536,