Treat WebmElements as value types

This commit is contained in:
Tangent 128 2018-04-04 19:55:20 -04:00
parent 45012385c2
commit 7b9df1e269
4 changed files with 27 additions and 27 deletions

View File

@ -37,15 +37,15 @@ pub fn main() {
let mut fixer = TimecodeFixer::new(); let mut fixer = TimecodeFixer::new();
for element in &head { for element in &head {
encode_webm_element(&fixer.process(element), &mut cursor).unwrap(); encode_webm_element(fixer.process(element), &mut cursor).unwrap();
} }
for element in &body { for element in &body {
encode_webm_element(&fixer.process(element), &mut cursor).unwrap(); encode_webm_element(fixer.process(element), &mut cursor).unwrap();
} }
for element in &body { for element in &body {
encode_webm_element(&fixer.process(element), &mut cursor).unwrap(); encode_webm_element(fixer.process(element), &mut cursor).unwrap();
} }
output = cursor.into_inner(); output = cursor.into_inner();

View File

@ -6,23 +6,23 @@ use lab_ebml::webm::*;
pub fn main() { pub fn main() {
let mut cursor = Cursor::new(Vec::new()); let mut cursor = Cursor::new(Vec::new());
encode_webm_element(&WebmElement::EbmlHead, &mut cursor).unwrap(); encode_webm_element(WebmElement::EbmlHead, &mut cursor).unwrap();
encode_webm_element(&WebmElement::Segment, &mut cursor).unwrap(); encode_webm_element(WebmElement::Segment, &mut cursor).unwrap();
encode_webm_element(&WebmElement::Tracks(&[]), &mut cursor).unwrap(); encode_webm_element(WebmElement::Tracks(&[]), &mut cursor).unwrap();
encode_webm_element(&WebmElement::Cluster, &mut cursor).unwrap(); encode_webm_element(WebmElement::Cluster, &mut cursor).unwrap();
encode_webm_element(&WebmElement::Timecode(0), &mut cursor).unwrap(); encode_webm_element(WebmElement::Timecode(0), &mut cursor).unwrap();
encode_webm_element(&WebmElement::SimpleBlock(SimpleBlock { encode_webm_element(WebmElement::SimpleBlock(SimpleBlock {
track: 3, track: 3,
flags: 0x0, flags: 0x0,
timecode: 123, timecode: 123,
data: "Hello, World".as_bytes() data: "Hello, World".as_bytes()
}), &mut cursor).unwrap(); }), &mut cursor).unwrap();
encode_webm_element(&WebmElement::Cluster, &mut cursor).unwrap(); encode_webm_element(WebmElement::Cluster, &mut cursor).unwrap();
encode_webm_element(&WebmElement::Timecode(1000), &mut cursor).unwrap(); encode_webm_element(WebmElement::Timecode(1000), &mut cursor).unwrap();
stdout().write_all(&cursor.get_ref()).unwrap(); stdout().write_all(&cursor.get_ref()).unwrap();
} }

View File

@ -33,8 +33,8 @@ impl ClusterHead {
self.end = self.start + delta; self.end = self.start + delta;
let mut cursor = Cursor::new(self.bytes.as_mut()); let mut cursor = Cursor::new(self.bytes.as_mut());
// buffer is sized so these should never fail // buffer is sized so these should never fail
encode_webm_element(&WebmElement::Cluster, &mut cursor).unwrap(); encode_webm_element(WebmElement::Cluster, &mut cursor).unwrap();
encode_webm_element(&WebmElement::Timecode(timecode), &mut cursor).unwrap(); encode_webm_element(WebmElement::Timecode(timecode), &mut cursor).unwrap();
self.bytes_used = cursor.position() as u8; self.bytes_used = cursor.position() as u8;
} }
pub fn observe_simpleblock_timecode(&mut self, timecode: i16) { pub fn observe_simpleblock_timecode(&mut self, timecode: i16) {
@ -120,7 +120,7 @@ impl<'a, S: EbmlEventSource> Stream for WebmChunker<S>
Ok(Async::Ready(Some(WebmElement::Info))) => continue, Ok(Async::Ready(Some(WebmElement::Info))) => continue,
Ok(Async::Ready(Some(WebmElement::Void))) => continue, Ok(Async::Ready(Some(WebmElement::Void))) => continue,
Ok(Async::Ready(Some(element @ _))) => { Ok(Async::Ready(Some(element @ _))) => {
match encode_webm_element(&element, buffer) { match encode_webm_element(element, buffer) {
Ok(_) => continue, Ok(_) => continue,
Err(err) => ( Err(err) => (
Err(ChunkingError::IoError(err)), Err(ChunkingError::IoError(err)),
@ -152,7 +152,7 @@ impl<'a, S: EbmlEventSource> Stream for WebmChunker<S>
cluster_head.keyframe = true; cluster_head.keyframe = true;
} }
cluster_head.observe_simpleblock_timecode(block.timecode); cluster_head.observe_simpleblock_timecode(block.timecode);
match encode_webm_element(&WebmElement::SimpleBlock(*block), buffer) { match encode_webm_element(WebmElement::SimpleBlock(*block), buffer) {
Ok(_) => continue, Ok(_) => continue,
Err(err) => ( Err(err) => (
Err(ChunkingError::IoError(err)), Err(ChunkingError::IoError(err)),
@ -164,7 +164,7 @@ impl<'a, S: EbmlEventSource> Stream for WebmChunker<S>
Ok(Async::Ready(Some(WebmElement::Void))) => continue, Ok(Async::Ready(Some(WebmElement::Void))) => continue,
Ok(Async::Ready(Some(WebmElement::Unknown(_)))) => continue, Ok(Async::Ready(Some(WebmElement::Unknown(_)))) => continue,
Ok(Async::Ready(Some(element @ _))) => { Ok(Async::Ready(Some(element @ _))) => {
match encode_webm_element(&element, buffer) { match encode_webm_element(element, buffer) {
Ok(_) => continue, Ok(_) => continue,
Err(err) => ( Err(err) => (
Err(ChunkingError::IoError(err)), Err(ChunkingError::IoError(err)),

View File

@ -86,8 +86,8 @@ fn decode_simple_block(bytes: &[u8]) -> Result<WebmElement, EbmlError> {
} }
} }
pub fn encode_simple_block<T: Write>(block: &SimpleBlock, output: &mut T) -> IoResult<()> { pub fn encode_simple_block<T: Write>(block: SimpleBlock, output: &mut T) -> IoResult<()> {
let &SimpleBlock { let SimpleBlock {
track, track,
timecode, timecode,
flags, flags,
@ -111,18 +111,18 @@ pub fn encode_simple_block<T: Write>(block: &SimpleBlock, output: &mut T) -> IoR
output.write_all(data) output.write_all(data)
} }
pub fn encode_webm_element<T: Write + Seek>(element: &WebmElement, output: &mut T) -> IoResult<()> { pub fn encode_webm_element<T: Write + Seek>(element: WebmElement, output: &mut T) -> IoResult<()> {
match element { match element {
&WebmElement::EbmlHead => encode_element(EBML_HEAD_ID, output, |output| { WebmElement::EbmlHead => encode_element(EBML_HEAD_ID, output, |output| {
encode_bytes(DOC_TYPE_ID, "webm".as_bytes(), output) encode_bytes(DOC_TYPE_ID, "webm".as_bytes(), output)
}), }),
&WebmElement::Segment => encode_tag_header(SEGMENT_ID, Varint::Unknown, output), WebmElement::Segment => encode_tag_header(SEGMENT_ID, Varint::Unknown, output),
&WebmElement::SeekHead => Ok(()), WebmElement::SeekHead => Ok(()),
&WebmElement::Cues => Ok(()), WebmElement::Cues => Ok(()),
&WebmElement::Tracks(data) => encode_bytes(TRACKS_ID, data, output), WebmElement::Tracks(data) => encode_bytes(TRACKS_ID, data, output),
&WebmElement::Cluster => encode_tag_header(CLUSTER_ID, Varint::Unknown, output), WebmElement::Cluster => encode_tag_header(CLUSTER_ID, Varint::Unknown, output),
&WebmElement::Timecode(time) => encode_integer(TIMECODE_ID, time, output), WebmElement::Timecode(time) => encode_integer(TIMECODE_ID, time, output),
&WebmElement::SimpleBlock(ref block) => encode_simple_block(block, output), WebmElement::SimpleBlock(block) => encode_simple_block(block, output),
_ => Err(IoError::new(ErrorKind::InvalidInput, WriteError::OutOfRange)) _ => Err(IoError::new(ErrorKind::InvalidInput, WriteError::OutOfRange))
} }
} }