Implement decode_simple_block

This commit is contained in:
Tangent 128 2017-07-01 01:30:43 -04:00
parent 51156d9fde
commit a00d43e124
4 changed files with 31 additions and 4 deletions

View File

@ -4,4 +4,5 @@ version = "0.1.0"
authors = ["Tangent 128 <Tangent128@gmail.com>"]
[dependencies]
byteorder = "1"
futures = "^0.1.7"

View File

@ -22,7 +22,7 @@ pub fn main() {
match element {
// suppress printing byte arrays
Tracks(slice) => println!("Tracks[{}]", slice.len()),
Cluster(slice) => println!("Cluster[{}]", slice.len()),
SimpleBlock{timecode, ..} => println!("SimpleBlock@{}", timecode),
other => println!("{:?}", other)
}
}

View File

@ -1,4 +1,5 @@
extern crate byteorder;
extern crate futures;
pub mod ebml;

View File

@ -1,3 +1,4 @@
use byteorder::{BigEndian, ByteOrder};
use ebml::*;
const SEGMENT_ID: u64 = 0x08538067;
@ -21,7 +22,12 @@ pub enum WebmElement<'b> {
Tracks(&'b[u8]),
Cluster,
Timecode(u64),
SimpleBlock(&'b[u8]),
SimpleBlock {
track: u64,
timecode: i16,
flags: u8,
data: &'b[u8]
},
Unknown(u64)
}
@ -47,13 +53,32 @@ impl<'a> Schema<'a> for Webm {
CUES_ID => Ok(WebmElement::Cues),
TRACKS_ID => Ok(WebmElement::Tracks(bytes)),
CLUSTER_ID => Ok(WebmElement::Cluster),
TIMECODE_ID => Ok(WebmElement::Timecode(0)),
SIMPLE_BLOCK_ID => Ok(WebmElement::SimpleBlock(bytes)),
TIMECODE_ID => decode_uint(bytes).map(WebmElement::Timecode),
SIMPLE_BLOCK_ID => decode_simple_block(bytes),
_ => Ok(WebmElement::Unknown(element_id))
}
}
}
fn decode_simple_block(bytes: &[u8]) -> Result<WebmElement, Error> {
if let Ok(Some((Varint::Value(track), track_field_len))) = decode_varint(bytes) {
let header_len = track_field_len + 2 + 1;
if bytes.len() < header_len {
return Err(Error::CorruptPayload);
}
let timecode = BigEndian::read_i16(&bytes[track_field_len..]);
let flags = bytes[track_field_len + 2];
return Ok(WebmElement::SimpleBlock {
track: track,
timecode: timecode,
flags: flags,
data: &bytes[header_len..],
})
} else {
return Err(Error::CorruptPayload);
}
}
#[cfg(test)]
mod tests {
use tests::TEST_FILE;