#![allow(
dead_code,
clippy::needless_range_loop,
clippy::excessive_precision,
clippy::too_many_arguments
)]
pub mod decoder;
pub mod encoder;
pub mod header;
pub mod silk;
pub mod toc;
use oxideav_core::{CodecCapabilities, CodecId, CodecParameters, CodecTag, Result};
use oxideav_core::{CodecInfo, CodecRegistry, Decoder, Encoder};
pub const CODEC_ID_STR: &str = "opus";
pub fn register_codecs(reg: &mut CodecRegistry) {
let caps = CodecCapabilities::audio("opus_sw")
.with_lossy(true)
.with_max_channels(2)
.with_max_sample_rate(48_000);
reg.register(
CodecInfo::new(CodecId::new(CODEC_ID_STR))
.capabilities(caps)
.decoder(make_decoder)
.encoder(make_encoder)
.tags([
CodecTag::wave_format(0x4F70),
CodecTag::wave_format(0x704F),
CodecTag::wave_format(0x7075),
]),
);
}
pub fn register(ctx: &mut oxideav_core::RuntimeContext) {
register_codecs(&mut ctx.codecs);
}
oxideav_core::register!("opus", register);
fn make_decoder(params: &CodecParameters) -> Result<Box<dyn Decoder>> {
decoder::make_decoder(params)
}
fn make_encoder(params: &CodecParameters) -> Result<Box<dyn Encoder>> {
encoder::make_encoder(params)
}
pub use decoder::MultistreamOpusDecoder;
pub use header::{parse_opus_head, OpusHead};
pub use toc::{
parse_packet, parse_self_delimited_packet, OpusBandwidth, OpusMode, OpusPacket, Toc,
};
#[cfg(test)]
mod register_tests {
use super::*;
#[test]
fn register_via_runtime_context_installs_codec_factory() {
let mut ctx = oxideav_core::RuntimeContext::new();
register(&mut ctx);
let id = CodecId::new(CODEC_ID_STR);
assert!(
ctx.codecs.has_decoder(&id),
"decoder factory not installed via RuntimeContext"
);
assert!(
ctx.codecs.has_encoder(&id),
"encoder factory not installed via RuntimeContext"
);
}
}