diff --git a/src/chunk.rs b/src/chunk.rs index c68fd22..4c46bfd 100644 --- a/src/chunk.rs +++ b/src/chunk.rs @@ -1,4 +1,6 @@ +use std::io::Cursor; use std::rc::Rc; +use webm::*; #[derive(Clone)] pub enum Chunk = Vec> { @@ -17,6 +19,20 @@ pub enum Chunk = Vec> { } } +impl> Chunk { + pub fn update_timecode(&mut self, timecode: u64) { + if let &mut Chunk::ClusterHead {ref mut start, ref mut end, ref mut bytes, ..} = self { + let delta = *end - *start; + *start = timecode; + *end = *start + delta; + let mut cursor = Cursor::new(bytes as &mut [u8]); + // buffer is sized so these should never fail + encode_webm_element(&WebmElement::Cluster, &mut cursor).unwrap(); + encode_webm_element(&WebmElement::Timecode(timecode), &mut cursor).unwrap(); + } + } +} + impl> AsRef<[u8]> for Chunk { fn as_ref(&self) -> &[u8] { match self { @@ -31,8 +47,6 @@ impl> AsRef<[u8]> for Chunk { mod tests { use chunk::*; - use std::io::Cursor; - use webm::*; #[test] fn enough_space_for_header() { @@ -42,10 +56,6 @@ mod tests { end: 0, bytes: [0;16] }; - if let Chunk::ClusterHead {ref mut bytes, ..} = chunk { - let mut cursor = Cursor::new(bytes as &mut [u8]); - encode_webm_element(&WebmElement::Cluster, &mut cursor).unwrap(); - encode_webm_element(&WebmElement::Timecode(u64::max_value()), &mut cursor).unwrap(); - } + chunk.update_timecode(u64::max_value()); } }