Skip to main content

opus_rs/silk/
shell_coder.rs

1use 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}