diff options
| author | metamuffin <metamuffin@disroot.org> | 2026-03-05 18:22:02 +0100 |
|---|---|---|
| committer | metamuffin <metamuffin@disroot.org> | 2026-03-05 18:22:02 +0100 |
| commit | 5fa35d0bc7e432a38f8d4a7e9214850d6edd8048 (patch) | |
| tree | 1dc16aa234547d76072f8757efe53fc0d4e4390c | |
| parent | 8e7a87a8a663644e43e8dbbf087a60df4ac098e5 (diff) | |
| download | jellything-5fa35d0bc7e432a38f8d4a7e9214850d6edd8048.tar jellything-5fa35d0bc7e432a38f8d4a7e9214850d6edd8048.tar.bz2 jellything-5fa35d0bc7e432a38f8d4a7e9214850d6edd8048.tar.zst | |
fix off-by-one in segment timeline
| -rw-r--r-- | stream/src/dash.rs | 18 |
1 files changed, 12 insertions, 6 deletions
diff --git a/stream/src/dash.rs b/stream/src/dash.rs index bfec78c..d2adf3f 100644 --- a/stream/src/dash.rs +++ b/stream/src/dash.rs @@ -183,6 +183,7 @@ struct Timeline<'a>(&'a [Range<f64>]); impl Display for Timeline<'_> { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { write!(f, "<SegmentTimeline>")?; + let mut c = 0; let mut last_t = 0; let mut last_d = 0; let mut r = 0; @@ -190,7 +191,6 @@ impl Display for Timeline<'_> { for seg in self.0 { let t = (seg.end * 1000.) as i64; let d = t - last_t; - r += 1; if d != last_d && last_d != 0 { match (r, first) { (1, true) => write!(f, r#"<S t="0" d="{last_d}" />"#)?, @@ -199,16 +199,22 @@ impl Display for Timeline<'_> { (_, false) => write!(f, r#"<S d="{last_d}" r="{r}" />"#)?, } first = false; - r = 0; + c += r; + r = 1; + } else { + r += 1; } last_t = t; last_d = d; } - if r > 1 { - write!(f, r#"<S d="{last_d}" r="{r}" />"#)?; - } else { - write!(f, r#"<S d="{last_d}" />"#)?; + c += r; + match (r, first) { + (1, true) => write!(f, r#"<S t="0" d="{last_d}" />"#)?, + (1, false) => write!(f, r#"<S d="{last_d}" />"#)?, + (_, true) => write!(f, r#"<S t="0" d="{last_d}" r="{r}" />"#)?, + (_, false) => write!(f, r#"<S d="{last_d}" r="{r}" />"#)?, } + assert_eq!(c, self.0.len()); write!(f, "</SegmentTimeline>")?; Ok(()) } |