aboutsummaryrefslogtreecommitdiff
path: root/remuxer/src/extract.rs
diff options
context:
space:
mode:
Diffstat (limited to 'remuxer/src/extract.rs')
-rw-r--r--remuxer/src/extract.rs24
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!(".")
}