X-Git-Url: https://git.nihav.org/?a=blobdiff_plain;f=nihav-realmedia%2Fsrc%2Fdemuxers%2Frealmedia.rs;h=6335c6d9b426730ef7c84d6e20621ad3b5c0faad;hb=e614e5e611a4ae6769a0da7cbccec5842b3dbd0f;hp=45c117a9b60e36db14c502718946e6d5b39f01b8;hpb=38df3d11b3686cbd6982cc073a7c55c6c1043461;p=nihav.git diff --git a/nihav-realmedia/src/demuxers/realmedia.rs b/nihav-realmedia/src/demuxers/realmedia.rs index 45c117a..6335c6d 100644 --- a/nihav-realmedia/src/demuxers/realmedia.rs +++ b/nihav-realmedia/src/demuxers/realmedia.rs @@ -510,7 +510,11 @@ println!("unknown MLTI substream {:08X} / {:08X}", tag, tag2); }; let cname = find_codec_name(RM_AUDIO_CODEC_REGISTER, ainfo.fcc); let blk_size = if ainfo.fcc != mktag!(b"sipr") { - ainfo.granularity as usize + if let Some(ref iinfo) = ainfo.ileave_info { + iinfo.block_size as usize + } else { + ainfo.granularity as usize + } } else { validate!(ainfo.flavor <= 3); RM_SIPRO_BLOCK_SIZES[ainfo.flavor as usize] @@ -846,10 +850,15 @@ fn parse_aformat3(src: &mut ByteReader) -> DemuxerResult { skip_ra_metadata(src)?; - let _can_copy = src.read_byte()?; - let fcc_len = src.read_byte()?; - validate!(fcc_len == 4); - let fcc = src.read_u32be()?; + // the original RealAudio has no such fields + let fcc = if src.tell() != start + u64::from(header_len) + 2 { + let _can_copy = src.read_byte()?; + let fcc_len = src.read_byte()?; + validate!(fcc_len == 0 || fcc_len == 4); + src.read_u32be()? + } else { + read_u32be(b"lpcJ")? + }; let end = src.tell(); validate!(end - start <= (header_len as u64) + 2); @@ -1242,7 +1251,8 @@ impl<'a> DemuxCore<'a> for RealAudioDemuxer<'a> { fn get_frame(&mut self, strmgr: &mut StreamManager) -> DemuxerResult { if !self.queued_pkts.is_empty() { - let pkt = self.queued_pkts.pop().unwrap(); + let mut pkt = self.queued_pkts.pop().unwrap(); + pkt.ts.pts = None; return Ok(pkt); } if (self.data_end != 0) && (self.src.tell() >= self.data_end) { @@ -1252,10 +1262,13 @@ impl<'a> DemuxCore<'a> for RealAudioDemuxer<'a> { let stream = streamres.unwrap(); if let Some(ref mut astr) = self.stream { loop { - let ret = astr.read_apackets(&mut self.queued_pkts, self.src, stream.clone(), 0, false, self.blk_size); + let mut ret = astr.read_apackets(&mut self.queued_pkts, self.src, stream.clone(), 0, false, self.blk_size); if let Err(DemuxerError::TryAgain) = ret { continue; } + if let Ok(ref mut pkt) = ret { + pkt.ts.pts = None; + } return ret; } }