aboutsummaryrefslogtreecommitdiff
path: root/stream
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2026-03-05 18:17:16 +0100
committermetamuffin <metamuffin@disroot.org>2026-03-05 18:17:16 +0100
commit8e7a87a8a663644e43e8dbbf087a60df4ac098e5 (patch)
tree9e443f6ddf1b4752f5442439abc91c3ea77a42f3 /stream
parent1184539329ee82f2e82b3261953ebc87e7b855e0 (diff)
downloadjellything-8e7a87a8a663644e43e8dbbf087a60df4ac098e5.tar
jellything-8e7a87a8a663644e43e8dbbf087a60df4ac098e5.tar.bz2
jellything-8e7a87a8a663644e43e8dbbf087a60df4ac098e5.tar.zst
dash segment timeline repeat
Diffstat (limited to 'stream')
-rw-r--r--stream/src/dash.rs33
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(())
}
}