use crate::format::matroska::read::EbmlSize; use self::read::EbmlReader; use anyhow::{bail, Result}; use log::debug; pub mod matroska; pub mod read; #[derive(Debug, Clone)] pub enum Master { Start, End, } #[derive(Debug, Clone)] pub enum MatroskaTag { Ebml(Master), EbmlVersion(u64), EbmlReadVersion(u64), EbmlMaxIdLength(u64), EbmlMaxSizeLength(u64), DocType(String), DocTypeVersion(u64), DocTypeReadVersion(u64), DocTypeExtension(Master), } impl EbmlReader { pub fn read_tag(&mut self) -> Result { let id = self.read_tag_id()?; let size = EbmlSize::from_vint(self.read_vint_len()?); debug!("tag id={id:x}, size={size:?}"); Ok(match id { 0x1a45dfa3 => MatroskaTag::Ebml(Master::Start), 0x4286 => MatroskaTag::EbmlVersion(self.read_vint()?), 0x42f7 => MatroskaTag::EbmlReadVersion(self.read_vint()?), 0x42f2 => MatroskaTag::EbmlMaxIdLength(self.read_vint()?), 0x42f3 => MatroskaTag::EbmlMaxSizeLength(self.read_vint()?), 0x4282 => MatroskaTag::DocType(self.read_utf8(size)?), 0x4287 => MatroskaTag::DocTypeVersion(self.read_vint()?), 0x4285 => MatroskaTag::DocTypeReadVersion(self.read_vint()?), 0x4281 => MatroskaTag::DocTypeExtension(Master::Start), _ => bail!("thats not a tag we know..."), }) } }