self.cur_samples = blkno * u64::from(self.blk_samples);
(u64::from(self.blk_samples), blkno)
} else {
- validate!((buf[1] & 1) != 0);
- let blksamps = u64::from(read_utf8(&buf[4..])?);
- (blksamps, self.cur_samples)
+ let mut idx = 5;
+ while idx < buf.len() && (buf[idx] & 0x80) != 0 {
+ idx += 1;
+ }
+
+ let bsz_id = buf[2] >> 4;
+ let blksamps = match bsz_id {
+ 0 => return Err(DemuxerError::InvalidData),
+ 1 => 192,
+ 2..=5 => 576 << (bsz_id - 2),
+ 6 => {
+ validate!(idx < buf.len());
+ u64::from(buf[idx]) + 1
+ },
+ 7 => {
+ validate!(idx + 2 <= buf.len());
+ u64::from(buf[idx]) * 256 + u64::from(buf[idx + 1]) + 1
+ },
+ _ => 256 << (bsz_id - 8),
+ };
+ let pts = u64::from(read_utf8(&buf[4..])?);
+
+ validate!(idx < buf.len());
+
+ (blksamps, pts)
};
let spos = if self.blk_samples != 0 { pts * u64::from(self.blk_samples) } else { pts };
let base = if self.blk_samples != 0 { u32::from(self.blk_samples) } else { 1 };
let ahdr = NAAudioInfo::new(srate, channels as u8, SND_S16P_FORMAT, base as usize);
let ainfo = NACodecInfo::new("flac", NACodecTypeInfo::Audio(ahdr), Some(streaminfo));
- strmgr.add_stream(NAStream::new(StreamType::Audio, 0, ainfo, base, srate)).unwrap();
+ strmgr.add_stream(NAStream::new(StreamType::Audio, 0, ainfo, base, srate, 0)).unwrap();
Ok(())
}
self.src.seek(SeekFrom::Start(self.data_start + seek_info.pos))?;
Ok(())
} else if let NATimePoint::Milliseconds(ms) = time {
- let samppos = NATimeInfo::time_to_ts(ms, 1000, self.srate, 1);
+ let samppos = NATimeInfo::time_to_ts(ms, 1000, 1, self.srate);
if self.known_frames.last().unwrap_or(&FrameSeekInfo::default()).sampleend >= samppos {
for point in self.known_frames.iter().rev() {
if point.samplepos <= samppos {
Err(DemuxerError::NotPossible)
}
}
+ fn get_duration(&self) -> u64 { self.tot_samples * 1000 / u64::from(self.srate) }
}
impl<'a> NAOptionHandler for FLACDemuxer<'a> {
#[test]
fn test_flac_demux() {
+ // sample: https://samples.mplayerhq.hu/A-codecs/lossless/luckynight.flac
let mut file = File::open("assets/LLaudio/luckynight.flac").unwrap();
let mut fr = FileReader::new_read(&mut file);
let mut br = ByteReader::new(&mut fr);