diff options
Diffstat (limited to 'remuxer/src/format/ebml')
-rw-r--r-- | remuxer/src/format/ebml/matroska.rs | 39 | ||||
-rw-r--r-- | remuxer/src/format/ebml/mod.rs | 3 | ||||
-rw-r--r-- | remuxer/src/format/ebml/read.rs | 44 | ||||
-rw-r--r-- | remuxer/src/format/ebml/write.rs | 38 |
4 files changed, 124 insertions, 0 deletions
diff --git a/remuxer/src/format/ebml/matroska.rs b/remuxer/src/format/ebml/matroska.rs new file mode 100644 index 0000000..50aa783 --- /dev/null +++ b/remuxer/src/format/ebml/matroska.rs @@ -0,0 +1,39 @@ +pub enum TagType { + Master, + UnsignedInt, + Integer, + Utf8, + Binary, + Float, +} + +macro_rules! define_ebml { + ($master:ident { $($name:ident: $kind:ty = $id:literal),* }) => { + pub enum $master { + $($name($kind)),* + } + impl $master { + + } + }; +} + +// 0x1a45dfa3 +define_ebml! { + Ebml { + EbmlVersion: u64 = 0x4286, + EbmlReadVersion: u64 = 0x42f7, + EbmlMaxIdLength: u64 = 0x42f2, + EbmlMaxSizeLength: u64 = 0x42f3, + DocType: String = 0x4282, + DocTypeVersion: u64 = 0x4287, + DocTypeReadVersion: u64 = 0x4285, + DocTypeExtension: DocTypeExtension = 0x4281 + } +} +define_ebml! { + DocTypeExtension { + Name: String = 0x4283, + Version: u64 = 0x4284 + } +} diff --git a/remuxer/src/format/ebml/mod.rs b/remuxer/src/format/ebml/mod.rs new file mode 100644 index 0000000..d8a703a --- /dev/null +++ b/remuxer/src/format/ebml/mod.rs @@ -0,0 +1,3 @@ +pub mod read; +pub mod write; +pub mod matroska; diff --git a/remuxer/src/format/ebml/read.rs b/remuxer/src/format/ebml/read.rs new file mode 100644 index 0000000..06ccf2f --- /dev/null +++ b/remuxer/src/format/ebml/read.rs @@ -0,0 +1,44 @@ +use std::io::{Read, Seek}; + +use anyhow::Result; + +pub struct EbmlReader<T> { + inner: T, + position: usize, +} + +impl<T: Read + Seek> EbmlReader<T> { + pub fn new(inner: T) -> Self { + Self { inner, position: 0 } + } + + pub fn read_byte(&mut self) -> Result<u8> { + let mut b = [0u8]; + self.inner.read_exact(&mut b)?; + Ok(b[0]) + } + pub fn read_vint(&mut self) -> Result<(u64, u64)> { + let s = self.read_byte()? as u64; + let len = s.leading_zeros() + 1; + let mut value = s; + value -= 1 << (8 - len); + for _ in 0..(len - 1) { + value <<= 8; + value += self.read_byte()? as u64; + } + Ok((value, len.into())) + } + + pub fn read_tag_id(&mut self) -> Result<u64> { + let (value, len) = self.read_vint()?; + Ok(value + (1 << (7 * len))) + } + + pub fn read_tag(&mut self) -> Result<()> { + let id = self.read_tag_id()?; + + Ok(()) + + } +} + diff --git a/remuxer/src/format/ebml/write.rs b/remuxer/src/format/ebml/write.rs new file mode 100644 index 0000000..1dee225 --- /dev/null +++ b/remuxer/src/format/ebml/write.rs @@ -0,0 +1,38 @@ +use anyhow::{bail, Result}; +use std::io::Write; + +pub struct EbmlWriter<T> { + inner: T, + position: usize, +} + +impl<T: Write> EbmlWriter<T> { + pub fn new(inner: T, position: usize) -> Self { + Self { inner, position } + } + + pub fn write(&mut self, data: &[u8]) -> Result<()> { + self.inner.write_all(data)?; + self.position += data.len(); + Ok(()) + } + + pub fn write_vint(&mut self, i: u64) -> Result<()> { + if i > (1 << 56) - 1 { + bail!("vint does not fit"); + } + let mut len = 1; + while len <= 8 { + if i < (1 << ((7 * len) - 1)) { + break; + } + len += 1; + } + let mut bytes = i.to_be_bytes(); + bytes[0] |= 1 << (8 - len); + self.write(&bytes) + } + +} + + |