aboutsummaryrefslogtreecommitdiff
path: root/ebml/src/mod.rs
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2023-01-13 17:12:47 +0100
committermetamuffin <metamuffin@disroot.org>2023-01-13 17:12:47 +0100
commitb192ec740d358d0e12eedd1308d006e080b3d8c2 (patch)
treef642ddaa0e35694f611cc97978f1031431b5fef2 /ebml/src/mod.rs
parent7ca91b6f33bb260bc966e853c832b4339c1c2ae0 (diff)
downloadjellything-b192ec740d358d0e12eedd1308d006e080b3d8c2.tar
jellything-b192ec740d358d0e12eedd1308d006e080b3d8c2.tar.bz2
jellything-b192ec740d358d0e12eedd1308d006e080b3d8c2.tar.zst
new starting with a new ebml impl
Diffstat (limited to 'ebml/src/mod.rs')
-rw-r--r--ebml/src/mod.rs48
1 files changed, 48 insertions, 0 deletions
diff --git a/ebml/src/mod.rs b/ebml/src/mod.rs
new file mode 100644
index 0000000..5da6809
--- /dev/null
+++ b/ebml/src/mod.rs
@@ -0,0 +1,48 @@
+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<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..."),
+ })
+ }
+}