aboutsummaryrefslogtreecommitdiff
path: root/ebml/src/lib.rs
diff options
context:
space:
mode:
Diffstat (limited to 'ebml/src/lib.rs')
-rw-r--r--ebml/src/lib.rs66
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)
- }
-}