X-Git-Url: https://git.nihav.org/?p=nihav.git;a=blobdiff_plain;f=nihav-rad%2Fsrc%2Fdemuxers%2Fsmacker.rs;h=340af85989617c928cc968dce3b09498d2da7315;hp=b666cf1f7eac2ae440924f3414e76a3d584e751e;hb=a480a0de101483d802a11e72d758dae00fa4860a;hpb=606c448ef167017c3171b49f9eb2af82c15079ce diff --git a/nihav-rad/src/demuxers/smacker.rs b/nihav-rad/src/demuxers/smacker.rs index b666cf1..340af85 100644 --- a/nihav-rad/src/demuxers/smacker.rs +++ b/nihav-rad/src/demuxers/smacker.rs @@ -56,7 +56,7 @@ impl AudioTrack { let soniton = if (self.flags & SMK_AUD_FLAG_16BIT) != 0 { SND_S16_FORMAT } else { SND_U8_FORMAT }; let ahdr = NAAudioInfo::new(self.srate, channels, soniton, 1); let ainfo = NACodecInfo::new(codecname, NACodecTypeInfo::Audio(ahdr), None); - let res = strmgr.add_stream(NAStream::new(StreamType::Audio, (str_id + 1) as u32, ainfo, 1, self.srate)); + let res = strmgr.add_stream(NAStream::new(StreamType::Audio, (str_id + 1) as u32, ainfo, 1, self.srate, 0)); validate!(res.is_some()); self.id = res.unwrap(); @@ -90,12 +90,13 @@ 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> { - fn open(&mut self, strmgr: &mut StreamManager) -> DemuxerResult<()> { + #[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]; src.read_buf(&mut magic)?; @@ -148,7 +149,7 @@ impl<'a> DemuxCore<'a> for SmackerVideoDemuxer<'a> { let vhdr = NAVideoInfo::new(width, height, false, PAL8_FORMAT); let vinfo = NACodecInfo::new("smacker-video", NACodecTypeInfo::Video(vhdr), Some(treedata)); - let res = strmgr.add_stream(NAStream::new(StreamType::Video, 0, vinfo, 1, 100000)); + let res = strmgr.add_stream(NAStream::new(StreamType::Video, 0, vinfo, 1, 100000, 0)); validate!(res.is_some()); self.video_id = res.unwrap(); @@ -161,9 +162,11 @@ impl<'a> DemuxCore<'a> for SmackerVideoDemuxer<'a> { self.start = src.tell(); self.cur_frame = 0; self.reset_state(); - + 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(); @@ -178,7 +181,7 @@ impl<'a> DemuxCore<'a> for SmackerVideoDemuxer<'a> { validate!(chunk_size > 0); validate!(payload_size >= chunk_size); payload_size -= chunk_size; - let oldpal = self.pal.clone(); + let oldpal = self.pal; let mut idx = 0; let endpos = self.src.tell() + (chunk_size as u64) - 1; while idx < 256 { @@ -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,9 +251,13 @@ impl<'a> DemuxCore<'a> for SmackerVideoDemuxer<'a> { Ok(pkt) } - #[allow(unused_variables)] - fn seek(&mut self, time: u64) -> 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; @@ -257,6 +267,13 @@ impl<'a> DemuxCore<'a> for SmackerVideoDemuxer<'a> { } Err(DemuxerError::NotImplemented) } + fn get_duration(&self) -> u64 { self.frames as u64 * self.pts_inc / 100 } +} + +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> { @@ -284,7 +301,7 @@ impl<'a> SmackerVideoDemuxer<'a> { pub struct SMKDemuxerCreator { } impl DemuxerCreator for SMKDemuxerCreator { - fn new_demuxer<'a>(&self, br: &'a mut ByteReader<'a>) -> Box + 'a> { + fn new_demuxer<'a>(&self, br: &'a mut ByteReader<'a>) -> Box + 'a> { Box::new(SmackerVideoDemuxer::new(br)) } fn get_name(&self) -> &'static str { "smacker" } @@ -305,7 +322,8 @@ mod test { let mut br = ByteReader::new(&mut fr); let mut dmx = SmackerVideoDemuxer::new(&mut br); let mut sm = StreamManager::new(); - dmx.open(&mut sm).unwrap(); + let mut si = SeekIndex::new(); + dmx.open(&mut sm, &mut si).unwrap(); loop { let pktres = dmx.get_frame(&mut sm); if let Err(e) = pktres {