From 8fb1a7033bc3936516f24b3a797d005ef9a54422 Mon Sep 17 00:00:00 2001 From: metamuffin Date: Fri, 26 Jan 2024 04:22:51 +0100 Subject: snippet subtitles are working. --- remuxer/src/segment_extractor.rs | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) (limited to 'remuxer/src/segment_extractor.rs') diff --git a/remuxer/src/segment_extractor.rs b/remuxer/src/segment_extractor.rs index bc5b44f..d176b3a 100644 --- a/remuxer/src/segment_extractor.rs +++ b/remuxer/src/segment_extractor.rs @@ -17,7 +17,11 @@ impl<'a> SegmentExtractIter<'a> { Self { segment, extract } } - pub fn next(&mut self) -> Result { + /// Returns the next block and sometimes its duration too. + pub fn next(&mut self) -> Result<(Block, Option)> { + let mut duration = None; + let mut group = false; + let mut saved_block = None; loop { let item = self.segment.next().ok_or(anyhow!("eof"))??; match item { @@ -25,13 +29,23 @@ impl<'a> SegmentExtractIter<'a> { MatroskaTag::Crc32(_) => (), MatroskaTag::Cluster(_) => (), MatroskaTag::Timestamp(_) => (), - MatroskaTag::BlockGroup(_) => (), - MatroskaTag::BlockDuration(_) => (), + MatroskaTag::BlockGroup(Master::Start) => group = true, + MatroskaTag::BlockGroup(Master::End) => { + assert!(group, "group end without start"); + let block = saved_block.expect("blockgroup without any block"); + return Ok((block, duration)); + } + MatroskaTag::BlockDuration(d) => duration = Some(d), MatroskaTag::SimpleBlock(buf) | MatroskaTag::Block(buf) => { let block = Block::parse(&buf)?; if block.track == self.extract { trace!("block: track={} tso={}", block.track, block.timestamp_off); - return Ok(block); + if group { + // can't return yet; there might be a BlockDuration coming + saved_block = Some(block); + } else { + return Ok((block, duration)); + } } } MatroskaTag::Cues(_) => bail!("reached cues, this is the end"), -- cgit v1.2.3-70-g09d2