let mut buf = Vec::new();
std::mem::swap(&mut self.chunks, &mut buf);
let stream = strmgr.get_stream(0).unwrap();
- let (tb_num, tb_den) = stream.get_timebase();
- let ts = NATimeInfo::new(Some(self.cur_frame as u64 - 1), None, None, tb_num, tb_den);
+ let ts = stream.make_ts(Some(self.cur_frame as u64 - 1), None, None);
return Ok(NAPacket::new(stream, ts, false, buf));
}
if self.cur_frame == self.nframes {
let flags = self.src.read_u16le()?;
if (opcode == 8) && (flags == 0x2E) {
if let Some(stream) = strmgr.get_stream(1) {
- let (tb_num, tb_den) = stream.get_timebase();
- let ts = NATimeInfo::new(None, None, None, tb_num, tb_den);
+ let ts = stream.make_ts(None, None, None);
let mut buf = vec![0; size as usize];
write_u16le(&mut buf[0..2], opcode).unwrap();
if size > 0x30 {
self.src.read_skip(0x30)?;
if let Some(stream) = strmgr.get_stream(1) {
- let (tb_num, tb_den) = stream.get_timebase();
-
let audio_size = size - 0x30;
- let ts = NATimeInfo::new(Some(self.asize), None, None, tb_num, tb_den);
+ let ts = stream.make_ts(Some(self.asize), None, None);
let pkt = self.src.read_packet(stream, ts, true, audio_size as usize)?;
self.asize += audio_size;
if (self.src.tell() & 1) == 1 {
let mut buf = Vec::new();
std::mem::swap(&mut self.chunks, &mut buf);
let stream = strmgr.get_stream(0).unwrap();
- let (tb_num, tb_den) = stream.get_timebase();
- let ts = NATimeInfo::new(Some(self.cur_frame as u64 - 1), None, None, tb_num, tb_den);
+ let ts = stream.make_ts(Some(self.cur_frame as u64 - 1), None, None);
return Ok(NAPacket::new(stream, ts, self.keyframe, buf));
}
if self.cur_frame == self.nframes {
}
}
- let (tb_num, tb_den) = stream.get_timebase();
- let mut ts = NATimeInfo::new(None, None, None, tb_num, tb_den);
+ let mut ts = stream.make_ts(None, None, None);
if nsamples != 0 {
ts.pts = Some(self.asize);
self.asize += u64::from(nsamples);
let hdr_size = self.src.read_u32be()?;
validate!(cmp == 0 && size1 == hdr_size);
- let size = (nframes - 1) as usize;
+ let size = nframes - 1;
self.offsets = Vec::with_capacity(size);
self.sizes = Vec::with_capacity(size);
self.samples = Vec::with_capacity(size);
let mut arate = 0;
let mut abits = 0;
let mut chans = 0;
- parse_iact(&mut self.src, data_start, &mut arate, &mut abits, &mut chans, true)?;
+ if let Ok([b'R', b'I', b'F', b'F']) = self.src.peek_tag() {
+ validate!(hdr_size >= 44);
+ self.src.read_skip(22)?;
+ let c = self.src.read_u16le()?;
+ validate!(c == 1 || c == 2);
+ chans = c as u8;
+ arate = self.src.read_u32le()?;
+ validate!(arate > 0);
+ } else {
+ parse_iact(self.src, data_start, &mut arate, &mut abits, &mut chans, true)?;
+ }
if chans == 2 {
for (samp, pts) in self.samples.iter_mut().zip(self.pts.iter_mut()) {
validate!((*samp & 1) == 0);
self.src.read_buf(&mut buf[4..])?;
let stream = strmgr.get_stream(0).unwrap();
- let (tb_num, tb_den) = stream.get_timebase();
- let ts = NATimeInfo::new(Some(self.pts[idx]), None, None, tb_num, tb_den);
+ let ts = stream.make_ts(Some(self.pts[idx]), None, None);
self.cur_frame += 1;
}
}
#[test]
- fn test_mcmp_demux() {
+ fn test_mcmp_demux_imus() {
// sample from Grim Fandango
let mut file = File::open("assets/Game/smush/1104 - Lupe.IMC").unwrap();
let mut fr = FileReader::new_read(&mut file);
println!("Got {}", pkt);
}
}
+ #[test]
+ fn test_mcmp_demux_wav() {
+ // sample from Grim Fandango
+ let mut file = File::open("assets/Game/smush/breadpor.WAV").unwrap();
+ let mut fr = FileReader::new_read(&mut file);
+ let mut br = ByteReader::new(&mut fr);
+ let mut dmx = MCMPDemuxer::new(&mut br);
+ let mut sm = StreamManager::new();
+ let mut si = SeekIndex::new();
+ dmx.open(&mut sm, &mut si).unwrap();
+ loop {
+ let pktres = dmx.get_frame(&mut sm);
+ if let Err(e) = pktres {
+ if (e as i32) == (DemuxerError::EOF as i32) { break; }
+ panic!("error");
+ }
+ let pkt = pktres.unwrap();
+ println!("Got {}", pkt);
+ }
+ }
}