});
}
+trait ReadSize {
+ fn read_size(&mut self, ver: u16) -> ByteIOResult<u64>;
+}
+
+impl<'a> ReadSize for ByteReader<'a> {
+ fn read_size(&mut self, ver: u16) -> ByteIOResult<u64> {
+ match ver {
+ 0 => Ok(u64::from(self.read_u32be()?)),
+ 2 => self.read_u64be(),
+ _ => unreachable!(),
+ }
+ }
+}
+
const RM_SIPRO_BLOCK_SIZES: [usize; 4] = [ 29, 19, 37, 20 ];
const RM_SIPRO_SWAPS: [[u8; 2]; 38] = [
[ 0, 63 ], [ 1, 22 ], [ 2, 44 ], [ 3, 90 ],
let bsize = iinfo.block_size as usize;
let ppos = self.sub_packet;
for sb in 0..halffact {
- let mut dst = &mut self.buf[sb * 2 * fsize + ppos * bsize..][..bsize];
- src.read_buf(&mut dst)?;
+ let dst = &mut self.buf[sb * 2 * fsize + ppos * bsize..][..bsize];
+ src.read_buf(dst)?;
}
self.sub_packet += 1;
if self.sub_packet == factor {
for sb in 0..factor2 {
let sb_pos = factor * sb + ((factor + 1) >> 1) * (ppos & 1) + (ppos >> 1);
- let mut dst = &mut self.buf[bsize * sb_pos..][..bsize];
- src.read_buf(&mut dst)?;
+ let dst = &mut self.buf[bsize * sb_pos..][..bsize];
+ src.read_buf(dst)?;
}
},
Deinterleaver::Sipro => {
let fsize = iinfo.frame_size as usize;
let ppos = self.sub_packet;
- let mut dst = &mut self.buf[fsize * ppos..][..fsize];
- src.read_buf(&mut dst)?;
+ let dst = &mut self.buf[fsize * ppos..][..fsize];
+ src.read_buf(dst)?;
},
Deinterleaver::VBR => {
validate!(payload_size >= 5);
//todo skip unwanted packet
let keyframe = (flags & KEYFRAME_FLAG) != 0;
- let ret = RMDemuxCommon::parse_packet_payload(&mut self.src, &mut self.str_data.streams[str_id], stream, &mut self.slice_buf, &mut self.queued_pkts, keyframe, ts, payload_size);
+ let ret = RMDemuxCommon::parse_packet_payload(self.src, &mut self.str_data.streams[str_id], stream, &mut self.slice_buf, &mut self.queued_pkts, keyframe, ts, payload_size);
if let Err(DemuxerError::TryAgain) = ret {
continue;
} else {
}
#[derive(Clone,Copy,Debug)]
+#[allow(dead_code)]
struct RealAudioInfo {
fcc: u32,
sample_rate: u32,
let num_pkt = self.src.read_u32be()? as usize;
let duration = self.src.read_u32be()?;
let preroll = self.src.read_u32be()?;
- if ver == 2 {
- self.src.read_skip(4)?;
- }
- let idx_off = self.src.read_u32be()?;
+ let idx_off = self.src.read_size(ver)?;
let data_off = self.src.read_u32be()?;
let num_streams = self.src.read_u16be()? as usize;
let flags = self.src.read_u16be()?;
if ver != 0 && ver != 2 { return Ok(()); }
let num_entries = self.src.read_u32be()? as usize;
let str_id = self.src.read_u16be()? as u32;
- let _next_idx = self.src.read_u32be()?;
- if ver == 2 {
- self.src.read_u32be()?;
- }
+ let _next_idx = self.src.read_size(ver)?;
if ver == 0 {
validate!(chunk_size == num_entries * 14 + 10);
} else {
let iver = self.src.read_u16be()?;
validate!(iver == ver);
let ts = self.src.read_u32be()? as u64;
- if ver == 2 {
- self.src.read_u32be()?;
- }
- let pos = self.src.read_u32be()? as u64;
+ let pos = self.src.read_size(ver)?;
let _pkt_no = self.src.read_u32be()?;
idx.add_entry(SeekEntry { time: ts, pts: 0, pos });
}
let ver = self.src.read_u16be()?;
let ainfo = match ver {
3 => {
- parse_aformat3(&mut self.src)?
+ parse_aformat3(self.src)?
},
4 => {
- parse_aformat4(&mut self.src)?
+ parse_aformat4(self.src)?
},
5 => {
- parse_aformat5(&mut self.src)?
+ parse_aformat5(self.src)?
},
_ => {
println!("unknown version {}", ver);
let stream = streamres.unwrap();
if let Some(ref mut astr) = self.stream {
loop {
- let ret = astr.read_apackets(&mut self.queued_pkts, &mut self.src, stream.clone(), 0, false, self.blk_size);
+ let ret = astr.read_apackets(&mut self.queued_pkts, self.src, stream.clone(), 0, false, self.blk_size);
if let Err(DemuxerError::TryAgain) = ret {
continue;
}
}
}
fn is_data_start(&self) -> bool {
- match *self {
- IVRRecord::DataStart => true,
- _ => false,
- }
+ matches!(*self, IVRRecord::DataStart)
}
}
let magic = self.src.peek_u32be()?;
if magic == mktag!(b".REC") {
let mut rec = RecordDemuxer::new(0, 0);
- rec.parse_header(&mut self.src, strmgr, &mut self.str_data)?;
+ rec.parse_header(self.src, strmgr, &mut self.str_data)?;
self.recs.push(rec);
} else if magic == mktag!(b".R1M") {
println!("R1M kind");
self.src.read_skip(4)?; // magic
self.src.read_skip(3)?; // always 0, 1, 1 ?
- let _name = IVRRecord::read_string(&mut self.src)?;
+ let _name = IVRRecord::read_string(self.src)?;
self.src.read_skip(1)?; // always 0?
let len1 = self.src.read_u32be()? as u64;
let off1 = self.src.read_u64be()?;
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)?;
+ rec.parse_header(self.src, strmgr, &mut self.str_data)?;
self.recs.push(rec);
}
self.src.seek(SeekFrom::Start(pos + len))?;
}
loop {
if self.cur_rec >= self.recs.len() { return Err(DemuxerError::EOF); }
- let res = self.recs[self.cur_rec].get_packet(&mut self.src, &mut self.str_data, strmgr, &mut self.queued_pkts, &mut self.slice_buf);
+ let res = self.recs[self.cur_rec].get_packet(self.src, &mut self.str_data, strmgr, &mut self.queued_pkts, &mut self.slice_buf);
if let Err(DemuxerError::EOF) = res {
self.cur_rec += 1;
} else {