use serde::{Deserialize, Serialize};
use symphonia::core::codecs::{
CODEC_TYPE_AAC, CODEC_TYPE_AC4, CODEC_TYPE_ADPCM_G722, CODEC_TYPE_ADPCM_G726,
CODEC_TYPE_ADPCM_G726LE, CODEC_TYPE_ADPCM_IMA_QT, CODEC_TYPE_ADPCM_IMA_WAV,
CODEC_TYPE_ADPCM_MS, CODEC_TYPE_ALAC, CODEC_TYPE_ATRAC1, CODEC_TYPE_ATRAC3,
CODEC_TYPE_ATRAC3PLUS, CODEC_TYPE_ATRAC9, CODEC_TYPE_DCA, CODEC_TYPE_EAC3, CODEC_TYPE_FLAC,
CODEC_TYPE_MONKEYS_AUDIO, CODEC_TYPE_MP1, CODEC_TYPE_MP2, CODEC_TYPE_MP3, CODEC_TYPE_MUSEPACK,
CODEC_TYPE_NULL, CODEC_TYPE_OPUS, CODEC_TYPE_PCM_ALAW, CODEC_TYPE_PCM_F32BE,
CODEC_TYPE_PCM_F32BE_PLANAR, CODEC_TYPE_PCM_F32LE, CODEC_TYPE_PCM_F32LE_PLANAR,
CODEC_TYPE_PCM_F64BE, CODEC_TYPE_PCM_F64BE_PLANAR, CODEC_TYPE_PCM_F64LE,
CODEC_TYPE_PCM_F64LE_PLANAR, CODEC_TYPE_PCM_MULAW, CODEC_TYPE_PCM_S8, CODEC_TYPE_PCM_S8_PLANAR,
CODEC_TYPE_PCM_S16BE, CODEC_TYPE_PCM_S16BE_PLANAR, CODEC_TYPE_PCM_S16LE,
CODEC_TYPE_PCM_S16LE_PLANAR, CODEC_TYPE_PCM_S24BE, CODEC_TYPE_PCM_S24BE_PLANAR,
CODEC_TYPE_PCM_S24LE, CODEC_TYPE_PCM_S24LE_PLANAR, CODEC_TYPE_PCM_S32BE,
CODEC_TYPE_PCM_S32BE_PLANAR, CODEC_TYPE_PCM_S32LE, CODEC_TYPE_PCM_S32LE_PLANAR,
CODEC_TYPE_PCM_U8, CODEC_TYPE_PCM_U8_PLANAR, CODEC_TYPE_PCM_U16BE, CODEC_TYPE_PCM_U16BE_PLANAR,
CODEC_TYPE_PCM_U16LE, CODEC_TYPE_PCM_U16LE_PLANAR, CODEC_TYPE_PCM_U24BE,
CODEC_TYPE_PCM_U24BE_PLANAR, CODEC_TYPE_PCM_U24LE, CODEC_TYPE_PCM_U24LE_PLANAR,
CODEC_TYPE_PCM_U32BE, CODEC_TYPE_PCM_U32BE_PLANAR, CODEC_TYPE_PCM_U32LE,
CODEC_TYPE_PCM_U32LE_PLANAR, CODEC_TYPE_SPEEX, CODEC_TYPE_TTA, CODEC_TYPE_VORBIS,
CODEC_TYPE_WAVPACK, CODEC_TYPE_WMA, CodecType,
};
use crate::errors::CodecError;
#[derive(Debug, PartialEq, Eq, Copy, Clone, Serialize, Deserialize)]
pub enum Codec {
Aac,
Ac4,
AdpcmG722,
AdpcmG726,
AdpcmG726Le,
AdpcmImaQt,
AdpcmImaWav,
AdpcmMs,
Alac,
Atrac1,
Atrac3,
Atrac9,
Atrac3Plus,
Dca,
Eac3,
Flac,
MonkeysAudio,
Mp1,
Mp2,
Mp3,
Musepack,
Opus,
PcmAlaw,
PcmF32Be,
PcmF32BePlanar,
PcmF32Le,
PcmF32LePlanar,
PcmF64Be,
PcmF64BePlanar,
PcmF64Le,
PcmF64LePlanar,
PcmMulaw,
PcmS8,
PcmS8Planar,
PcmS16Be,
PcmS16BePlanar,
PcmS16Le,
PcmS16LePlanar,
PcmS24Be,
PcmS24BePlanar,
PcmS24Le,
PcmS24LePlanar,
PcmS32Be,
PcmS32BePlanar,
PcmS32Le,
PcmS32LePlanar,
PcmU8,
PcmU8Planar,
PcmU16Be,
PcmU16BePlanar,
PcmU16Le,
PcmU16LePlanar,
PcmU24Be,
PcmU24BePlanar,
PcmU24Le,
PcmU24LePlanar,
PcmU32Be,
PcmU32BePlanar,
PcmU32Le,
PcmU32LePlanar,
Speex,
Tta,
Vorbis,
WavPack,
Wma,
}
impl Codec {
#[must_use]
pub fn is_pcm(&self) -> bool {
matches!(
self,
Codec::PcmAlaw
| Codec::PcmF32Be
| Codec::PcmF32BePlanar
| Codec::PcmF32Le
| Codec::PcmF32LePlanar
| Codec::PcmF64Be
| Codec::PcmF64BePlanar
| Codec::PcmF64Le
| Codec::PcmF64LePlanar
| Codec::PcmMulaw
| Codec::PcmS8
| Codec::PcmS8Planar
| Codec::PcmS16Be
| Codec::PcmS16BePlanar
| Codec::PcmS16Le
| Codec::PcmS16LePlanar
| Codec::PcmS24Be
| Codec::PcmS24BePlanar
| Codec::PcmS24Le
| Codec::PcmS24LePlanar
| Codec::PcmS32Be
| Codec::PcmS32BePlanar
| Codec::PcmS32Le
| Codec::PcmS32LePlanar
| Codec::PcmU8
| Codec::PcmU8Planar
| Codec::PcmU16Be
| Codec::PcmU16BePlanar
| Codec::PcmU16Le
| Codec::PcmU16LePlanar
| Codec::PcmU24Be
| Codec::PcmU24BePlanar
| Codec::PcmU24Le
| Codec::PcmU24LePlanar
| Codec::PcmU32Be
| Codec::PcmU32BePlanar
| Codec::PcmU32Le
| Codec::PcmU32LePlanar
| Codec::Tta
| Codec::WavPack
)
}
#[must_use]
pub fn is_lossless(&self) -> bool {
matches!(
self,
Codec::Alac
| Codec::Flac
| Codec::MonkeysAudio
| Codec::PcmF32Be
| Codec::PcmF32BePlanar
| Codec::PcmF32Le
| Codec::PcmF32LePlanar
| Codec::PcmF64Be
| Codec::PcmF64BePlanar
| Codec::PcmF64Le
| Codec::PcmF64LePlanar
| Codec::PcmS8
| Codec::PcmS8Planar
| Codec::PcmS16Be
| Codec::PcmS16BePlanar
| Codec::PcmS16Le
| Codec::PcmS16LePlanar
| Codec::PcmS24Be
| Codec::PcmS24BePlanar
| Codec::PcmS24Le
| Codec::PcmS24LePlanar
| Codec::PcmS32Be
| Codec::PcmS32BePlanar
| Codec::PcmS32Le
| Codec::PcmS32LePlanar
| Codec::PcmU8
| Codec::PcmU8Planar
| Codec::PcmU16Be
| Codec::PcmU16BePlanar
| Codec::PcmU16Le
| Codec::PcmU16LePlanar
| Codec::PcmU24Be
| Codec::PcmU24BePlanar
| Codec::PcmU24Le
| Codec::PcmU24LePlanar
| Codec::PcmU32Be
| Codec::PcmU32BePlanar
| Codec::PcmU32Le
| Codec::PcmU32LePlanar
)
}
#[must_use]
pub fn is_flac(&self) -> bool {
matches!(self, Self::Flac)
}
#[must_use]
pub fn is_mp3(&self) -> bool {
matches!(self, Self::Mp3)
}
#[must_use]
pub fn is_opus(&self) -> bool {
matches!(self, Self::Opus)
}
#[must_use]
pub fn is_vorbis(&self) -> bool {
matches!(self, Self::Vorbis)
}
pub fn ffmpeg_encoder(&self) -> Result<&'static str, CodecError> {
let encoder = match self {
Codec::Aac => "aac",
Codec::Alac => "alac",
Codec::Eac3 => "eac3",
Codec::Flac => "flac",
Codec::Mp2 => "mp2",
Codec::Mp3 => "libmp3lame",
Codec::Opus => "libopus",
Codec::PcmAlaw => "pcm_alaw",
Codec::PcmMulaw => "pcm_mulaw",
Codec::PcmF32Be => "pcm_f32be",
Codec::PcmF32Le => "pcm_f32le",
Codec::PcmF64Be => "pcm_f64be",
Codec::PcmF64Le => "pcm_f64le",
Codec::PcmS8 => "pcm_s8",
Codec::PcmS16Be => "pcm_s16be",
Codec::PcmS16Le => "pcm_s16le",
Codec::PcmS24Be => "pcm_s24be",
Codec::PcmS24Le => "pcm_s24le",
Codec::PcmS32Be => "pcm_s32be",
Codec::PcmS32Le => "pcm_s32le",
Codec::PcmU8 => "pcm_u8",
Codec::PcmU16Be => "pcm_u16be",
Codec::PcmU16Le => "pcm_u16le",
Codec::PcmU24Be => "pcm_u24be",
Codec::PcmU24Le => "pcm_u24le",
Codec::PcmU32Be => "pcm_u32be",
Codec::PcmU32Le => "pcm_u32le",
Codec::Speex => "libspeex",
Codec::Tta => "tta",
Codec::Vorbis => "libvorbis",
Codec::WavPack => "wavpack",
Codec::Wma => "wmav2",
_ => return Err(CodecError::NoEncoder(*self)),
};
Ok(encoder)
}
}
impl TryFrom<CodecType> for Codec {
type Error = CodecError;
fn try_from(value: CodecType) -> Result<Codec, CodecError> {
let codec = match value {
CODEC_TYPE_AAC => Codec::Aac,
CODEC_TYPE_AC4 => Codec::Ac4,
CODEC_TYPE_ADPCM_G722 => Codec::AdpcmG722,
CODEC_TYPE_ADPCM_G726 => Codec::AdpcmG726,
CODEC_TYPE_ADPCM_G726LE => Codec::AdpcmG726Le,
CODEC_TYPE_ADPCM_IMA_QT => Codec::AdpcmImaQt,
CODEC_TYPE_ADPCM_IMA_WAV => Codec::AdpcmImaWav,
CODEC_TYPE_ADPCM_MS => Codec::AdpcmMs,
CODEC_TYPE_ALAC => Codec::Alac,
CODEC_TYPE_ATRAC1 => Codec::Atrac1,
CODEC_TYPE_ATRAC3 => Codec::Atrac3,
CODEC_TYPE_ATRAC9 => Codec::Atrac9,
CODEC_TYPE_ATRAC3PLUS => Codec::Atrac3Plus,
CODEC_TYPE_DCA => Codec::Dca,
CODEC_TYPE_EAC3 => Codec::Eac3,
CODEC_TYPE_FLAC => Codec::Flac,
CODEC_TYPE_MONKEYS_AUDIO => Codec::MonkeysAudio,
CODEC_TYPE_MP1 => Codec::Mp1,
CODEC_TYPE_MP2 => Codec::Mp2,
CODEC_TYPE_MP3 => Codec::Mp3,
CODEC_TYPE_MUSEPACK => Codec::Musepack,
CODEC_TYPE_OPUS => Codec::Opus,
CODEC_TYPE_PCM_ALAW => Codec::PcmAlaw,
CODEC_TYPE_PCM_F32BE => Codec::PcmF32Be,
CODEC_TYPE_PCM_F32BE_PLANAR => Codec::PcmF32BePlanar,
CODEC_TYPE_PCM_F32LE => Codec::PcmF32Le,
CODEC_TYPE_PCM_F32LE_PLANAR => Codec::PcmF32LePlanar,
CODEC_TYPE_PCM_F64BE => Codec::PcmF64Be,
CODEC_TYPE_PCM_F64BE_PLANAR => Codec::PcmF64BePlanar,
CODEC_TYPE_PCM_F64LE => Codec::PcmF64Le,
CODEC_TYPE_PCM_F64LE_PLANAR => Codec::PcmF64LePlanar,
CODEC_TYPE_PCM_MULAW => Codec::PcmMulaw,
CODEC_TYPE_PCM_S8 => Codec::PcmS8,
CODEC_TYPE_PCM_S8_PLANAR => Codec::PcmS8Planar,
CODEC_TYPE_PCM_S16BE => Codec::PcmS16Be,
CODEC_TYPE_PCM_S16BE_PLANAR => Codec::PcmS16BePlanar,
CODEC_TYPE_PCM_S16LE => Codec::PcmS16Le,
CODEC_TYPE_PCM_S16LE_PLANAR => Codec::PcmS16LePlanar,
CODEC_TYPE_PCM_S24BE => Codec::PcmS24Be,
CODEC_TYPE_PCM_S24BE_PLANAR => Codec::PcmS24BePlanar,
CODEC_TYPE_PCM_S24LE => Codec::PcmS24Le,
CODEC_TYPE_PCM_S24LE_PLANAR => Codec::PcmS24LePlanar,
CODEC_TYPE_PCM_S32BE => Codec::PcmS32Be,
CODEC_TYPE_PCM_S32BE_PLANAR => Codec::PcmS32BePlanar,
CODEC_TYPE_PCM_S32LE => Codec::PcmS32Le,
CODEC_TYPE_PCM_S32LE_PLANAR => Codec::PcmS32LePlanar,
CODEC_TYPE_PCM_U8 => Codec::PcmU8,
CODEC_TYPE_PCM_U8_PLANAR => Codec::PcmU8Planar,
CODEC_TYPE_PCM_U16BE => Codec::PcmU16Be,
CODEC_TYPE_PCM_U16BE_PLANAR => Codec::PcmU16BePlanar,
CODEC_TYPE_PCM_U16LE => Codec::PcmU16Le,
CODEC_TYPE_PCM_U16LE_PLANAR => Codec::PcmU16LePlanar,
CODEC_TYPE_PCM_U24BE => Codec::PcmU24Be,
CODEC_TYPE_PCM_U24BE_PLANAR => Codec::PcmU24BePlanar,
CODEC_TYPE_PCM_U24LE => Codec::PcmU24Le,
CODEC_TYPE_PCM_U24LE_PLANAR => Codec::PcmU24LePlanar,
CODEC_TYPE_PCM_U32BE => Codec::PcmU32Be,
CODEC_TYPE_PCM_U32BE_PLANAR => Codec::PcmU32BePlanar,
CODEC_TYPE_PCM_U32LE => Codec::PcmU32Le,
CODEC_TYPE_PCM_U32LE_PLANAR => Codec::PcmU32LePlanar,
CODEC_TYPE_SPEEX => Codec::Speex,
CODEC_TYPE_TTA => Codec::Tta,
CODEC_TYPE_VORBIS => Codec::Vorbis,
CODEC_TYPE_WAVPACK => Codec::WavPack,
CODEC_TYPE_WMA => Codec::Wma,
CODEC_TYPE_NULL => return Err(CodecError::NoDecoder),
other => return Err(CodecError::Unknown(other.to_string())),
};
Ok(codec)
}
}