validate!(hdr[0] == 0x39);
validate!(hdr[1] == 0x68);
let version = hdr[2];
- validate!(version >= 3 && version <= 5);
+ validate!(version >= 3 && version <= 7);
let mut width = read_u16le(&hdr[4..])? as usize;
let mut height = read_u16le(&hdr[6..])? as usize;
if version > 3 {
let mut buf = vec![0; size];
self.src.read_buf(&mut buf)?;
let arate = read_u32le(&buf[24..])?;
- let channels = buf[22];
- let abits = buf[34] as usize;
- validate!(abits == 8 || abits == 16);
- self.bps = (channels as usize) * abits / 8;
- let bsize = read_u16le(&buf[32..])? as usize;
- let ahdr = NAAudioInfo::new(arate, channels as u8, if abits == 16 { SND_S16_FORMAT } else { SND_U8_FORMAT }, bsize);
- let ainfo = NACodecInfo::new("pcm", NACodecTypeInfo::Audio(ahdr), None);
- self.a_id = strmgr.add_stream(NAStream::new(StreamType::Audio, 1, ainfo, 1, arate, 2));
+ if arate > 0 {
+ let channels = buf[22];
+ let abits = buf[34] as usize;
+ validate!(abits == 8 || abits == 16);
+ self.bps = (channels as usize) * abits / 8;
+ let bsize = read_u16le(&buf[32..])? as usize;
+ let ahdr = NAAudioInfo::new(arate, channels, if abits == 16 { SND_S16_FORMAT } else { SND_U8_FORMAT }, bsize);
+ let ainfo = NACodecInfo::new("pcm", NACodecTypeInfo::Audio(ahdr), None);
+ self.a_id = strmgr.add_stream(NAStream::new(StreamType::Audio, 1, ainfo, 1, arate, 2));
+ }
}
}
self.apts = 0;
0xFFFF => return Err(DemuxerError::EOF),
0 => {
if let Some(a_id) = self.a_id {
- let str = strmgr.get_stream(a_id).unwrap();
- let (tb_num, tb_den) = str.get_timebase();
- let ts = NATimeInfo::new(Some(self.apts), None, None, tb_num, tb_den);
+ let stream = strmgr.get_stream(a_id).unwrap();
+ let ts = stream.make_ts(Some(self.apts), None, None);
self.apts += (size / self.bps) as u64;
- return self.src.read_packet(str, ts, true, size);
+ return self.src.read_packet(stream, ts, true, size);
} else {
- return Err(DemuxerError::InvalidData);
+ self.src.read_skip(size)?;
}
},
1 => {
},
2 | 3 | 4 | 11 => {
validate!(self.v_id.is_some());
- let str = strmgr.get_stream(self.v_id.unwrap_or(0)).unwrap();
- let (tb_num, tb_den) = str.get_timebase();
- let ts = NATimeInfo::new(Some(self.vpts), None, None, tb_num, tb_den);
+ let stream = strmgr.get_stream(self.v_id.unwrap_or(0)).unwrap();
+ let ts = stream.make_ts(Some(self.vpts), None, None);
self.vpts += 1;
let cur_len = self.side_data.len();
}
let mut buf = Vec::new();
std::mem::swap(&mut buf, &mut self.side_data);
- return Ok(NAPacket::new(str, ts, self.vpts == 1, buf));
+ return Ok(NAPacket::new(stream, ts, self.vpts == 1, buf));
},
5 => {
validate!(size <= 256);