pub const DEFAULT_MAX_INPUT_BYTES: u64 = 1 << 30;
pub const DEFAULT_MAX_DURATION_SECS: f64 = 7200.0;
pub const DEFAULT_MAX_SAMPLE_RATE: u32 = 192_000;
pub const DEFAULT_MAX_DECODE_SAMPLE_RATE: u32 = 48_000;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum ChannelMode {
#[default]
Mono,
Split,
}
#[derive(Debug, Clone, PartialEq)]
pub struct DecodeOptions {
pub channel_mode: ChannelMode,
pub max_duration_secs: f64,
pub max_sample_rate: u32,
pub max_decode_sample_rate: u32,
}
impl Default for DecodeOptions {
fn default() -> Self {
Self {
channel_mode: ChannelMode::Mono,
max_duration_secs: DEFAULT_MAX_DURATION_SECS,
max_sample_rate: DEFAULT_MAX_SAMPLE_RATE,
max_decode_sample_rate: DEFAULT_MAX_DECODE_SAMPLE_RATE,
}
}
}
impl DecodeOptions {
#[inline]
pub fn speech() -> Self {
Self::default()
}
#[inline]
pub fn unbounded() -> Self {
Self {
channel_mode: ChannelMode::Split,
max_duration_secs: f64::INFINITY,
max_sample_rate: u32::MAX,
max_decode_sample_rate: u32::MAX,
}
}
#[inline]
pub fn with_channel_mode(mut self, mode: ChannelMode) -> Self {
self.channel_mode = mode;
self
}
#[inline]
pub fn with_max_duration_secs(mut self, secs: f64) -> Self {
self.max_duration_secs = secs;
self
}
#[inline]
pub fn with_max_sample_rate(mut self, rate: u32) -> Self {
self.max_sample_rate = rate;
self
}
#[inline]
pub fn max_frames(&self, sample_rate: u32) -> usize {
let rate = sample_rate.min(self.max_decode_sample_rate).max(1) as f64;
if !self.max_duration_secs.is_finite() {
return usize::MAX;
}
let frames = self.max_duration_secs * rate;
if !frames.is_finite() || frames <= 0.0 {
return 0;
}
frames.min(usize::MAX as f64) as usize
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum EncodeContainer {
#[default]
Adts,
M4a,
}
#[derive(Debug, Clone, PartialEq)]
pub struct EncodeOptions {
pub container: EncodeContainer,
pub bitrate_bps: u32,
}
impl Default for EncodeOptions {
fn default() -> Self {
Self {
container: EncodeContainer::Adts,
bitrate_bps: 128_000,
}
}
}
impl EncodeOptions {
#[inline]
pub fn adts() -> Self {
Self::default()
}
#[inline]
pub fn m4a() -> Self {
Self {
container: EncodeContainer::M4a,
..Self::default()
}
}
#[inline]
pub fn with_container(mut self, container: EncodeContainer) -> Self {
self.container = container;
self
}
#[inline]
pub fn with_bitrate_bps(mut self, bps: u32) -> Self {
self.bitrate_bps = bps;
self
}
}
#[cfg(test)]
#[path = "options_tests.rs"]
mod options_tests;