use crate::range_coder::RangeCoder;
use crate::silk::tables::*;
#[inline]
fn combine_pulses(out: &mut [i32], input: &[i32], len: usize) {
for k in 0..len {
out[k] = input[2 * k] + input[2 * k + 1];
}
}
#[inline]
fn encode_split(ps_range_enc: &mut RangeCoder, p_child1: i32, p: i32, shell_table: &[u8]) {
if p > 0 {
ps_range_enc.encode_icdf(
p_child1,
&shell_table[SILK_SHELL_CODE_TABLE_OFFSETS[p as usize] as usize..],
8,
);
}
}
pub fn silk_shell_encoder(ps_range_enc: &mut RangeCoder, pulses0: &[i32]) {
let mut pulses1 = [0i32; 8];
let mut pulses2 = [0i32; 4];
let mut pulses3 = [0i32; 2];
let mut pulses4 = [0i32; 1];
combine_pulses(&mut pulses1, pulses0, 8);
combine_pulses(&mut pulses2, &pulses1, 4);
combine_pulses(&mut pulses3, &pulses2, 2);
combine_pulses(&mut pulses4, &pulses3, 1);
encode_split(
ps_range_enc,
pulses3[0],
pulses4[0],
&SILK_SHELL_CODE_TABLE3,
);
encode_split(
ps_range_enc,
pulses2[0],
pulses3[0],
&SILK_SHELL_CODE_TABLE2,
);
encode_split(
ps_range_enc,
pulses1[0],
pulses2[0],
&SILK_SHELL_CODE_TABLE1,
);
encode_split(
ps_range_enc,
pulses0[0],
pulses1[0],
&SILK_SHELL_CODE_TABLE0,
);
encode_split(
ps_range_enc,
pulses0[2],
pulses1[1],
&SILK_SHELL_CODE_TABLE0,
);
encode_split(
ps_range_enc,
pulses1[2],
pulses2[1],
&SILK_SHELL_CODE_TABLE1,
);
encode_split(
ps_range_enc,
pulses0[4],
pulses1[2],
&SILK_SHELL_CODE_TABLE0,
);
encode_split(
ps_range_enc,
pulses0[6],
pulses1[3],
&SILK_SHELL_CODE_TABLE0,
);
encode_split(
ps_range_enc,
pulses2[2],
pulses3[1],
&SILK_SHELL_CODE_TABLE2,
);
encode_split(
ps_range_enc,
pulses1[4],
pulses2[2],
&SILK_SHELL_CODE_TABLE1,
);
encode_split(
ps_range_enc,
pulses0[8],
pulses1[4],
&SILK_SHELL_CODE_TABLE0,
);
encode_split(
ps_range_enc,
pulses0[10],
pulses1[5],
&SILK_SHELL_CODE_TABLE0,
);
encode_split(
ps_range_enc,
pulses1[6],
pulses2[3],
&SILK_SHELL_CODE_TABLE1,
);
encode_split(
ps_range_enc,
pulses0[12],
pulses1[6],
&SILK_SHELL_CODE_TABLE0,
);
encode_split(
ps_range_enc,
pulses0[14],
pulses1[7],
&SILK_SHELL_CODE_TABLE0,
);
}