use std::io::{Read, Seek}; use anyhow::Result; pub struct EbmlReader { inner: T, position: usize, } impl EbmlReader { pub fn new(inner: T) -> Self { Self { inner, position: 0 } } pub fn read_byte(&mut self) -> Result { 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 { 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(()) } }