diff options
author | metamuffin <metamuffin@disroot.org> | 2023-01-14 10:39:06 +0100 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2023-01-14 10:39:06 +0100 |
commit | 855a8896175ee45a3376775203fa20e629d809b3 (patch) | |
tree | a63cfbbb3118ec976da2ab4f3d2f24630ab33400 /ebml/src/lib.rs | |
parent | 36e91c20eb59e76d5aeb35e644e7fb391f346dc6 (diff) | |
download | jellything-855a8896175ee45a3376775203fa20e629d809b3.tar jellything-855a8896175ee45a3376775203fa20e629d809b3.tar.bz2 jellything-855a8896175ee45a3376775203fa20e629d809b3.tar.zst |
matroska part 1
Diffstat (limited to 'ebml/src/lib.rs')
-rw-r--r-- | ebml/src/lib.rs | 66 |
1 files changed, 16 insertions, 50 deletions
diff --git a/ebml/src/lib.rs b/ebml/src/lib.rs index acebae3..7445bbc 100644 --- a/ebml/src/lib.rs +++ b/ebml/src/lib.rs @@ -1,8 +1,4 @@ -use crate::read::EbmlSize; - -use self::read::EbmlReader; -use anyhow::{bail, Result}; -use log::debug; +use anyhow::bail; pub mod matroska; pub mod read; @@ -14,53 +10,28 @@ pub enum Master { 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<MatroskaTag> { - 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..."), - }) - } -} - pub trait ValueFromBuf: Sized { fn from_buf(buf: &[u8]) -> anyhow::Result<Self>; } impl ValueFromBuf for u64 { fn from_buf(buf: &[u8]) -> anyhow::Result<Self> { - if buf.len() != 8 { - bail!("u64 is not 64 bits long") + // if buf.len() != 8 { + // bail!("u64 is not 64 bits long") + // } + // Ok((buf[0] as u64) << 24 + // | (buf[1] as u64) << 16 + // | (buf[2] as u64) << 8 + // | (buf[3] as u64) << 0) + if buf.len() > 8 { + bail!("u64 too big") + } + let mut val = 0u64; + for byte in buf { + val <<= 8; + val |= *byte as u64; } - Ok((buf[0] as u64) << 24 - | (buf[1] as u64) << 16 - | (buf[2] as u64) << 8 - | (buf[3] as u64) << 0) + Ok(val) } } impl ValueFromBuf for Vec<u8> { @@ -73,8 +44,3 @@ impl ValueFromBuf for String { Ok(String::from_utf8(Vec::from(buf))?) } } -impl ValueFromBuf for Master { - fn from_buf(_buf: &[u8]) -> anyhow::Result<Self> { - Ok(Master::Start) - } -} |