]> git.nihav.org Git - nihav.git/blobdiff - src/demuxers/realmedia.rs
io: fix Elias gamma code reading
[nihav.git] / src / demuxers / realmedia.rs
index d50f6b2ee006f5b06142e070f01fe89dc3c956ff..28e20dc9767ac55b1f512dd6426f5e541a42d9b6 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,
 }
@@ -228,7 +230,14 @@ println!(" mode 0 pkt {}/{} off {}/{} seq {}", packet_num, num_pkts, off, frame_
                                     } else {
                                         vstr.add_slice(packet_num as usize, self.slice_buf.as_slice()); 
                                     }
-                                    continue;
+                                    if (packet_num as usize) < num_pkts {
+                                        continue;
+                                    }
+                                    //todo: check if full frame is received
+                                    let (tb_num, tb_den) = stream.get_timebase();
+                                    let ts = NATimeInfo::new(Some(ts as u64), None, None, tb_num, tb_den);
+                                    let pkt = NAPacket::new(stream, ts, keyframe, vstr.get_frame_data());
+                                    Ok(pkt)
                                 },
                             1 => { // whole frame
                                     let seq_no = self.src.read_byte()?;
@@ -295,6 +304,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 +361,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 +373,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 +382,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 +583,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"),
@@ -629,6 +642,6 @@ mod test {
             let pkt = pktres.unwrap();
             println!("Got {}", pkt);
         }
-panic!("the end");
+//panic!("the end");
     }
 }