X-Git-Url: https://git.nihav.org/?a=blobdiff_plain;f=nihav-realmedia%2Fsrc%2Fdemuxers%2Frealmedia.rs;h=30b0ccd8a295c10223960ce8b7264b0ac68e36da;hb=6011e20199143f519881660144a4ca95ba77fd2d;hp=22d964e7588d53659916cb3aea90632a75d16143;hpb=5641dccfbf2a70d589cf094a0d4ed5a10f919f00;p=nihav.git diff --git a/nihav-realmedia/src/demuxers/realmedia.rs b/nihav-realmedia/src/demuxers/realmedia.rs index 22d964e..30b0ccd 100644 --- a/nihav-realmedia/src/demuxers/realmedia.rs +++ b/nihav-realmedia/src/demuxers/realmedia.rs @@ -1,8 +1,5 @@ use super::*; use nihav_core::demuxers::DemuxerError::*; -use nihav_core::io::byteio::*; -use nihav_core::frame::*; -use nihav_core::formats::*; use std::io::SeekFrom; use std::mem; use std::fmt; @@ -139,7 +136,7 @@ impl RMAudioStream { } RMAudioStream { deint: deint, iinfo: iinfo, buf: buf, sub_packet: 0 } } - fn read_apackets(&mut self, queued_packets: &mut Vec, src: &mut ByteReader, stream: Rc, ts: u32, keyframe: bool, payload_size: usize) -> DemuxerResult { + fn read_apackets(&mut self, queued_packets: &mut Vec, src: &mut ByteReader, stream: NAStreamRef, ts: u32, keyframe: bool, payload_size: usize) -> DemuxerResult { let (tb_num, tb_den) = stream.get_timebase(); let ts = NATimeInfo::new(Some(ts as u64), None, None, tb_num, tb_den); @@ -382,7 +379,7 @@ fn read_14or30(src: &mut ByteReader) -> DemuxerResult<(bool, u32)> { } } -fn read_video_buf(src: &mut ByteReader, stream: Rc, ts: u32, keyframe: bool, frame_size: usize) -> DemuxerResult { +fn read_video_buf(src: &mut ByteReader, stream: NAStreamRef, ts: u32, keyframe: bool, frame_size: usize) -> DemuxerResult { let size = (frame_size as usize) + 9; let mut vec: Vec = Vec::with_capacity(size); vec.resize(size, 0); @@ -395,7 +392,7 @@ fn read_video_buf(src: &mut ByteReader, stream: Rc, ts: u32, keyframe: Ok(NAPacket::new(stream, ts, keyframe, vec)) } -fn read_multiple_frame(src: &mut ByteReader, stream: Rc, keyframe: bool, skip_mtype: bool) -> DemuxerResult { +fn read_multiple_frame(src: &mut ByteReader, stream: NAStreamRef, keyframe: bool, skip_mtype: bool) -> DemuxerResult { if !skip_mtype { let mtype = src.read_byte()?; validate!(mtype == 0xC0); @@ -557,7 +554,7 @@ println!(" got ainfo {:?}", ainfo); Ok(()) } #[allow(unused_variables)] - fn parse_packet_payload(src: &mut ByteReader, rmstream: &mut RMStreamType, stream: Rc, slice_buf: &mut Vec, queued_pkts: &mut Vec, keyframe: bool, ts: u32, payload_size: usize) -> DemuxerResult { + fn parse_packet_payload(src: &mut ByteReader, rmstream: &mut RMStreamType, stream: NAStreamRef, slice_buf: &mut Vec, queued_pkts: &mut Vec, keyframe: bool, ts: u32, payload_size: usize) -> DemuxerResult { match rmstream { RMStreamType::Video(ref mut vstr) => { @@ -1242,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 => { @@ -1407,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)?; @@ -1485,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' => { @@ -1570,7 +1571,7 @@ static RM_AUDIO_CODEC_REGISTER: &'static [(&[u8;4], &str)] = &[ pub struct RealMediaDemuxerCreator { } impl DemuxerCreator for RealMediaDemuxerCreator { - fn new_demuxer<'a>(&self, br: &'a mut ByteReader<'a>) -> Box + 'a> { + fn new_demuxer<'a>(&self, br: &'a mut ByteReader<'a>) -> Box + 'a> { Box::new(RealMediaDemuxer::new(br)) } fn get_name(&self) -> &'static str { "realmedia" } @@ -1579,7 +1580,7 @@ impl DemuxerCreator for RealMediaDemuxerCreator { pub struct RealAudioDemuxerCreator { } impl DemuxerCreator for RealAudioDemuxerCreator { - fn new_demuxer<'a>(&self, br: &'a mut ByteReader<'a>) -> Box + 'a> { + fn new_demuxer<'a>(&self, br: &'a mut ByteReader<'a>) -> Box + 'a> { Box::new(RealAudioDemuxer::new(br)) } fn get_name(&self) -> &'static str { "realaudio" } @@ -1588,7 +1589,7 @@ impl DemuxerCreator for RealAudioDemuxerCreator { pub struct RealIVRDemuxerCreator { } impl DemuxerCreator for RealIVRDemuxerCreator { - fn new_demuxer<'a>(&self, br: &'a mut ByteReader<'a>) -> Box + 'a> { + fn new_demuxer<'a>(&self, br: &'a mut ByteReader<'a>) -> Box + 'a> { Box::new(RealIVRDemuxer::new(br)) } fn get_name(&self) -> &'static str { "real_ivr" }