#![forbid(unsafe_code)]
use mediaway_common::{AudioFrame, Packet, StreamInfo};
use mediaway_sw::opus::config::OpusDecoderConfig;
use mediaway_sw::opus::error::OpusError;
use crate::AudioDecoder;
use crate::error::DecodeError;
#[derive(Debug)]
pub struct SwOpusAudioDecoder {
inner: mediaway_sw::opus::decoder::OpusDecoder,
}
impl SwOpusAudioDecoder {
pub fn open(config: &OpusDecoderConfig) -> Result<Self, DecodeError> {
match mediaway_sw::opus::decoder::OpusDecoder::open(config) {
Ok(inner) => Ok(Self { inner }),
Err(e) => Err(Self::map_err(&e)),
}
}
const fn map_err(e: &OpusError) -> DecodeError {
match e {
OpusError::UnsupportedSampleFormat
| OpusError::ConfigMismatch
| OpusError::FrameSizeMismatch { .. }
| OpusError::InvalidFrameDuration { .. } => DecodeError::InvalidInput,
OpusError::Closed => DecodeError::Closed,
_ => DecodeError::Backend, }
}
}
impl AudioDecoder for SwOpusAudioDecoder {
fn stream_info(&self) -> &StreamInfo {
self.inner.stream_info()
}
fn push_packet(&mut self, packet: &Packet) -> Result<(), DecodeError> {
self.inner
.push_packet(packet)
.map_err(|e| Self::map_err(&e))
}
fn poll_frame(&mut self) -> Result<Option<AudioFrame>, DecodeError> {
self.inner.poll_frame().map_err(|e| Self::map_err(&e))
}
fn flush(&mut self) -> Result<(), DecodeError> {
self.inner.flush().map_err(|e| Self::map_err(&e))
}
}