use opus_rs::{Application, OpusDecoder, OpusEncoder};
#[cfg(feature = "heap")]
#[test]
fn encoder_and_decoder_structs_are_small_with_heap() {
assert!(
std::mem::size_of::<OpusEncoder>() < 4 * 1024,
"OpusEncoder is {} bytes with heap; expected < 4 KiB",
std::mem::size_of::<OpusEncoder>()
);
assert!(
std::mem::size_of::<OpusDecoder>() < 4 * 1024,
"OpusDecoder is {} bytes with heap; expected < 4 KiB",
std::mem::size_of::<OpusDecoder>()
);
}
#[cfg(not(feature = "heap"))]
#[test]
fn structs_are_large_without_heap() {
assert!(
std::mem::size_of::<OpusEncoder>() > 100_000,
"OpusEncoder is {} bytes without heap; expected > 100 KiB",
std::mem::size_of::<OpusEncoder>()
);
assert!(
std::mem::size_of::<OpusDecoder>() > 100_000,
"OpusDecoder is {} bytes without heap; expected > 100 KiB",
std::mem::size_of::<OpusDecoder>()
);
}
#[test]
fn report_struct_sizes() {
println!(
"size_of::<OpusEncoder>() = {} B",
std::mem::size_of::<OpusEncoder>()
);
println!(
"size_of::<OpusDecoder>() = {} B",
std::mem::size_of::<OpusDecoder>()
);
}
#[cfg(feature = "heap")]
fn roundtrip_on_stack(stack_size: usize) -> bool {
std::thread::Builder::new()
.stack_size(stack_size)
.spawn(|| {
let mut enc = OpusEncoder::new(48000, 2, Application::Audio).unwrap();
enc.bitrate_bps = 128_000;
let frame_size = 960; let mut input = vec![0.0f32; frame_size * 2];
for (i, x) in input.iter_mut().enumerate() {
let t = i as f32 / 48000.0;
*x = 0.5 * (2.0 * std::f32::consts::PI * 440.0 * t).sin();
}
let mut packet = vec![0u8; 2048];
let n = enc.encode(&input, frame_size, &mut packet).unwrap();
let mut dec = OpusDecoder::new(48000, 2).unwrap();
let mut pcm = vec![0.0f32; frame_size * 2];
let samples = dec.decode(&packet[..n], frame_size, &mut pcm).unwrap();
samples > 0
})
.unwrap()
.join()
.unwrap()
}
#[cfg(feature = "heap")]
#[test]
fn construction_and_roundtrip_fit_in_768kb_stack() {
assert!(
roundtrip_on_stack(768 * 1024),
"constructing + encoding + decoding overflowed a 768 KiB stack"
);
}