aboutsummaryrefslogtreecommitdiff
path: root/remuxer/src/demuxers/matroska.rs
diff options
context:
space:
mode:
Diffstat (limited to 'remuxer/src/demuxers/matroska.rs')
-rw-r--r--remuxer/src/demuxers/matroska.rs15
1 files changed, 11 insertions, 4 deletions
diff --git a/remuxer/src/demuxers/matroska.rs b/remuxer/src/demuxers/matroska.rs
index 6301f15..b70054d 100644
--- a/remuxer/src/demuxers/matroska.rs
+++ b/remuxer/src/demuxers/matroska.rs
@@ -7,7 +7,7 @@
use crate::demuxers::{Demuxer, DemuxerNew, ReadSeek};
use anyhow::{Context, Result, anyhow, bail};
use log::debug;
-use std::io::{BufReader, Read, Seek, SeekFrom};
+use std::io::{BufReader, ErrorKind, Read, Seek, SeekFrom};
use winter_ebml::{Ebml, EbmlHeader, VintReadExt, read_vint_slice};
use winter_matroska::{
Attachments, Chapters, Cluster, Cues, Info, MatroskaFile, SeekHead, Segment, Tags, Tracks,
@@ -47,6 +47,7 @@ impl MatroskaDemuxer {
if !matches!(header.doc_type.as_str(), "matroska" | "webm") {
bail!("file is {:?} but not matroska/webm", header.doc_type)
}
+ eprintln!("{header:?}");
if header.ebml_max_id_length != 4 {
bail!(
"file has invalid EBMLMaxIDLength of {}",
@@ -156,8 +157,10 @@ impl MatroskaDemuxer {
}
}
impl Demuxer for MatroskaDemuxer {
- fn info(&mut self) -> Result<Option<Info>> {
- self.read_segment_tag("Info", Segment::TAG_INFO)
+ fn info(&mut self) -> Result<Info> {
+ Ok(self
+ .read_segment_tag("Info", Segment::TAG_INFO)?
+ .ok_or(anyhow!("info missing"))?)
}
fn tracks(&mut self) -> Result<Option<Tracks>> {
self.read_segment_tag("Tracks", Segment::TAG_TRACKS)
@@ -187,7 +190,11 @@ impl Demuxer for MatroskaDemuxer {
loop {
let position = self.reader.stream_position()?;
// TODO handle eof
- let tag = self.reader.read_vint()?;
+ let tag = match self.reader.read_vint() {
+ Ok(val) => val,
+ Err(e) if e.kind() == ErrorKind::UnexpectedEof => return Ok(None),
+ Err(e) => return Err(e.into()),
+ };
let size = self.reader.read_vint()?;
if tag != Segment::TAG_CLUSTERS {
self.reader.seek_relative(size as i64)?;