use kithara_bufpool::PcmBuf;
use kithara_platform::time::Duration;
use kithara_stream::AudioCodec;
use crate::{error::DecodeResult, types::PcmSpec};
#[derive(Debug, Default, Clone, Copy, Eq, PartialEq)]
#[non_exhaustive]
pub struct CodecPriming {
pub frames: u64,
pub packets: u32,
pub byte_margin: u64,
}
pub(crate) fn access_unit_frames(codec: AudioCodec) -> u32 {
match codec {
AudioCodec::Mp3 => 1152,
AudioCodec::AacLc | AudioCodec::AacHe | AudioCodec::AacHeV2 => 1024,
_ => 0,
}
}
pub(crate) trait FrameCodec: Send + 'static {
fn decode_frame(
&mut self,
frame_data: &[u8],
pts: Duration,
packet_desc: &[u8],
out: &mut PcmBuf,
) -> DecodeResult<u32>;
fn decoder_algo_delay(&self, _codec: AudioCodec) -> u64 {
0
}
fn flush(&mut self) -> DecodeResult<()>;
fn spec(&self) -> PcmSpec;
fn track_info(&self) -> crate::DecoderTrackInfo {
crate::DecoderTrackInfo::default()
}
fn priming(&self, _codec: AudioCodec) -> CodecPriming {
CodecPriming::default()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn codec_priming_default_is_all_zero() {
let p = CodecPriming::default();
assert_eq!(p.frames, 0);
assert_eq!(p.packets, 0);
assert_eq!(p.byte_margin, 0);
}
}