X-Git-Url: https://git.nihav.org/?a=blobdiff_plain;f=nihav-commonfmt%2Fsrc%2Fdemuxers%2Fwav.rs;h=fb522cd1b82ca0daa94c6a777a49a05e211022a4;hb=b4bf2c3f1a94b2b4ebbfc704e17fbaf366f8fa8b;hp=bf30686436273f61ebc35d2d9a8903dce17e5b7c;hpb=787b8d03074419d7f8e6b52daba02a3807444bc2;p=nihav.git diff --git a/nihav-commonfmt/src/demuxers/wav.rs b/nihav-commonfmt/src/demuxers/wav.rs index bf30686..fb522cd 100644 --- a/nihav-commonfmt/src/demuxers/wav.rs +++ b/nihav-commonfmt/src/demuxers/wav.rs @@ -4,10 +4,10 @@ use nihav_core::demuxers::DemuxerError::*; macro_rules! mktag { ($a:expr, $b:expr, $c:expr, $d:expr) => { - (($a as u32) << 24) | (($b as u32) << 16) | (($c as u32) << 8) | ($d as u32) + (u32::from($a) << 24) | (u32::from($b) << 16) | (u32::from($c) << 8) | u32::from($d) }; ($arr:expr) => { - (($arr[0] as u32) << 24) | (($arr[1] as u32) << 16) | (($arr[2] as u32) << 8) | ($arr[3] as u32) + (u32::from($arr[0]) << 24) | (u32::from($arr[1]) << 16) | (u32::from($arr[2]) << 8) | u32::from($arr[3]) }; } @@ -25,7 +25,7 @@ impl<'a> DemuxCore<'a> for WAVDemuxer<'a> { fn open(&mut self, strmgr: &mut StreamManager, seek_index: &mut SeekIndex) -> DemuxerResult<()> { let riff = self.src.read_u32be()?; let riff_size = self.src.read_u32le()? as usize; - let riff_end = self.src.tell() + if riff_size > 0 { (riff_size as u64) } else { u64::from(std::u32::MAX) }; + let riff_end = self.src.tell() + if riff_size > 0 { riff_size as u64 } else { u64::from(std::u32::MAX) }; let wave = self.src.read_u32be()?; validate!(riff == mktag!(b"RIFF")); validate!(wave == mktag!(b"WAVE")); @@ -68,7 +68,13 @@ impl<'a> DemuxCore<'a> for WAVDemuxer<'a> { let str = strmgr.get_stream(0); if str.is_none() { return Err(InvalidData); } let stream = str.unwrap(); - let ts = NATimeInfo::new(None, None, None, 1, self.srate); + let pts = if self.avg_bytes != 0 { + let pos = self.src.tell() - self.data_pos; + Some(pos * u64::from(self.srate) / u64::from(self.avg_bytes)) + } else { + None + }; + let ts = NATimeInfo::new(pts, None, None, 1, self.srate); if self.is_pcm { let mut bsize = self.block_size; while bsize < 256 { @@ -83,10 +89,16 @@ impl<'a> DemuxCore<'a> for WAVDemuxer<'a> { } } - fn seek(&mut self, time: u64, _seek_index: &SeekIndex) -> DemuxerResult<()> { + fn seek(&mut self, time: NATimePoint, _seek_index: &SeekIndex) -> DemuxerResult<()> { if self.block_size != 0 && self.avg_bytes != 0 { - let seek_dst = u64::from(self.avg_bytes) * time / 1000; - let seek_off = seek_dst / (self.block_size as u64) * (self.block_size as u64); + let seek_off = match time { + NATimePoint::Milliseconds(ms) => { + let seek_dst = u64::from(self.avg_bytes) * ms / 1000; + seek_dst / (self.block_size as u64) * (self.block_size as u64) + }, + NATimePoint::PTS(pts) => (self.block_size as u64) * pts, + NATimePoint::None => return Ok(()), + }; self.src.seek(SeekFrom::Start(self.data_pos + seek_off))?; Ok(()) } else { @@ -127,16 +139,15 @@ impl<'a> WAVDemuxer<'a> { let bits_per_sample = if csize >= 16 { self.src.read_u16le()? } else { 8 }; validate!(channels < 256); - let edata; - if csize > 16 { - validate!(csize >= 18); - let cb_size = self.src.read_u16le()? as usize; - let mut buf = vec![0; cb_size]; + let edata = if csize > 16 { + validate!(csize >= 18); + let cb_size = self.src.read_u16le()? as usize; + let mut buf = vec![0; cb_size]; self.src.read_buf(buf.as_mut_slice())?; - edata = Some(buf); - } else { - edata = None; - } + Some(buf) + } else { + None + }; let cname = register::find_codec_from_wav_twocc(format_tag).unwrap_or("unknown"); let soniton = if cname == "pcm" {