diff --git a/crates/enc-ffmpeg/src/audio/buffered_resampler.rs b/crates/enc-ffmpeg/src/audio/buffered_resampler.rs index da386b955f..8f26bcb54e 100644 --- a/crates/enc-ffmpeg/src/audio/buffered_resampler.rs +++ b/crates/enc-ffmpeg/src/audio/buffered_resampler.rs @@ -279,21 +279,15 @@ mod test { const IN_RATE: u32 = 100; fn create_resampler(out_rate: u32) -> BufferedResampler { - let resampler = ffmpeg::software::resampler( - ( - format::Sample::U8(cap_media_info::Type::Packed), - ChannelLayout::MONO, - IN_RATE, - ), - ( + BufferedResampler::new( + AudioInfo::new_raw(format::Sample::U8(cap_media_info::Type::Packed), IN_RATE, 1), + AudioInfo::new_raw( format::Sample::U8(cap_media_info::Type::Packed), - ChannelLayout::MONO, out_rate, + 1, ), ) - .unwrap(); - - BufferedResampler::new(resampler) + .unwrap() } fn make_input_frame(samples: usize, pts: i64) -> ffmpeg::frame::Audio { diff --git a/crates/enc-ffmpeg/src/audio/opus.rs b/crates/enc-ffmpeg/src/audio/opus.rs index 2f3cb982de..de82272653 100644 --- a/crates/enc-ffmpeg/src/audio/opus.rs +++ b/crates/enc-ffmpeg/src/audio/opus.rs @@ -59,14 +59,8 @@ impl OpusEncoder { .collect::>(); rates.sort(); - let Some(&rate) = rates - .iter() - .find(|r| **r >= input_config.rate()) - .or(rates.first()) - else { - return Err(OpusEncoderError::RateNotSupported(input_config.rate())); - }; - rate + select_output_rate(input_config.rate(), &rates) + .ok_or(OpusEncoderError::RateNotSupported(input_config.rate()))? }; let mut output_config = input_config; @@ -108,6 +102,37 @@ impl OpusEncoder { } } +fn select_output_rate(input_rate: i32, supported_rates: &[i32]) -> Option { + supported_rates + .iter() + .copied() + .find(|&rate| rate >= input_rate) + .or_else(|| supported_rates.iter().copied().max()) +} + +#[cfg(test)] +mod tests { + use super::select_output_rate; + + #[test] + fn chooses_matching_rate_when_available() { + let supported = [8_000, 12_000, 16_000, 24_000, 48_000]; + assert_eq!(select_output_rate(16_000, &supported), Some(16_000)); + } + + #[test] + fn clamps_to_highest_supported_rate_when_input_is_higher() { + let supported = [8_000, 12_000, 16_000, 24_000, 48_000]; + assert_eq!(select_output_rate(96_000, &supported), Some(48_000)); + } + + #[test] + fn clamps_to_lowest_supported_rate_when_input_is_lower() { + let supported = [8_000, 12_000, 16_000, 24_000, 48_000]; + assert_eq!(select_output_rate(4_000, &supported), Some(8_000)); + } +} + impl AudioEncoder for OpusEncoder { fn send_frame(&mut self, frame: frame::Audio, output: &mut format::context::Output) { let _ = self.queue_frame(frame, Duration::MAX, output);