diff options
| author | metamuffin <metamuffin@disroot.org> | 2026-03-05 18:17:16 +0100 |
|---|---|---|
| committer | metamuffin <metamuffin@disroot.org> | 2026-03-05 18:17:16 +0100 |
| commit | 8e7a87a8a663644e43e8dbbf087a60df4ac098e5 (patch) | |
| tree | 9e443f6ddf1b4752f5442439abc91c3ea77a42f3 /stream | |
| parent | 1184539329ee82f2e82b3261953ebc87e7b855e0 (diff) | |
| download | jellything-8e7a87a8a663644e43e8dbbf087a60df4ac098e5.tar jellything-8e7a87a8a663644e43e8dbbf087a60df4ac098e5.tar.bz2 jellything-8e7a87a8a663644e43e8dbbf087a60df4ac098e5.tar.zst | |
dash segment timeline repeat
Diffstat (limited to 'stream')
| -rw-r--r-- | stream/src/dash.rs | 33 |
1 files changed, 24 insertions, 9 deletions
diff --git a/stream/src/dash.rs b/stream/src/dash.rs index 53db3c4..bfec78c 100644 --- a/stream/src/dash.rs +++ b/stream/src/dash.rs @@ -182,19 +182,34 @@ impl Display for Time { struct Timeline<'a>(&'a [Range<f64>]); impl Display for Timeline<'_> { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - writeln!(f, "<SegmentTimeline>")?; + write!(f, "<SegmentTimeline>")?; let mut last_t = 0; - for (i, r) in self.0.iter().enumerate() { - let t = (r.start * 1000.) as i64; + let mut last_d = 0; + let mut r = 0; + let mut first = true; + for seg in self.0 { + let t = (seg.end * 1000.) as i64; let d = t - last_t; - last_t = t; - if i == 0 { - writeln!(f, r#"<S t="0" d="{d}" />"#)?; - } else { - writeln!(f, r#"<S d="{d}" />"#)?; + r += 1; + if d != last_d && last_d != 0 { + 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}" />"#)?, + } + first = false; + r = 0; } + 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}" />"#)?; } - writeln!(f, "</SegmentTimeline>")?; + write!(f, "</SegmentTimeline>")?; Ok(()) } } |