X-Git-Url: https://git.nihav.org/?a=blobdiff_plain;f=src%2Fdemuxers%2Frealmedia.rs;h=28e20dc9767ac55b1f512dd6426f5e541a42d9b6;hb=8a5cb596b2717eb85c0601867f713c3df9bb3383;hp=3d7848480dce8d4ba048cf2cae032abeebcce1d8;hpb=41f11b2b4b169172bed76027a4b2ca91185cf7ba;p=nihav.git diff --git a/src/demuxers/realmedia.rs b/src/demuxers/realmedia.rs index 3d78484..28e20dc 100644 --- a/src/demuxers/realmedia.rs +++ b/src/demuxers/realmedia.rs @@ -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 { 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"),