X-Git-Url: https://git.nihav.org/?a=blobdiff_plain;f=nihav-commonfmt%2Fsrc%2Fdemuxers%2Fwav.rs;h=1a2ead772e6ab85235d2f95b4f9f2f8543b30c85;hb=817e487223b28379176a533f09485c27a68443f8;hp=fb522cd1b82ca0daa94c6a777a49a05e211022a4;hpb=b4bf2c3f1a94b2b4ebbfc704e17fbaf366f8fa8b;p=nihav.git diff --git a/nihav-commonfmt/src/demuxers/wav.rs b/nihav-commonfmt/src/demuxers/wav.rs index fb522cd..1a2ead7 100644 --- a/nihav-commonfmt/src/demuxers/wav.rs +++ b/nihav-commonfmt/src/demuxers/wav.rs @@ -19,6 +19,7 @@ struct WAVDemuxer<'a> { block_size: usize, is_pcm: bool, avg_bytes: u32, + duration: u64, } impl<'a> DemuxCore<'a> for WAVDemuxer<'a> { @@ -33,7 +34,7 @@ impl<'a> DemuxCore<'a> for WAVDemuxer<'a> { seek_index.mode = SeekIndexMode::Automatic; let mut fmt_parsed = false; - let mut _duration = 0; + let mut duration = 0; while self.src.tell() < riff_end { let ctype = self.src.read_tag()?; let csize = self.src.read_u32le()? as usize; @@ -45,12 +46,21 @@ impl<'a> DemuxCore<'a> for WAVDemuxer<'a> { }, b"fact" => { validate!(csize == 4); - _duration = self.src.read_u32le()? as usize; + duration = self.src.read_u32le()? as usize; }, b"data" => { validate!(fmt_parsed); self.data_pos = self.src.tell(); self.data_end = self.data_pos + (csize as u64); + + if duration != 0 { + self.duration = (duration as u64) * 1000 / u64::from(self.srate); + } else if self.avg_bytes > 0 { + self.duration = (self.data_end - self.data_pos) * 1000 / u64::from(self.avg_bytes); + } else { + self.duration = 0; + } + return Ok(()); }, _ => { @@ -65,9 +75,9 @@ impl<'a> DemuxCore<'a> for WAVDemuxer<'a> { if self.src.tell() >= self.data_end { return Err(DemuxerError::EOF); } - let str = strmgr.get_stream(0); - if str.is_none() { return Err(InvalidData); } - let stream = str.unwrap(); + let strm = strmgr.get_stream(0); + if strm.is_none() { return Err(InvalidData); } + let stream = strm.unwrap(); 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)) @@ -105,6 +115,8 @@ impl<'a> DemuxCore<'a> for WAVDemuxer<'a> { Err(DemuxerError::NotImplemented) } } + + fn get_duration(&self) -> u64 { self.duration } } impl<'a> NAOptionHandler for WAVDemuxer<'a> { @@ -123,6 +135,7 @@ impl<'a> WAVDemuxer<'a> { block_size: 0, is_pcm: false, avg_bytes: 0, + duration: 0, } } fn parse_fmt(&mut self, strmgr: &mut StreamManager, csize: usize) -> DemuxerResult<()> { @@ -165,13 +178,16 @@ impl<'a> WAVDemuxer<'a> { }; let ahdr = NAAudioInfo::new(samples_per_sec, channels as u8, soniton, block_align); let ainfo = NACodecInfo::new(cname, NACodecTypeInfo::Audio(ahdr), edata); - let res = strmgr.add_stream(NAStream::new(StreamType::Audio, 0, ainfo, 1, samples_per_sec)); + let res = strmgr.add_stream(NAStream::new(StreamType::Audio, 0, ainfo, 1, samples_per_sec, 0)); if res.is_none() { return Err(MemoryError); } self.srate = samples_per_sec; self.block_size = block_align; self.avg_bytes = avg_bytes_per_sec; self.is_pcm = cname == "pcm"; + if self.is_pcm && self.avg_bytes == 0 { + self.avg_bytes = self.block_size as u32 * self.srate; + } Ok(()) } @@ -193,6 +209,7 @@ mod test { #[test] fn test_wav_demux() { + // sample: https://samples.mplayerhq.hu/A-codecs/msadpcm-stereo/scatter.wav let mut file = File::open("assets/MS/scatter.wav").unwrap(); let mut fr = FileReader::new_read(&mut file); let mut br = ByteReader::new(&mut fr);