use opus_rs::{Application, OpusEncoder};
use std::f32::consts::PI;
#[test]
fn test_silk_toc_byte_structure() {
let sample_rate = 8000;
let frame_size = 160;
let mut encoder =
OpusEncoder::new(sample_rate, 1, Application::Voip).expect("Failed to create encoder");
encoder.complexity = 0;
encoder.bitrate_bps = 10000;
encoder.use_cbr = true;
let mut input = vec![0.0f32; frame_size];
for i in 0..frame_size {
input[i] = (2.0f32 * PI * 440.0f32 * i as f32 / 8000.0f32).sin();
}
let mut output = vec![0u8; 25];
let bytes = encoder
.encode(&input, frame_size, &mut output)
.expect("Encode failed");
assert!(bytes >= 3, "Packet too short: {}", bytes);
assert_eq!(
output[0], 0x0b,
"TOC byte mismatch: got 0x{:02x}",
output[0]
);
assert_eq!(
output[1], 0x01,
"Count byte mismatch: got 0x{:02x}",
output[1]
);
}
#[test]
fn test_silk_multi_frame_sizes() {
let sample_rate = 8000;
let frame_size = 160;
let mut encoder =
OpusEncoder::new(sample_rate, 1, Application::Voip).expect("Failed to create encoder");
encoder.complexity = 0;
encoder.bitrate_bps = 10000;
encoder.use_cbr = true;
for frame_idx in 0..5 {
let mut input = vec![0.0f32; frame_size];
for i in 0..frame_size {
let t = (frame_idx * frame_size + i) as f32 / sample_rate as f32;
input[i] = (2.0f32 * PI * 440.0f32 * t).sin();
}
let mut output = vec![0u8; 25];
let bytes = encoder
.encode(&input, frame_size, &mut output)
.expect("Encode failed");
assert!(
bytes >= 3,
"Frame {}: packet too short: {}",
frame_idx,
bytes
);
assert!(
bytes <= 25,
"Frame {}: packet too large: {}",
frame_idx,
bytes
);
println!(
"Frame {}: {} bytes, hex: {}",
frame_idx,
bytes,
hex::encode(&output[..bytes])
);
}
}
mod hex {
pub fn encode(data: &[u8]) -> String {
let mut s = String::with_capacity(data.len() * 2);
for &b in data {
let _ = std::fmt::Write::write_fmt(&mut s, format_args!("{:02x}", b));
}
s
}
}