}
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();
}
}
}
+#[allow(dead_code)]
#[derive(Clone,Copy,PartialEq)]
enum Deinterleaver {
None,
VBR,
}
+#[allow(dead_code)]
struct RMAudioStream {
deint: Deinterleaver,
}
} 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()?;
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()?;
}
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);
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);
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<()> {
(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"),