diff options
Diffstat (limited to 'remuxer/src/demuxers/matroska.rs')
-rw-r--r-- | remuxer/src/demuxers/matroska.rs | 15 |
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)?; |