use std::io::{self, Read};
use crate::error::{AacError, Result};
use crate::options::DecodeOptions;
use super::{Decoder, Frame, StreamInfo};
impl Decoder {
pub(super) fn decode_slice<F>(mut self, data: &[u8], on_frame: F) -> Result<StreamInfo>
where
F: FnMut(Frame<'_>) -> Result<()>,
{
self.opts.validate()?;
let mut cb = on_frame;
self.pump(data, None, None, &mut cb, true)?;
self.tallies()
}
pub(super) fn decode_slice_mono(
mut self,
data: &[u8],
est_frames: Option<usize>,
dst: &mut Vec<f32>,
) -> Result<StreamInfo> {
fn ignore(_: Frame<'_>) -> Result<()> {
Ok(())
}
self.opts.validate()?;
self.pump(data, Some(dst), est_frames, &mut ignore, true)?;
self.tallies()
}
pub fn feed_read<R, F>(&mut self, reader: &mut R, mut on_frame: F) -> Result<u64>
where
R: Read,
F: FnMut(Frame<'_>) -> Result<()>,
{
self.ensure_open()?;
self.opts.validate()?;
let cap = usize::try_from(self.opts.memory.max_buffered_input_bytes).unwrap_or(usize::MAX);
let chunk = cap.clamp(1, 4096);
let mut tmp = vec![0u8; chunk];
let mut total = 0u64;
loop {
let n = match reader.read(&mut tmp) {
Ok(0) => break,
Ok(n) => n,
Err(e) if e.kind() == io::ErrorKind::Interrupted => continue,
Err(e) => return self.fail(AacError::from(e)),
};
self.feed(&tmp[..n], &mut on_frame)?;
total += n as u64;
}
Ok(total)
}
#[cfg(test)]
pub(crate) fn input_capacity(&self) -> usize {
self.buf.capacity()
}
}
pub fn decode_read_streaming<R, F>(
mut reader: R,
opts: &DecodeOptions,
mut on_frame: F,
) -> Result<StreamInfo>
where
R: Read,
F: FnMut(Frame<'_>) -> Result<()>,
{
let mut dec = Decoder::new(opts.clone());
dec.feed_read(&mut reader, &mut on_frame)?;
dec.finish(&mut on_frame)
}