use oxideav_celt::range_decoder::RangeDecoder;
use oxideav_core::Result;
use crate::silk::shell;
#[doc(hidden)]
pub const MAG_NIBBLE_ICDF: [u8; 16] = [
240, 224, 208, 192, 176, 160, 144, 128, 112, 96, 80, 64, 48, 32, 16, 0,
];
pub fn decode_excitation(
rc: &mut RangeDecoder<'_>,
frame_len: usize,
_subframe_len: usize,
signal_type: u8,
quant_offset_type: u8,
seed: u32,
) -> Result<Vec<f32>> {
let aligned = frame_len.div_ceil(16) * 16;
let mut out = shell::decode_excitation(rc, aligned, signal_type, quant_offset_type, seed);
out.truncate(frame_len);
Ok(out)
}
#[cfg(test)]
mod tests {
use super::*;
use oxideav_celt::range_encoder::RangeEncoder;
#[test]
fn magnitude_nibble_roundtrip() {
for v in 0..16 {
let mut enc = RangeEncoder::new(8);
enc.encode_icdf(v, &MAG_NIBBLE_ICDF, 8);
let buf = enc.done().unwrap();
let mut dec = RangeDecoder::new(&buf);
let got = dec.decode_icdf(&MAG_NIBBLE_ICDF, 8);
assert_eq!(got, v);
}
}
}