use std::fmt;
use crate::audio::sample::SampleFormat;
use crate::audio::{Channels, GenericAudioBufferRef};
use crate::codecs::{CodecInfo, CodecProfile};
use crate::common::FourCc;
use crate::errors::Result;
use crate::packet::{Packet, PacketRef};
#[repr(transparent)]
#[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct AudioCodecId(u32);
pub const CODEC_ID_NULL_AUDIO: AudioCodecId = AudioCodecId(0x0);
impl Default for AudioCodecId {
fn default() -> Self {
CODEC_ID_NULL_AUDIO
}
}
impl AudioCodecId {
pub const fn new(cc: FourCc) -> AudioCodecId {
Self(0x8000_0000 | u32::from_be_bytes(cc.get()))
}
}
impl From<FourCc> for AudioCodecId {
fn from(value: FourCc) -> Self {
AudioCodecId::new(value)
}
}
impl fmt::Display for AudioCodecId {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{:#x}", self.0)
}
}
#[non_exhaustive]
#[derive(Copy, Clone, Debug)]
pub enum VerificationCheck {
Crc8(u8),
Crc16([u8; 2]),
Crc32([u8; 4]),
Md5([u8; 16]),
Other([u8; 16]),
}
#[derive(Clone, Debug, Default)]
pub struct AudioCodecParameters {
pub codec: AudioCodecId,
pub profile: Option<CodecProfile>,
pub sample_rate: Option<u32>,
pub sample_format: Option<SampleFormat>,
pub bits_per_sample: Option<u32>,
pub bits_per_coded_sample: Option<u32>,
pub channels: Option<Channels>,
pub max_frames_per_packet: Option<u64>,
pub verification_check: Option<VerificationCheck>,
pub frames_per_block: Option<u64>,
pub extra_data: Option<Box<[u8]>>,
}
impl AudioCodecParameters {
pub fn new() -> AudioCodecParameters {
AudioCodecParameters {
codec: CODEC_ID_NULL_AUDIO,
profile: None,
sample_rate: None,
sample_format: None,
bits_per_sample: None,
bits_per_coded_sample: None,
channels: None,
max_frames_per_packet: None,
verification_check: None,
frames_per_block: None,
extra_data: None,
}
}
pub fn for_codec(&mut self, codec: AudioCodecId) -> &mut Self {
self.codec = codec;
self
}
pub fn with_profile(&mut self, profile: CodecProfile) -> &mut Self {
self.profile = Some(profile);
self
}
pub fn with_sample_rate(&mut self, sample_rate: u32) -> &mut Self {
self.sample_rate = Some(sample_rate);
self
}
pub fn with_sample_format(&mut self, sample_format: SampleFormat) -> &mut Self {
self.sample_format = Some(sample_format);
self
}
pub fn with_bits_per_sample(&mut self, bits_per_sample: u32) -> &mut Self {
self.bits_per_sample = Some(bits_per_sample);
self
}
pub fn with_bits_per_coded_sample(&mut self, bits_per_coded_sample: u32) -> &mut Self {
self.bits_per_coded_sample = Some(bits_per_coded_sample);
self
}
pub fn with_channels(&mut self, channels: Channels) -> &mut Self {
self.channels = Some(channels);
self
}
pub fn with_max_frames_per_packet(&mut self, len: u64) -> &mut Self {
self.max_frames_per_packet = Some(len);
self
}
pub fn with_frames_per_block(&mut self, len: u64) -> &mut Self {
self.frames_per_block = Some(len);
self
}
pub fn with_extra_data(&mut self, data: Box<[u8]>) -> &mut Self {
self.extra_data = Some(data);
self
}
pub fn with_verification_code(&mut self, code: VerificationCheck) -> &mut Self {
self.verification_check = Some(code);
self
}
}
#[derive(Copy, Clone, Debug, Default)]
pub struct FinalizeResult {
pub verify_ok: Option<bool>,
}
#[non_exhaustive]
#[derive(Copy, Clone, Debug)]
pub struct AudioDecoderOptions {
pub gapless: bool,
pub verify: bool,
}
impl Default for AudioDecoderOptions {
fn default() -> Self {
Self { gapless: true, verify: false }
}
}
impl AudioDecoderOptions {
pub fn gapless(mut self, enable: bool) -> Self {
self.gapless = enable;
self
}
pub fn verify(mut self, verify: bool) -> Self {
self.verify = verify;
self
}
}
pub trait AudioDecoder: Send + Sync {
fn reset(&mut self);
fn codec_info(&self) -> &CodecInfo;
fn codec_params(&self) -> &AudioCodecParameters;
fn decode(&mut self, packet: &Packet) -> Result<GenericAudioBufferRef<'_>> {
self.decode_ref(&packet.as_packet_ref())
}
fn decode_ref(&mut self, packet: &PacketRef<'_>) -> Result<GenericAudioBufferRef<'_>>;
fn finalize(&mut self) -> FinalizeResult;
fn last_decoded(&self) -> GenericAudioBufferRef<'_>;
}
pub mod well_known {
use super::AudioCodecId;
pub const CODEC_ID_PCM_S32LE: AudioCodecId = AudioCodecId(0x100);
pub const CODEC_ID_PCM_S32LE_PLANAR: AudioCodecId = AudioCodecId(0x101);
pub const CODEC_ID_PCM_S32BE: AudioCodecId = AudioCodecId(0x102);
pub const CODEC_ID_PCM_S32BE_PLANAR: AudioCodecId = AudioCodecId(0x103);
pub const CODEC_ID_PCM_S24LE: AudioCodecId = AudioCodecId(0x104);
pub const CODEC_ID_PCM_S24LE_PLANAR: AudioCodecId = AudioCodecId(0x105);
pub const CODEC_ID_PCM_S24BE: AudioCodecId = AudioCodecId(0x106);
pub const CODEC_ID_PCM_S24BE_PLANAR: AudioCodecId = AudioCodecId(0x107);
pub const CODEC_ID_PCM_S16LE: AudioCodecId = AudioCodecId(0x108);
pub const CODEC_ID_PCM_S16LE_PLANAR: AudioCodecId = AudioCodecId(0x109);
pub const CODEC_ID_PCM_S16BE: AudioCodecId = AudioCodecId(0x10a);
pub const CODEC_ID_PCM_S16BE_PLANAR: AudioCodecId = AudioCodecId(0x10b);
pub const CODEC_ID_PCM_S8: AudioCodecId = AudioCodecId(0x10c);
pub const CODEC_ID_PCM_S8_PLANAR: AudioCodecId = AudioCodecId(0x10d);
pub const CODEC_ID_PCM_U32LE: AudioCodecId = AudioCodecId(0x10e);
pub const CODEC_ID_PCM_U32LE_PLANAR: AudioCodecId = AudioCodecId(0x10f);
pub const CODEC_ID_PCM_U32BE: AudioCodecId = AudioCodecId(0x110);
pub const CODEC_ID_PCM_U32BE_PLANAR: AudioCodecId = AudioCodecId(0x111);
pub const CODEC_ID_PCM_U24LE: AudioCodecId = AudioCodecId(0x112);
pub const CODEC_ID_PCM_U24LE_PLANAR: AudioCodecId = AudioCodecId(0x113);
pub const CODEC_ID_PCM_U24BE: AudioCodecId = AudioCodecId(0x114);
pub const CODEC_ID_PCM_U24BE_PLANAR: AudioCodecId = AudioCodecId(0x115);
pub const CODEC_ID_PCM_U16LE: AudioCodecId = AudioCodecId(0x116);
pub const CODEC_ID_PCM_U16LE_PLANAR: AudioCodecId = AudioCodecId(0x117);
pub const CODEC_ID_PCM_U16BE: AudioCodecId = AudioCodecId(0x118);
pub const CODEC_ID_PCM_U16BE_PLANAR: AudioCodecId = AudioCodecId(0x119);
pub const CODEC_ID_PCM_U8: AudioCodecId = AudioCodecId(0x11a);
pub const CODEC_ID_PCM_U8_PLANAR: AudioCodecId = AudioCodecId(0x11b);
pub const CODEC_ID_PCM_F32LE: AudioCodecId = AudioCodecId(0x11c);
pub const CODEC_ID_PCM_F32LE_PLANAR: AudioCodecId = AudioCodecId(0x11d);
pub const CODEC_ID_PCM_F32BE: AudioCodecId = AudioCodecId(0x11e);
pub const CODEC_ID_PCM_F32BE_PLANAR: AudioCodecId = AudioCodecId(0x11f);
pub const CODEC_ID_PCM_F64LE: AudioCodecId = AudioCodecId(0x120);
pub const CODEC_ID_PCM_F64LE_PLANAR: AudioCodecId = AudioCodecId(0x121);
pub const CODEC_ID_PCM_F64BE: AudioCodecId = AudioCodecId(0x122);
pub const CODEC_ID_PCM_F64BE_PLANAR: AudioCodecId = AudioCodecId(0x123);
pub const CODEC_ID_PCM_ALAW: AudioCodecId = AudioCodecId(0x124);
pub const CODEC_ID_PCM_MULAW: AudioCodecId = AudioCodecId(0x125);
pub const CODEC_ID_ADPCM_G722: AudioCodecId = AudioCodecId(0x200);
pub const CODEC_ID_ADPCM_G726: AudioCodecId = AudioCodecId(0x201);
pub const CODEC_ID_ADPCM_G726LE: AudioCodecId = AudioCodecId(0x202);
pub const CODEC_ID_ADPCM_MS: AudioCodecId = AudioCodecId(0x203);
pub const CODEC_ID_ADPCM_IMA_WAV: AudioCodecId = AudioCodecId(0x204);
pub const CODEC_ID_ADPCM_IMA_QT: AudioCodecId = AudioCodecId(0x205);
pub const CODEC_ID_VORBIS: AudioCodecId = AudioCodecId(0x1000);
pub const CODEC_ID_OPUS: AudioCodecId = AudioCodecId(0x1001);
pub const CODEC_ID_SPEEX: AudioCodecId = AudioCodecId(0x1002);
pub const CODEC_ID_MUSEPACK: AudioCodecId = AudioCodecId(0x1003);
pub const CODEC_ID_MP1: AudioCodecId = AudioCodecId(0x1004);
pub const CODEC_ID_MP2: AudioCodecId = AudioCodecId(0x1005);
pub const CODEC_ID_MP3: AudioCodecId = AudioCodecId(0x1006);
pub const CODEC_ID_AAC: AudioCodecId = AudioCodecId(0x1007);
pub const CODEC_ID_AC3: AudioCodecId = AudioCodecId(0x1008);
pub const CODEC_ID_EAC3: AudioCodecId = AudioCodecId(0x1009);
pub const CODEC_ID_AC4: AudioCodecId = AudioCodecId(0x100a);
pub const CODEC_ID_DCA: AudioCodecId = AudioCodecId(0x100b);
pub const CODEC_ID_ATRAC1: AudioCodecId = AudioCodecId(0x100c);
pub const CODEC_ID_ATRAC3: AudioCodecId = AudioCodecId(0x100d);
pub const CODEC_ID_ATRAC3PLUS: AudioCodecId = AudioCodecId(0x100e);
pub const CODEC_ID_ATRAC9: AudioCodecId = AudioCodecId(0x100f);
pub const CODEC_ID_WMA: AudioCodecId = AudioCodecId(0x1010);
pub const CODEC_ID_RA10: AudioCodecId = AudioCodecId(0x1011);
pub const CODEC_ID_RA20: AudioCodecId = AudioCodecId(0x1012);
pub const CODEC_ID_SIPR: AudioCodecId = AudioCodecId(0x1013);
pub const CODEC_ID_COOK: AudioCodecId = AudioCodecId(0x1014);
pub const CODEC_ID_SBC: AudioCodecId = AudioCodecId(0x1015);
pub const CODEC_ID_APTX: AudioCodecId = AudioCodecId(0x1016);
pub const CODEC_ID_APTX_HD: AudioCodecId = AudioCodecId(0x1017);
pub const CODEC_ID_LDAC: AudioCodecId = AudioCodecId(0x1018);
pub const CODEC_ID_BINK_AUDIO: AudioCodecId = AudioCodecId(0x1019);
pub const CODEC_ID_SMACKER_AUDIO: AudioCodecId = AudioCodecId(0x1020);
pub const CODEC_ID_FLAC: AudioCodecId = AudioCodecId(0x2000);
pub const CODEC_ID_WAVPACK: AudioCodecId = AudioCodecId(0x2001);
pub const CODEC_ID_MONKEYS_AUDIO: AudioCodecId = AudioCodecId(0x2002);
pub const CODEC_ID_ALAC: AudioCodecId = AudioCodecId(0x2003);
pub const CODEC_ID_TTA: AudioCodecId = AudioCodecId(0x2004);
pub const CODEC_ID_RALF: AudioCodecId = AudioCodecId(0x2005);
pub const CODEC_ID_TRUEHD: AudioCodecId = AudioCodecId(0x2006);
pub mod profiles {
use crate::codecs::CodecProfile;
pub const CODEC_PROFILE_AAC_MAIN: CodecProfile = CodecProfile(0);
pub const CODEC_PROFILE_AAC_LC: CodecProfile = CodecProfile(1);
pub const CODEC_PROFILE_AAC_SSR: CodecProfile = CodecProfile(2);
pub const CODEC_PROFILE_AAC_LTP: CodecProfile = CodecProfile(3);
pub const CODEC_PROFILE_AAC_HE: CodecProfile = CodecProfile(4);
pub const CODEC_PROFILE_AAC_HE_V2: CodecProfile = CodecProfile(28);
pub const CODEC_PROFILE_AAC_USAC: CodecProfile = CodecProfile(41);
}
}