X-Git-Url: https://git.nihav.org/?a=blobdiff_plain;f=nihav-rad%2Fsrc%2Fdemuxers%2Fsmacker.rs;h=5580a871b4ae4b716394455c1581d2a34739484f;hb=ac818eac7671fa8ddfea5aa4fb86fc0b5ab82d2e;hp=741756c12b3418f0c44fe6b0006a3b5987c70274;hpb=d24468d9dbd54f5cbe414649ff061699337fa7fe;p=nihav.git diff --git a/nihav-rad/src/demuxers/smacker.rs b/nihav-rad/src/demuxers/smacker.rs index 741756c..5580a87 100644 --- a/nihav-rad/src/demuxers/smacker.rs +++ b/nihav-rad/src/demuxers/smacker.rs @@ -90,11 +90,12 @@ struct SmackerVideoDemuxer<'a> { fn get_pts_inc(val: i32) -> u64 { if val > 0 { (val as u64) * 100 } - else if val < 0 { (-val as u64) } + else if val < 0 { -val as u64 } else { 1 } } impl<'a> DemuxCore<'a> for SmackerVideoDemuxer<'a> { + #[allow(clippy::unreadable_literal)] fn open(&mut self, strmgr: &mut StreamManager, _seek_idx: &mut SeekIndex) -> DemuxerResult<()> { let src = &mut self.src; let mut magic: [u8; 4] = [0; 4]; @@ -164,6 +165,8 @@ impl<'a> DemuxCore<'a> for SmackerVideoDemuxer<'a> { Ok(()) } + #[allow(clippy::identity_op)] + #[allow(clippy::unreadable_literal)] fn get_frame(&mut self, strmgr: &mut StreamManager) -> DemuxerResult { if !self.queued_packets.is_empty() { let pkt = self.queued_packets.pop().unwrap(); @@ -213,11 +216,14 @@ impl<'a> DemuxCore<'a> for SmackerVideoDemuxer<'a> { let ts = NATimeInfo::new(Some(self.cur_pts), None, None, 1, 100000); for i in 0..NUM_AUDIO_TRACKS { if ((frame_flags >> (i + 1)) & 1) == 0 { continue; } - validate!(self.ainfo[i].is_present()); let size = self.src.read_u32le()? as usize; validate!(size > 4); validate!(payload_size >= size); payload_size -= size; + if !self.ainfo[i].is_present() { + self.src.read_skip(size - 4)?; + continue; + } let strres = strmgr.get_stream(self.ainfo[i].id); validate!(strres.is_some()); let stream = strres.unwrap(); @@ -245,8 +251,13 @@ impl<'a> DemuxCore<'a> for SmackerVideoDemuxer<'a> { Ok(pkt) } - fn seek(&mut self, time: u64, _seek_idx: &SeekIndex) -> DemuxerResult<()> { - if time == 0 { + fn seek(&mut self, time: NATimePoint, _seek_idx: &SeekIndex) -> DemuxerResult<()> { + let seek_to_start = match time { + NATimePoint::Milliseconds(0) => true, + NATimePoint::PTS(0) => true, + _ => false, + }; + if seek_to_start { let start = self.start; self.src.seek(SeekFrom::Start(start))?; self.cur_frame = 0; @@ -258,6 +269,12 @@ impl<'a> DemuxCore<'a> for SmackerVideoDemuxer<'a> { } } +impl<'a> NAOptionHandler for SmackerVideoDemuxer<'a> { + fn get_supported_options(&self) -> &[NAOptionDefinition] { &[] } + fn set_options(&mut self, _options: &[NAOption]) { } + fn query_option_value(&self, _name: &str) -> Option { None } +} + impl<'a> SmackerVideoDemuxer<'a> { fn new(io: &'a mut ByteReader<'a>) -> Self { SmackerVideoDemuxer {