aboutsummaryrefslogtreecommitdiff
path: root/remuxer/src/format/ebml/read.rs
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2023-01-12 22:05:32 +0100
committermetamuffin <metamuffin@disroot.org>2023-01-12 22:05:32 +0100
commit7ca91b6f33bb260bc966e853c832b4339c1c2ae0 (patch)
tree573eea3ea72a55fff4d43f42de4ae6fe0af4b2d9 /remuxer/src/format/ebml/read.rs
parent047cb61bcf0ca61c58566ef5ca5d236234e46b21 (diff)
downloadjellything-7ca91b6f33bb260bc966e853c832b4339c1c2ae0.tar
jellything-7ca91b6f33bb260bc966e853c832b4339c1c2ae0.tar.bz2
jellything-7ca91b6f33bb260bc966e853c832b4339c1c2ae0.tar.zst
implementing my own ebml library
Diffstat (limited to 'remuxer/src/format/ebml/read.rs')
-rw-r--r--remuxer/src/format/ebml/read.rs44
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(())
+
+ }
+}
+