Skip to content

Commit

Permalink
hls: remove segment url clones (again)
Browse files Browse the repository at this point in the history
  • Loading branch information
2bc4 committed Feb 15, 2024
1 parent fccdb86 commit 1bf5201
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 19 deletions.
26 changes: 15 additions & 11 deletions src/hls/playlist.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
use std::{
collections::{vec_deque::Iter, VecDeque},
collections::{vec_deque::IterMut, VecDeque},
env,
fmt::{self, Display, Formatter},
iter, mem,
Expand Down Expand Up @@ -334,27 +334,31 @@ impl MediaPlaylist {
Ok(())
}

pub fn segments(&self) -> QueueRange<'_> {
pub fn segments(&mut self) -> QueueRange<'_> {
if self.added == 0 {
QueueRange::Empty
} else if self.added == self.segments.len() {
QueueRange::Back(self.segments.back())
QueueRange::Back(self.segments.back_mut())
} else {
QueueRange::Partial(self.segments.range(self.segments.len() - self.added..))
QueueRange::Partial(self.segments.range_mut(self.segments.len() - self.added..))
}
}

pub fn last_duration(&self) -> Option<&Duration> {
self.segments.iter().rev().find_map(|s| match s {
Segment::Normal(duration, _) => Some(duration),
_ => None,
})
pub fn last_duration(&mut self) -> Option<Duration> {
self.segments
.iter()
.rev()
.find_map(|s| match s {
Segment::Normal(duration, _) => Some(duration),
_ => None,
})
.copied()
}
}

pub enum QueueRange<'a> {
Partial(Iter<'a, Segment>),
Back(Option<&'a Segment>),
Partial(IterMut<'a, Segment>),
Back(Option<&'a mut Segment>),
Empty,
}

Expand Down
16 changes: 8 additions & 8 deletions src/hls/segment.rs
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
use std::{cmp::Ordering, str::FromStr, thread, time::Duration as StdDuration, time::Instant};
use std::{cmp::Ordering, mem, str::FromStr, thread, time::Duration as StdDuration, time::Instant};

use anyhow::{bail, Context, Result};
use log::{debug, info};

use super::playlist::{MediaPlaylist, QueueRange};
use crate::{http::Url, worker::Worker};

#[derive(Default, Clone, Debug)]
#[derive(Default, Copy, Clone, Debug)]
pub struct Duration {
pub is_ad: bool,
inner: StdDuration,
Expand Down Expand Up @@ -106,14 +106,14 @@ impl Handler {
}

match self.playlist.segments() {
QueueRange::Partial(segments) => {
QueueRange::Partial(ref mut segments) => {
for segment in segments {
debug!("Sending segment to worker:\n{segment:?}");
match segment {
Segment::Normal(_, url)
| Segment::NextPrefetch(url)
| Segment::NewestPrefetch(url) => {
self.worker.url(url.clone())?;
self.worker.url(mem::take(url))?;
}
}
}
Expand All @@ -130,16 +130,16 @@ impl Handler {
debug!("Sending newest segment to worker:\n{newest:?}");

match newest {
Segment::Normal(duration, url) => {
self.worker.url(url.clone())?;
Segment::Normal(duration, ref mut url) => {
self.worker.url(mem::take(url))?;
duration.sleep(time.elapsed());
}
Segment::NewestPrefetch(url) => self.worker.sync_url(url.clone())?,
Segment::NewestPrefetch(ref mut url) => self.worker.sync_url(mem::take(url))?,
Segment::NextPrefetch(_) => bail!("Failed to resolve newest segment"),
}
}
QueueRange::Empty => {
if *last_duration < Duration::MAX {
if last_duration < Duration::MAX {
info!("Playlist unchanged, retrying...");
}

Expand Down

0 comments on commit 1bf5201

Please sign in to comment.