webmetro/src/fixers.rs

58 lines
1.7 KiB
Rust
Raw Normal View History

use futures::Async;
use futures::stream::Stream;
use chunk::Chunk;
pub struct ChunkTimecodeFixer<S> {
stream: S,
current_offset: u64,
last_observed_timecode: u64,
assumed_duration: u64,
seen_header: bool
}
impl<S: Stream<Item = Chunk>> Stream for ChunkTimecodeFixer<S>
{
type Item = S::Item;
type Error = S::Error;
fn poll(&mut self) -> Result<Async<Option<Self::Item>>, Self::Error> {
let mut poll_chunk = self.stream.poll();
match poll_chunk {
Ok(Async::Ready(Some(Chunk::ClusterHead(ref mut cluster_head)))) => {
let start = cluster_head.start;
if start < self.last_observed_timecode {
let next_timecode = self.last_observed_timecode + self.assumed_duration;
self.current_offset = next_timecode - start;
}
cluster_head.update_timecode(start + self.current_offset);
2018-03-30 06:44:42 +00:00
self.last_observed_timecode = cluster_head.end;
},
Ok(Async::Ready(Some(Chunk::Headers {..}))) => {
if self.seen_header {
return self.poll();
} else {
self.seen_header = true;
}
},
_ => {}
};
poll_chunk
}
}
2018-04-07 05:09:17 +00:00
pub trait ChunkStream where Self : Sized + Stream<Item = Chunk> {
fn fix_timecodes(self) -> ChunkTimecodeFixer<Self> {
ChunkTimecodeFixer {
stream: self,
current_offset: 0,
last_observed_timecode: 0,
assumed_duration: 33,
seen_header: false
}
}
}
2018-04-07 05:09:17 +00:00
impl<T: Stream<Item = Chunk>> ChunkStream for T {}