Create Chunk type for use in packaging WebM streams for clients.
This commit is contained in:
parent
db1731f776
commit
0a18cb408f
2 changed files with 51 additions and 0 deletions
50
src/chunk.rs
Normal file
50
src/chunk.rs
Normal file
|
@ -0,0 +1,50 @@
|
||||||
|
use std::rc::Rc;
|
||||||
|
|
||||||
|
pub enum Chunk {
|
||||||
|
Headers {
|
||||||
|
bytes: Rc<Vec<u8>>
|
||||||
|
},
|
||||||
|
ClusterHead {
|
||||||
|
keyframe: bool,
|
||||||
|
start: u64,
|
||||||
|
end: u64,
|
||||||
|
// space for a Cluster tag and a Timecode tag
|
||||||
|
bytes: [u8;16]
|
||||||
|
},
|
||||||
|
ClusterBody {
|
||||||
|
bytes: Rc<Vec<u8>>
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl AsRef<[u8]> for Chunk {
|
||||||
|
fn as_ref(&self) -> &[u8] {
|
||||||
|
match self {
|
||||||
|
&Chunk::Headers {ref bytes, ..} => &bytes,
|
||||||
|
&Chunk::ClusterHead {ref bytes, ..} => bytes,
|
||||||
|
&Chunk::ClusterBody {ref bytes, ..} => &bytes
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
|
||||||
|
use chunk::*;
|
||||||
|
use std::io::Cursor;
|
||||||
|
use webm::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn enough_space_for_header() {
|
||||||
|
let mut chunk = Chunk::ClusterHead {
|
||||||
|
keyframe: false,
|
||||||
|
start: 0,
|
||||||
|
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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -2,6 +2,7 @@
|
||||||
extern crate bytes;
|
extern crate bytes;
|
||||||
extern crate futures;
|
extern crate futures;
|
||||||
|
|
||||||
|
pub mod chunk;
|
||||||
pub mod ebml;
|
pub mod ebml;
|
||||||
mod iterator;
|
mod iterator;
|
||||||
pub mod timecode_fixer;
|
pub mod timecode_fixer;
|
||||||
|
|
Loading…
Reference in a new issue