normal_blocks: u32,
last_blocks: u32,
truncated: bool,
+ duration: u64,
}
impl<'a> APEDemuxer<'a> {
normal_blocks: 0,
last_blocks: 0,
truncated: false,
+ duration: 0,
}
}
}
let tag = src.read_tag()?;
validate!(&tag == b"MAC ");
let version = src.read_u16le()?;
- validate!(version >= 3800 && version <= 3990);
+ validate!((3800..=3990).contains(&version));
let seektab_len;
let _wavtail_len;
self.frames = Vec::with_capacity(nframes);
self.normal_blocks = blocksperframe;
self.last_blocks = finalblocks;
+ self.duration = (((nframes - 1) as u64) * u64::from(blocksperframe) + u64::from(finalblocks)) * 1000 / u64::from(srate);
seek_index.mode = SeekIndexMode::Present;
let first_off = src.peek_u32le()?;
self.src.read_buf(&mut buf[8..])?;
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), None, None, tb_num, tb_den);
+ let ts = stream.make_ts(Some(self.cur_frame as u64), None, None);
let pkt = NAPacket::new(stream, ts, true, buf);
self.cur_frame += 1;
Ok(())
}
- fn get_duration(&self) -> u64 { 0 }
+ fn get_duration(&self) -> u64 { self.duration }
}
impl<'a> NAOptionHandler for APEDemuxer<'a> {
#[test]
fn test_ape_demux() {
+ // sample: https://samples.mplayerhq.hu/A-codecs/lossless/luckynight.ape
let mut file = File::open("assets/LLaudio/ape/luckynight.ape").unwrap();
let mut fr = FileReader::new_read(&mut file);
let mut br = ByteReader::new(&mut fr);