From 62aed1acc209ecc983508b85ec5196fc62ae9ddd Mon Sep 17 00:00:00 2001 From: Brandon Thomas Date: Tue, 13 Oct 2026 01:29:19 -0400 Subject: [PATCH] #1303: frame times in i128 via Tick::from_rational (a hostile F1:i64::MAX rate can't overflow) Co-Authored-By: Claude Opus 5.5 --- crates/codecs/src/y4m.rs | 4 ++-- crates/codecs/tests/y4m_file.rs | 14 +++++++++++--- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/crates/codecs/src/y4m.rs b/crates/codecs/src/y4m.rs index 912cd5aa..76937e17 100644 --- a/crates/codecs/src/y4m.rs +++ b/crates/codecs/src/y4m.rs @@ -180,7 +180,7 @@ impl Y4mSource { return Err(bad("no complete frames")); } let color = ColorInfo { matrix: filmcraft_frame::default_matrix(w, h), range: if full { Range::Full } else { Range::Limited }, ..ColorInfo::REC709 }; - let duration = Tick::from_rational(frames.len() as i64 * rate.den, 1, rate.num); + let duration = Tick::from_rational(frames.len() as i64, rate.den, rate.num); let bitrate = (frame_bytes as u64 * 8).checked_mul(rate.num as u64).map(|b| b / rate.den as u64); let info = MediaInfo { name: name.to_string(), @@ -244,7 +244,7 @@ impl Y4mSource { data: pixels, color: v.color, par: v.par, - pts: Tick::from_rational(idx as i64 * self.rate.den, 1, self.rate.num), + pts: Tick::from_rational(idx as i64, self.rate.den, self.rate.num), }) } } diff --git a/crates/codecs/tests/y4m_file.rs b/crates/codecs/tests/y4m_file.rs index 31623494..f9aa1e86 100644 --- a/crates/codecs/tests/y4m_file.rs +++ b/crates/codecs/tests/y4m_file.rs @@ -99,9 +99,17 @@ fn damaged_and_hostile_y4m_files_fail_without_panicking() { b[i] ^= 0x41; cases.push(b); } - for header in - ["W99999999 H99999999 F25:1", "W0 H4 F25:1", "W6 H4 F0:0", "W6 H4 F25:0", "W6 H4 F25:1 C411", "W6 H4 F25:1 Cbogus", "W6 H4 A0:0 F-5:1", "H4 F25:1"] - { + for header in [ + "W99999999 H99999999 F25:1", + "W0 H4 F25:1", + "W6 H4 F0:0", + "W6 H4 F25:0", + "W6 H4 F25:1 C411", + "W6 H4 F25:1 Cbogus", + "W6 H4 A0:0 F-5:1", + "H4 F25:1", + "W6 H4 F1:9223372036854775807", + ] { cases.push(y4m(header, "FRAME", &[vec![0; 36]])); } for (i, b) in cases.into_iter().enumerate() {