aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2026-03-05 18:22:02 +0100
committermetamuffin <metamuffin@disroot.org>2026-03-05 18:22:02 +0100
commit5fa35d0bc7e432a38f8d4a7e9214850d6edd8048 (patch)
tree1dc16aa234547d76072f8757efe53fc0d4e4390c
parent8e7a87a8a663644e43e8dbbf087a60df4ac098e5 (diff)
downloadjellything-5fa35d0bc7e432a38f8d4a7e9214850d6edd8048.tar
jellything-5fa35d0bc7e432a38f8d4a7e9214850d6edd8048.tar.bz2
jellything-5fa35d0bc7e432a38f8d4a7e9214850d6edd8048.tar.zst
fix off-by-one in segment timeline
-rw-r--r--stream/src/dash.rs18
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(())
}