diff options
Diffstat (limited to 'remuxer/src/format/ebml/read.rs')
-rw-r--r-- | remuxer/src/format/ebml/read.rs | 44 |
1 files changed, 44 insertions, 0 deletions
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(()) + + } +} + |