realmedia: clear non-existing timestamps in .ra
[nihav.git] / nihav-realmedia / src / demuxers / realmedia.rs
index 45c117a9b60e36db14c502718946e6d5b39f01b8..b2ea95896e1c4372c5f2d96a4e6a6791e0fa7a63 100644 (file)
@@ -846,10 +846,15 @@ fn parse_aformat3(src: &mut ByteReader) -> DemuxerResult<RealAudioInfo> {
 
     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 +1247,8 @@ impl<'a> DemuxCore<'a> for RealAudioDemuxer<'a> {
 
     fn get_frame(&mut self, strmgr: &mut StreamManager) -> DemuxerResult<NAPacket> {
         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 +1258,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;
             }
         }