diff --git a/src/moov/mod.rs b/src/moov/mod.rs index ca8109ca..16142647 100644 --- a/src/moov/mod.rs +++ b/src/moov/mod.rs @@ -148,6 +148,7 @@ mod test { modification_time: 3773812694, track_id: 1, enabled: true, + in_movie: true, width: 1920.into(), height: 1080.into(), ..Default::default() diff --git a/src/moov/trak/tkhd.rs b/src/moov/trak/tkhd.rs index 985eae5b..b627c415 100644 --- a/src/moov/trak/tkhd.rs +++ b/src/moov/trak/tkhd.rs @@ -7,6 +7,7 @@ ext! { track_enabled = 0, track_in_movie = 1, track_in_preview = 2, + track_size_is_aspect_ratio = 3, } } @@ -20,6 +21,10 @@ pub struct Tkhd { pub layer: u16, pub alternate_group: u16, pub enabled: bool, + pub in_movie: bool, + /// When set, `width`/`height` express the track's suggested aspect ratio + /// rather than pixel dimensions (ISO/IEC 14496-12:2022 §8.3.2.3). + pub size_is_aspect_ratio: bool, pub volume: FixedPoint, pub matrix: Matrix, @@ -73,6 +78,10 @@ impl AtomExt for Tkhd { width, height, enabled: ext.track_enabled, + in_movie: ext.track_in_movie, + size_is_aspect_ratio: ext.track_size_is_aspect_ratio, + // track_in_preview has no assigned meaning and is ignored on read + // per ISO/IEC 14496-12:2022 §8.3.2.3. }) } @@ -96,7 +105,11 @@ impl AtomExt for Tkhd { Ok(TkhdExt { version: TkhdVersion::V1, track_enabled: self.enabled, - ..Default::default() + track_in_movie: self.in_movie, + // track_in_preview has no assigned meaning; per ISO/IEC + // 14496-12:2022 §8.3.2.3 writers should mirror track_in_movie. + track_in_preview: self.in_movie, + track_size_is_aspect_ratio: self.size_is_aspect_ratio, }) } } @@ -190,6 +203,8 @@ mod tests { width: 512.into(), height: 288.into(), enabled: true, + in_movie: true, + size_is_aspect_ratio: false, }; let mut buf = Vec::new(); expected.encode(&mut buf).unwrap(); @@ -213,6 +228,8 @@ mod tests { width: 512.into(), height: 288.into(), enabled: true, + in_movie: true, + size_is_aspect_ratio: false, }; let mut buf = Vec::new(); expected.encode(&mut buf).unwrap(); diff --git a/src/test/av1.rs b/src/test/av1.rs index d56f9339..f4df2329 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, + size_is_aspect_ratio: false, volume: 0.into(), matrix: Matrix { a: 65536, diff --git a/src/test/bbb.rs b/src/test/bbb.rs index b0c6fcc2..e7553f92 100644 --- a/src/test/bbb.rs +++ b/src/test/bbb.rs @@ -47,6 +47,7 @@ fn bbb() { tkhd: Tkhd { track_id: 1, enabled: true, + in_movie: true, width: 1280.into(), height: 720.into(), ..Default::default() @@ -129,6 +130,7 @@ fn bbb() { track_id: 2, alternate_group: 1, enabled: true, + in_movie: true, volume: 1.into(), ..Default::default() }, diff --git a/src/test/esds.rs b/src/test/esds.rs index 0af44484..73daa7e0 100644 --- a/src/test/esds.rs +++ b/src/test/esds.rs @@ -47,6 +47,7 @@ fn esds() { tkhd: Tkhd { track_id: 1, enabled: true, + in_movie: true, width: 1280.into(), height: 720.into(), ..Default::default() @@ -129,6 +130,7 @@ fn esds() { track_id: 2, alternate_group: 1, enabled: true, + in_movie: true, volume: 1.into(), ..Default::default() }, diff --git a/src/test/flac.rs b/src/test/flac.rs index 0f963d28..e433f757 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, + size_is_aspect_ratio: false, volume: 1.into(), matrix: Matrix { a: 65536, diff --git a/src/test/h264.rs b/src/test/h264.rs index 0ba44098..e7f2e27e 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, + size_is_aspect_ratio: 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, + size_is_aspect_ratio: false, volume: 1.into(), matrix: Matrix { a: 65536, diff --git a/src/test/hevc.rs b/src/test/hevc.rs index 03f4f20a..a6c87069 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, + size_is_aspect_ratio: false, volume: 0.into(), matrix: Matrix { a: 65536, diff --git a/src/test/libavif_anim.rs b/src/test/libavif_anim.rs index 5539ca0f..46ebd97e 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, + size_is_aspect_ratio: false, volume: 0.into(), matrix: Matrix { a: 65536, diff --git a/src/test/uncompressed.rs b/src/test/uncompressed.rs index e11ec990..cbe71777 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, + size_is_aspect_ratio: false, volume: 0.into(), matrix: Matrix { a: 65536, diff --git a/src/test/vp9.rs b/src/test/vp9.rs index b528169e..1033cccb 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, + size_is_aspect_ratio: false, volume: 0.into(), matrix: Matrix { a: 65536,