]> git.nihav.org Git - nihav.git/blobdiff - src/demuxers/realmedia.rs
realmedia: output completed frame in mode 0
[nihav.git] / src / demuxers / realmedia.rs
index 042b9032c4d4c605ea05c7af883aa75625dc8800..28e20dc9767ac55b1f512dd6426f5e541a42d9b6 100644 (file)
@@ -230,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()?;
@@ -297,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()?;
@@ -353,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);
@@ -364,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);
 
@@ -373,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<()> {
@@ -573,7 +583,7 @@ 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)]