diff options
author | metamuffin <metamuffin@disroot.org> | 2023-01-15 00:00:44 +0100 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2023-01-15 00:00:44 +0100 |
commit | 943ffe0d1dc2addf2f4f5db781e3d83c900b372d (patch) | |
tree | 9c15a544682d985894f3106a45f07bac172c65ad | |
parent | 439dc00d1ce9ff3e5dc05f32a0426152fc5fab89 (diff) | |
download | jellything-943ffe0d1dc2addf2f4f5db781e3d83c900b372d.tar jellything-943ffe0d1dc2addf2f4f5db781e3d83c900b372d.tar.bz2 jellything-943ffe0d1dc2addf2f4f5db781e3d83c900b372d.tar.zst |
shit
-rw-r--r-- | ebml/src/bin/mkvdump.rs | 2 | ||||
-rw-r--r-- | ebml/src/read.rs | 31 | ||||
-rw-r--r-- | ebml/src/size.rs | 8 | ||||
-rw-r--r-- | ebml/src/write.rs | 2 |
4 files changed, 22 insertions, 21 deletions
diff --git a/ebml/src/bin/mkvdump.rs b/ebml/src/bin/mkvdump.rs index ae621e6..45030cd 100644 --- a/ebml/src/bin/mkvdump.rs +++ b/ebml/src/bin/mkvdump.rs @@ -8,7 +8,7 @@ fn main() -> anyhow::Result<()> { while let Some(tag) = r.next() { let tag = tag?; - println!("{} {tag:?}", r.position) + eprintln!("{} {tag:?}", r.position) } Ok(()) } diff --git a/ebml/src/read.rs b/ebml/src/read.rs index 9e080be..56eec51 100644 --- a/ebml/src/read.rs +++ b/ebml/src/read.rs @@ -1,3 +1,4 @@ +use crate::{matroska::MatroskaTag, size::EbmlSize, Master}; use anyhow::{anyhow, bail, Result}; use log::{debug, warn}; use std::{ @@ -5,8 +6,6 @@ use std::{ io::{Read, Seek, SeekFrom}, }; -use crate::{matroska::MatroskaTag, size::EbmlSize, Master}; - trait ReadAndSeek: Read + Seek {} impl<T: Read + Seek> ReadAndSeek for T {} @@ -81,6 +80,7 @@ impl EbmlReader { if self.position != end { warn!("we missed the end by {} bytes", self.position - end) } + eprintln!("closed (size): {:x}", e.id); self.stack.pop(); self.queue .push_back(MatroskaTag::construct_master(e.id, Master::End)?); @@ -91,10 +91,17 @@ impl EbmlReader { let id = self.read_tag_id()?; let size = self.read_tag_size()?; let is_master = MatroskaTag::is_master(id)?; + let mut collect = false; let tag = if is_master { + match id { + 0x18538067 => (), // segment + 0x1F43B675 => (), // cluster + _ => collect = true, + } + // we cant collect here, so insert a placeholder MatroskaTag::construct_master(id, Master::Start)? } else { - let data = self.read_buf(size)?; + let data = self.read_buf(size.some().unwrap())?; MatroskaTag::parse(id, &data)? }; @@ -102,16 +109,16 @@ impl EbmlReader { // we have slightly different rules for closing tags implicitly // this closes as many tags as needed to make the next tag a valid child while let Some(tag @ StackTag { end: None, .. }) = self.stack.last() { - let mut valid_child = false; - for p in path { - if *p == tag.id { - valid_child = true; - } - } + // for p in path { + // if *p == tag.id { + // valid_child = true; + // } + // } + let valid_child = path.last() == Some(&tag.id); if valid_child { break; } else { - debug!("{id}"); + eprintln!("closed (automatic): {:x}", tag.id); self.queue.push_back(MatroskaTag::construct_master( self.stack.pop().unwrap().id, Master::End, @@ -151,6 +158,7 @@ impl EbmlReader { pub fn collect_master(&mut self, master: MatroskaTag) -> Result<Vec<MatroskaTag>> { let end = MatroskaTag::construct_master(master.id(), Master::End)?; + eprintln!("start {master:?}"); let mut out = vec![]; while let Some(t) = self.next() { let t = t?; @@ -160,6 +168,7 @@ impl EbmlReader { out.push(t) } } + eprintln!("end {end:?} with {} els", out.len()); Ok(out) } } @@ -236,6 +245,6 @@ impl ReadValue for String { } impl ReadValue for Master { fn from_buf(_: &[u8]) -> anyhow::Result<Self> { - bail!("master cannot be parsed") + panic!("master shall not be read like this") } } diff --git a/ebml/src/size.rs b/ebml/src/size.rs index 06d6ba8..e774f0a 100644 --- a/ebml/src/size.rs +++ b/ebml/src/size.rs @@ -19,11 +19,3 @@ impl EbmlSize { } } } -impl Into<usize> for EbmlSize { - fn into(self) -> usize { - match self { - EbmlSize::Exact(s) => s, - EbmlSize::Unknown => panic!("unknown size, where it should have been known"), - } - } -} diff --git a/ebml/src/write.rs b/ebml/src/write.rs index 2191693..fc12ffc 100644 --- a/ebml/src/write.rs +++ b/ebml/src/write.rs @@ -148,7 +148,7 @@ impl WriteValue for Master { for c in c { c.write_full(&mut ib)?; } - EbmlSize::Exact(ib.len()).write_to(w); + EbmlSize::Exact(ib.len()).write_to(w)?; w.extend_from_slice(&ib); Ok(()) } |