opus_rs/silk/
shell_coder.rs1use crate::range_coder::RangeCoder;
2use crate::silk::tables::*;
3
4#[inline]
5fn combine_pulses(out: &mut [i32], input: &[i32], len: usize) {
6 for k in 0..len {
7 out[k] = input[2 * k] + input[2 * k + 1];
8 }
9}
10
11#[inline]
12fn encode_split(ps_range_enc: &mut RangeCoder, p_child1: i32, p: i32, shell_table: &[u8]) {
13 if p > 0 {
14 ps_range_enc.encode_icdf(
15 p_child1,
16 &shell_table[SILK_SHELL_CODE_TABLE_OFFSETS[p as usize] as usize..],
17 8,
18 );
19 }
20}
21
22pub fn silk_shell_encoder(ps_range_enc: &mut RangeCoder, pulses0: &[i32]) {
23 let mut pulses1 = [0i32; 8];
24 let mut pulses2 = [0i32; 4];
25 let mut pulses3 = [0i32; 2];
26 let mut pulses4 = [0i32; 1];
27
28 combine_pulses(&mut pulses1, pulses0, 8);
29 combine_pulses(&mut pulses2, &pulses1, 4);
30 combine_pulses(&mut pulses3, &pulses2, 2);
31 combine_pulses(&mut pulses4, &pulses3, 1);
32
33 encode_split(
34 ps_range_enc,
35 pulses3[0],
36 pulses4[0],
37 &SILK_SHELL_CODE_TABLE3,
38 );
39
40 encode_split(
41 ps_range_enc,
42 pulses2[0],
43 pulses3[0],
44 &SILK_SHELL_CODE_TABLE2,
45 );
46
47 encode_split(
48 ps_range_enc,
49 pulses1[0],
50 pulses2[0],
51 &SILK_SHELL_CODE_TABLE1,
52 );
53 encode_split(
54 ps_range_enc,
55 pulses0[0],
56 pulses1[0],
57 &SILK_SHELL_CODE_TABLE0,
58 );
59 encode_split(
60 ps_range_enc,
61 pulses0[2],
62 pulses1[1],
63 &SILK_SHELL_CODE_TABLE0,
64 );
65
66 encode_split(
67 ps_range_enc,
68 pulses1[2],
69 pulses2[1],
70 &SILK_SHELL_CODE_TABLE1,
71 );
72 encode_split(
73 ps_range_enc,
74 pulses0[4],
75 pulses1[2],
76 &SILK_SHELL_CODE_TABLE0,
77 );
78 encode_split(
79 ps_range_enc,
80 pulses0[6],
81 pulses1[3],
82 &SILK_SHELL_CODE_TABLE0,
83 );
84
85 encode_split(
86 ps_range_enc,
87 pulses2[2],
88 pulses3[1],
89 &SILK_SHELL_CODE_TABLE2,
90 );
91
92 encode_split(
93 ps_range_enc,
94 pulses1[4],
95 pulses2[2],
96 &SILK_SHELL_CODE_TABLE1,
97 );
98 encode_split(
99 ps_range_enc,
100 pulses0[8],
101 pulses1[4],
102 &SILK_SHELL_CODE_TABLE0,
103 );
104 encode_split(
105 ps_range_enc,
106 pulses0[10],
107 pulses1[5],
108 &SILK_SHELL_CODE_TABLE0,
109 );
110
111 encode_split(
112 ps_range_enc,
113 pulses1[6],
114 pulses2[3],
115 &SILK_SHELL_CODE_TABLE1,
116 );
117 encode_split(
118 ps_range_enc,
119 pulses0[12],
120 pulses1[6],
121 &SILK_SHELL_CODE_TABLE0,
122 );
123 encode_split(
124 ps_range_enc,
125 pulses0[14],
126 pulses1[7],
127 &SILK_SHELL_CODE_TABLE0,
128 );
129}