switch NAStream reference to Arc
[nihav.git] / nihav-realmedia / src / demuxers / realmedia.rs
index e0e41e07fb43c4c045762f7f71d606d7a457e689..f3f73b9521f31ff6c74eba4290016ead7f7bd10b 100644 (file)
@@ -136,7 +136,7 @@ impl RMAudioStream {
         }
         RMAudioStream { deint: deint, iinfo: iinfo, buf: buf, sub_packet: 0 }
     }
-    fn read_apackets(&mut self, queued_packets: &mut Vec<NAPacket>, src: &mut ByteReader, stream: Rc<NAStream>, ts: u32, keyframe: bool, payload_size: usize) -> DemuxerResult<NAPacket> {
+    fn read_apackets(&mut self, queued_packets: &mut Vec<NAPacket>, src: &mut ByteReader, stream: NAStreamRef, ts: u32, keyframe: bool, payload_size: usize) -> DemuxerResult<NAPacket> {
         let (tb_num, tb_den) = stream.get_timebase();
         let ts = NATimeInfo::new(Some(ts as u64), None, None, tb_num, tb_den);
 
@@ -379,7 +379,7 @@ fn read_14or30(src: &mut ByteReader) -> DemuxerResult<(bool, u32)> {
     }
 }
 
-fn read_video_buf(src: &mut ByteReader, stream: Rc<NAStream>, ts: u32, keyframe: bool, frame_size: usize) -> DemuxerResult<NAPacket> {
+fn read_video_buf(src: &mut ByteReader, stream: NAStreamRef, ts: u32, keyframe: bool, frame_size: usize) -> DemuxerResult<NAPacket> {
     let size = (frame_size as usize) + 9;
     let mut vec: Vec<u8> = Vec::with_capacity(size);
     vec.resize(size, 0);
@@ -392,7 +392,7 @@ fn read_video_buf(src: &mut ByteReader, stream: Rc<NAStream>, ts: u32, keyframe:
     Ok(NAPacket::new(stream, ts, keyframe, vec))
 }
 
-fn read_multiple_frame(src: &mut ByteReader, stream: Rc<NAStream>, keyframe: bool, skip_mtype: bool) -> DemuxerResult<NAPacket> {
+fn read_multiple_frame(src: &mut ByteReader, stream: NAStreamRef, keyframe: bool, skip_mtype: bool) -> DemuxerResult<NAPacket> {
     if !skip_mtype {
         let mtype       = src.read_byte()?;
         validate!(mtype == 0xC0);
@@ -554,7 +554,7 @@ println!(" got ainfo {:?}", ainfo);
         Ok(())
     }
 #[allow(unused_variables)]
-    fn parse_packet_payload(src: &mut ByteReader, rmstream: &mut RMStreamType, stream: Rc<NAStream>, slice_buf: &mut Vec<u8>, queued_pkts: &mut Vec<NAPacket>, keyframe: bool, ts: u32, payload_size: usize) -> DemuxerResult<NAPacket> {
+    fn parse_packet_payload(src: &mut ByteReader, rmstream: &mut RMStreamType, stream: NAStreamRef, slice_buf: &mut Vec<u8>, queued_pkts: &mut Vec<NAPacket>, keyframe: bool, ts: u32, payload_size: usize) -> DemuxerResult<NAPacket> {
         match rmstream {
             RMStreamType::Video(ref mut vstr) => {
 
@@ -1239,6 +1239,7 @@ impl IVRRecord {
                     let flags   = src.read_u32be()?;
                     let len     = src.read_u32be()? as usize;
                     let chk     = src.read_u32be()?;
+                    validate!((len > 0) && (len < (1 << 24)));
                     Ok(IVRRecord::Packet { ts, str, flags, len, checksum: chk })
                 },
             3 => {
@@ -1404,12 +1405,13 @@ impl RecordDemuxer {
         loop {
             let rec = IVRRecord::read(src)?;
             match rec {
-                IVRRecord::Packet { ts, str, flags: _, len, checksum: _ } => {
+                IVRRecord::Packet { ts, str, flags, len, checksum: _ } => {
                         let payload_size = len;
                         let sr = self.remap_ids.iter().position(|x| *x == str);
                         validate!(sr.is_some());
                         let str_no = self.start_str + (sr.unwrap() as u32);
-                        let stream_id = str_data.get_stream_id(str_no as u32, 0/*pkt_grp*/);
+                        let pkt_grp = ((flags >> 8) & 0xFF) as u16;
+                        let stream_id = str_data.get_stream_id(str_no as u32, pkt_grp);
                         let sr = str_data.find_stream(stream_id);
                         if sr.is_none() {
                             src.read_skip(payload_size)?;
@@ -1482,10 +1484,12 @@ println!("R1M kind");
                     2 => {
                             let len = self.src.read_u32be()? as u64;
                             let pos = self.src.tell();
-                            let num_streams = self.str_data.streams.len() as u32;
-                            let mut rec = RecordDemuxer::new(pos + 12, num_streams);
-                            rec.parse_header(&mut self.src, strmgr, &mut self.str_data)?;
-                            self.recs.push(rec);
+                            if len > 0x20 {
+                                let num_streams = self.str_data.streams.len() as u32;
+                                let mut rec = RecordDemuxer::new(pos + 12, num_streams);
+                                rec.parse_header(&mut self.src, strmgr, &mut self.str_data)?;
+                                self.recs.push(rec);
+                            }
                             self.src.seek(SeekFrom::Start(pos + len))?;
                         },
                     b'R' => {