pub mod decoder;
pub mod encoder;
pub mod mdct;
pub mod psychoacoustic;
pub use decoder::{deserialize_frame, deserialize_sparse, TransformDecoder};
pub use encoder::{serialize_frame, serialize_sparse, TransformEncoder, TransformFrame};
pub use mdct::{
BlockSize, Mdct, WindowType, FRAME_COEFFICIENTS, LONG_BLOCK_SIZE, SHORTS_PER_GROUP,
SHORT_BLOCK_SIZE, SHORT_GROUP_OFFSET,
};
pub use psychoacoustic::{PsychoacousticModel, BARK_BAND_EDGES, NUM_BARK_BANDS};
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum QualityPreset {
Low,
Medium,
High,
VeryHigh,
Transparent,
}
impl QualityPreset {
pub fn as_f32(self) -> f32 {
match self {
QualityPreset::Low => 0.0,
QualityPreset::Medium => 0.35,
QualityPreset::High => 0.55,
QualityPreset::VeryHigh => 0.75,
QualityPreset::Transparent => 1.0,
}
}
pub fn from_f32(quality: f32) -> Self {
if quality < 0.2 {
QualityPreset::Low
} else if quality < 0.45 {
QualityPreset::Medium
} else if quality < 0.65 {
QualityPreset::High
} else if quality < 0.85 {
QualityPreset::VeryHigh
} else {
QualityPreset::Transparent
}
}
pub fn expected_ratio(self) -> f32 {
match self {
QualityPreset::Low => 30.0,
QualityPreset::Medium => 10.0,
QualityPreset::High => 6.0,
QualityPreset::VeryHigh => 4.0,
QualityPreset::Transparent => 3.0,
}
}
pub fn equivalent_bitrate(self) -> u32 {
match self {
QualityPreset::Low => 48,
QualityPreset::Medium => 128,
QualityPreset::High => 192,
QualityPreset::VeryHigh => 256,
QualityPreset::Transparent => 320,
}
}
pub fn from_bitrate(bitrate_kbps: u32, sample_rate: u32, channels: u8) -> Self {
let raw_kbps = (sample_rate as u64 * channels as u64 * 16) / 1000;
let target_ratio = raw_kbps as f32 / bitrate_kbps as f32;
if target_ratio > 20.0 {
QualityPreset::Low
} else if target_ratio > 10.0 {
QualityPreset::Medium
} else if target_ratio > 6.0 {
QualityPreset::High
} else if target_ratio > 4.0 {
QualityPreset::VeryHigh
} else {
QualityPreset::Transparent
}
}
}
impl From<u8> for QualityPreset {
fn from(v: u8) -> Self {
match v {
0 => QualityPreset::Low,
1 => QualityPreset::Medium,
2 => QualityPreset::High,
3 => QualityPreset::VeryHigh,
_ => QualityPreset::Transparent,
}
}
}
impl From<QualityPreset> for u8 {
fn from(q: QualityPreset) -> u8 {
match q {
QualityPreset::Low => 0,
QualityPreset::Medium => 1,
QualityPreset::High => 2,
QualityPreset::VeryHigh => 3,
QualityPreset::Transparent => 4,
}
}
}