]> git.nihav.org Git - nihav.git/blobdiff - src/demuxers/realmedia.rs
realmedia: break on zero ID chunk
[nihav.git] / src / demuxers / realmedia.rs
index 3d7848480dce8d4ba048cf2cae032abeebcce1d8..f8d5a3e342825511c03056c8235bd59fa628a6e8 100644 (file)
@@ -45,7 +45,7 @@ impl RMVideoStream {
     }
     fn add_slice(&mut self, slice_no: usize, data: &[u8]) {
         self.write_slice_info(slice_no);
-        let mut dslice = &mut self.frame[self.hdr_size + self.frame_pos..][..data.len()];
+        let dslice = &mut self.frame[self.hdr_size + self.frame_pos..][..data.len()];
         dslice.copy_from_slice(data);
         self.frame_pos += data.len();
     }
@@ -68,6 +68,7 @@ impl RMVideoStream {
     }
 }
 
+#[allow(dead_code)]
 #[derive(Clone,Copy,PartialEq)]
 enum Deinterleaver {
     None,
@@ -76,6 +77,7 @@ enum Deinterleaver {
     VBR,
 }
 
+#[allow(dead_code)]
 struct RMAudioStream {
     deint:      Deinterleaver,
 }
@@ -295,6 +297,7 @@ println!(" mode 3");
 
 fn read_chunk(src: &mut ByteReader) -> DemuxerResult<(u32, u32, u16)> {
     let id      = src.read_u32be()?;
+if id == 0 { return Ok((0, 0, 0)); }
     let size    = src.read_u32be()?;
     validate!(size >= 10);
     let ver     = src.read_u16be()?;
@@ -351,7 +354,8 @@ impl<'a> RealMediaDemuxer<'a> {
         }
 
         for _ in 0..num_hdr {
-            self.parse_chunk(strmgr)?;
+            let last = self.parse_chunk(strmgr)?;
+            if last { break; }
         }
 println!("now @ {:X} / {}", self.src.tell(), self.data_pos);
         validate!(self.data_pos > 0);
@@ -362,7 +366,7 @@ println!("now @ {:X} / {}", self.src.tell(), self.data_pos);
         self.cur_packet  = 0;
         Ok(())
     }
-    fn parse_chunk(&mut self, strmgr: &mut StreamManager) -> DemuxerResult<()> {
+    fn parse_chunk(&mut self, strmgr: &mut StreamManager) -> DemuxerResult<bool> {
         let (id, size, ver) = read_chunk(self.src)?;
         let end_pos = self.src.tell() - 10 + (size as u64);
 
@@ -371,13 +375,14 @@ println!("now @ {:X} / {}", self.src.tell(), self.data_pos);
         else if id == mktag!(b"MDPR") { self.parse_mdpr(strmgr)?; }
         else if id == mktag!(b"DATA") { if self.data_pos == 0 { self.data_pos = self.src.tell(); } }
         else if id == mktag!(b"INDX") { /* do nothing for now */ }
+        else if id == 0               { return Ok(true); }
         else                          { println!("unknown chunk type {:08X}", id); }
 
         let cpos = self.src.tell();
         if cpos < end_pos {
             self.src.read_skip((end_pos - cpos) as usize)?;
         }
-        Ok(())
+        Ok(false)
     }
 #[allow(unused_variables)]
     fn parse_content_desc(&mut self) -> DemuxerResult<()> {
@@ -571,9 +576,10 @@ static RM_VIDEO_CODEC_REGISTER: &'static [(&[u8;4], &str)] = &[
     (b"RVTR", "realvideo2"),
     (b"RV30", "realvideo3"),
     (b"RV40", "realvideo4"),
-    (b"CLV1", "clearvideo"),
+    (b"CLV1", "clearvideo_rm"),
 ];
 
+#[allow(dead_code)]
 static RM_AUDIO_CODEC_REGISTER: &'static [(&[u8;4], &str)] = &[
     (b"lpcJ", "ra14.4"),
     (b"28_8", "ra28.8"),