#![allow(dead_code)]
use opus_pure::{OggOpusReader, OpusDecoder, OpusMSDecoder, packet, repacketizer};
const RATES: [i32; 4] = [8_000, 16_000, 24_000, 48_000];
const MAX_PACKET_MS: usize = 120;
pub fn decode_stream(data: &[u8]) {
let Some((&cfg, mut rest)) = data.split_first() else {
return;
};
let rate = RATES[(cfg & 0b11) as usize];
let channels = 1 + ((cfg >> 2) & 1) as usize;
let Ok(mut dec) = OpusDecoder::new(rate, channels) else {
return;
};
let frame_size = rate as usize / 1000 * MAX_PACKET_MS;
let mut pcm = vec![0.0f32; frame_size * channels];
let mut pcm_s16 = vec![0i16; frame_size * channels];
let integer_api = (cfg >> 3) & 1 == 1;
while rest.len() >= 2 {
let (prefix, tail) = rest.split_at(2);
let fec = prefix[0] & 0x80 != 0;
let len = (((prefix[0] & 0x7f) as usize) << 8) | prefix[1] as usize;
let (pkt, next) = tail.split_at(len.min(tail.len()));
rest = next;
let produced = match (fec, integer_api) {
(false, false) => dec.decode(pkt, frame_size, &mut pcm),
(false, true) => dec.decode_s16(pkt, frame_size, &mut pcm_s16),
(true, false) => dec.decode_fec(pkt, frame_size, &mut pcm),
(true, true) => dec.decode_fec_s16(pkt, frame_size, &mut pcm_s16),
};
let Ok(n) = produced else { continue };
assert!(
n <= frame_size,
"decode reported {n} samples into a buffer holding {frame_size}"
);
if !integer_api {
assert!(
pcm[..n * channels].iter().all(|s| s.is_finite()),
"decode accepted a packet and produced a non-finite sample"
);
}
if !fec && !pkt.is_empty() {
assert_eq!(
packet::samples(pkt, rate).ok(),
Some(n),
"decoded {n} samples from a packet `packet::samples` reads as \
{:?}",
packet::samples(pkt, rate)
);
}
}
}
pub fn ogg_read(data: &[u8]) {
let data = reseal_pages(data);
let Ok(mut reader) = OggOpusReader::new(std::io::Cursor::new(&data)) else {
return;
};
let head = reader.head().clone();
let channels = head.channel_count as usize;
let mut mono = None;
let mut multi = None;
if head.mapping_family == 0 {
match OpusDecoder::new(48_000, channels) {
Ok(d) => mono = Some(d),
Err(_) => return,
}
} else {
match OpusMSDecoder::new(48_000, channels, head.mapping_family) {
Ok(d) => multi = Some(d),
Err(_) => return,
}
}
let frame_size = 48 * MAX_PACKET_MS;
let mut pcm = vec![0.0f32; frame_size * channels];
let ceiling = data.len() + 16;
let mut packets = 0usize;
while let Ok(Some(pkt)) = reader.read_packet() {
packets += 1;
assert!(
packets <= ceiling,
"the reader produced {packets} packets from {} bytes of input",
data.len()
);
let produced = match (mono.as_mut(), multi.as_mut()) {
(Some(d), _) => d.decode(&pkt.data, frame_size, &mut pcm),
(_, Some(d)) => d.decode(&pkt.data, frame_size, &mut pcm),
_ => unreachable!("one of the two decoders was built above"),
};
let Ok(n) = produced else { continue };
assert!(
n <= frame_size,
"decode reported {n} samples into a buffer holding {frame_size}"
);
assert!(
pcm[..n * channels].iter().all(|s| s.is_finite()),
"a packet from the container decoded to a non-finite sample"
);
}
}
fn reseal_pages(data: &[u8]) -> Vec<u8> {
let mut out = data.to_vec();
let mut i = 0usize;
while i + 27 <= out.len() {
if &out[i..i + 4] != b"OggS" {
i += 1;
continue;
}
let segments = out[i + 26] as usize;
let table = i + 27;
if table + segments > out.len() {
break;
}
let payload: usize = out[table..table + segments]
.iter()
.map(|&b| b as usize)
.sum();
let Some(end) = table
.checked_add(segments)
.and_then(|t| t.checked_add(payload))
else {
break;
};
if end > out.len() {
break;
}
out[i + 22..i + 26].fill(0);
let crc = ogg_crc32(&out[i..end]);
out[i + 22..i + 26].copy_from_slice(&crc.to_le_bytes());
i = end;
}
out
}
fn ogg_crc32(data: &[u8]) -> u32 {
const POLY: u32 = 0x04c1_1db7;
let mut crc: u32 = 0;
for &b in data {
crc ^= (b as u32) << 24;
for _ in 0..8 {
crc = if crc & 0x8000_0000 != 0 {
(crc << 1) ^ POLY
} else {
crc << 1
};
}
}
crc
}
pub fn packet_shape(data: &[u8]) {
for rate in [8_000, 12_000, 16_000, 24_000, 48_000] {
if let Ok(n) = packet::samples(data, rate) {
let longest = MAX_PACKET_MS * rate as usize / 1000;
assert!(n <= longest, "packet claims {n} samples, past {longest}");
assert!(
packet::frame_count(data).is_ok(),
"a packet with a readable duration had an unreadable frame count"
);
assert!(
packet::channels(data).is_ok(),
"a packet with a readable duration had an unreadable channel count"
);
}
}
if let Ok(mut ms) = OpusMSDecoder::new(48_000, 3, 1) {
let mut out = vec![0.0f32; 48 * MAX_PACKET_MS * 3];
if let Ok(n) = ms.decode(data, 48 * MAX_PACKET_MS, &mut out) {
assert!(
out[..n * 3].iter().all(|s| s.is_finite()),
"a multistream decode accepted a packet and produced a non-finite sample"
);
}
}
let mut rp = repacketizer::Repacketizer::new();
if rp.cat(data).is_ok() {
if let Ok(out) = rp.out() {
assert!(
packet::frame_count(&out).is_ok(),
"the repacketizer emitted a packet it cannot itself read"
);
}
let _ = rp.out_self_delimited();
let _ = rp.out_range(0, rp.nb_frames());
}
let _ = repacketizer::unpad_packet(data);
let mut padded = data.to_vec();
let target = data.len() + 7;
if repacketizer::pad_packet(&mut padded, target).is_ok() {
assert_eq!(padded.len(), target, "pad_packet did not reach its target");
}
}