diff options
Diffstat (limited to 'remuxer/src/snippet.rs')
-rw-r--r-- | remuxer/src/snippet.rs | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/remuxer/src/snippet.rs b/remuxer/src/snippet.rs index 5b271e4..8fcb109 100644 --- a/remuxer/src/snippet.rs +++ b/remuxer/src/snippet.rs @@ -160,7 +160,7 @@ pub fn write_snippet_into( let mut reader = SegmentExtractIter::new(&mut reader, local_track.track as u64); { - // TODO this one caused snippets to get dropped MSE for no reason + // TODO this one caused snippets to get dropped by MSE for no reason // for i in start_block_index..end_block_index { // let index_block = &index.blocks[i]; // let mut block = reader.next()?; @@ -179,14 +179,21 @@ pub fn write_snippet_into( let mut blocks = vec![MatroskaTag::Timestamp(0)]; for i in start_block_index..end_block_index { let index_block = &index.blocks[i]; - let mut block = reader.next()?; + let (mut block, duration) = reader.next()?; assert_eq!(index_block.size, block.data.len(), "seek index is wrong"); block.track = 1; // TODO this does generate overflows sometimes block.timestamp_off = (index_block.pts - start_block.pts).try_into().unwrap(); - blocks.push(MatroskaTag::SimpleBlock(block.dump())) + if let Some(duration) = duration { + blocks.push(MatroskaTag::BlockGroup(Master::Collected(vec![ + MatroskaTag::BlockDuration(duration), + MatroskaTag::Block(block.dump()), + ]))) + } else { + blocks.push(MatroskaTag::SimpleBlock(block.dump())) + } } output.write_tag(&MatroskaTag::Cluster(Master::Collected(blocks)))?; } |