diff options
author | metamuffin <metamuffin@disroot.org> | 2024-01-26 04:22:51 +0100 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2024-01-26 04:22:51 +0100 |
commit | 8fb1a7033bc3936516f24b3a797d005ef9a54422 (patch) | |
tree | 56a08b891437425742e45dff8e66311da47a5028 /remuxer/src/segment_extractor.rs | |
parent | 2e41b2b373d5a057061a7694aa5e83001efeaf0f (diff) | |
download | jellything-8fb1a7033bc3936516f24b3a797d005ef9a54422.tar jellything-8fb1a7033bc3936516f24b3a797d005ef9a54422.tar.bz2 jellything-8fb1a7033bc3936516f24b3a797d005ef9a54422.tar.zst |
snippet subtitles are working.
Diffstat (limited to 'remuxer/src/segment_extractor.rs')
-rw-r--r-- | remuxer/src/segment_extractor.rs | 22 |
1 files changed, 18 insertions, 4 deletions
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<Block> { + /// Returns the next block and sometimes its duration too. + pub fn next(&mut self) -> Result<(Block, Option<u64>)> { + 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"), |