diff options
Diffstat (limited to 'remuxer/src/extract.rs')
-rw-r--r-- | remuxer/src/extract.rs | 24 |
1 files changed, 15 insertions, 9 deletions
diff --git a/remuxer/src/extract.rs b/remuxer/src/extract.rs index 108b76c..1b2b50c 100644 --- a/remuxer/src/extract.rs +++ b/remuxer/src/extract.rs @@ -6,8 +6,8 @@ use crate::seek_index::get_seek_index; use anyhow::{anyhow, bail}; use jellycommon::LocalTrack; -use jellymatroska::{block::Block, read::EbmlReader, unflatten::IterWithPos, Master, MatroskaTag}; -use log::{debug, info}; +use jellymatroska::{block::Block, read::EbmlReader, Master, MatroskaTag}; +use log::debug; use std::{fs::File, io::BufReader, path::PathBuf}; pub fn extract_track( @@ -20,12 +20,16 @@ pub fn extract_track( let index = get_seek_index(&source_path)?; let index = index .get(&(track_info.track as u64)) - .ok_or(anyhow!("track missing 4"))?; + .ok_or(anyhow!("track missing"))?; let mut out = Vec::new(); for b in &index.blocks { - reader.seek(b.source_off, MatroskaTag::Cluster(Master::Start))?; + reader.seek(b.source_off, MatroskaTag::BlockGroup(Master::Start))?; let (duration, block) = read_group(&mut reader)?; + assert_eq!( + track_info.track, block.track as usize, + "seek index is wrong" + ); out.push((b.pts, duration, block.data)) } Ok(out) @@ -33,23 +37,25 @@ pub fn extract_track( pub fn read_group(segment: &mut EbmlReader) -> anyhow::Result<(u64, Block)> { let (mut dur, mut block) = (None, None); - loop { - let item = segment.next().ok_or(anyhow!("eof"))??; + for _ in 0..10 { + let (_, item) = segment.next().ok_or(anyhow!("eof"))??; match item { MatroskaTag::Void(_) => (), MatroskaTag::Crc32(_) => (), - MatroskaTag::Cluster(_) => (), + MatroskaTag::Cluster(_) => bail!("unexpected cluster"), MatroskaTag::Timestamp(_) => (), MatroskaTag::SimpleBlock(_buf) => { - // bail!("unexpected simpleblock, where a group was expected") + let block = Block::parse(&_buf)?; + return Ok((1000, block)); // HDMV/PGS does not use duration?! } MatroskaTag::BlockGroup(Master::Start) => (), MatroskaTag::BlockGroup(Master::End) => return Ok((dur.unwrap(), block.unwrap())), MatroskaTag::BlockDuration(duration) => dur = Some(duration), MatroskaTag::Block(buf) => block = Some(Block::parse(&buf)?), MatroskaTag::Cues(_) => bail!("reached cues, this is the end"), - MatroskaTag::Segment(Master::End) => info!("extractor reached segment end"), + MatroskaTag::Segment(Master::End) => bail!("extractor reached segment end"), _ => debug!("(rs) tag ignored: {item:?}"), } } + bail!(".") } |