1use crate::silk::define::*;
2
3#[derive(Clone)]
4pub struct SilkStereoState {
5 pub s_mid: [i16; 2],
6
7 pub s_side: [i16; 2],
8
9 pub left: i16,
10
11 pub side: Vec<i16>,
12}
13
14impl Default for SilkStereoState {
15 fn default() -> Self {
16 Self {
17 s_mid: [0; 2],
18 s_side: [0; 2],
19 left: 0,
20 side: Vec::new(),
21 }
22 }
23}
24
25#[derive(Clone, Copy)]
26pub struct NLSFCodebook {
27 pub n_vectors: i16,
28 pub order: i16,
29 pub quant_step_size_q16: i32,
30 pub inv_quant_step_size_q6: i16,
31 pub cb1_nlsf_q8: &'static [u8],
32 pub cb1_wght_q9: &'static [i16],
33 pub cb1_icdf: &'static [u8],
34 pub pred_q8: &'static [u8],
35 pub ec_sel: &'static [u8],
36 pub ec_icdf: &'static [u8],
37 pub ec_rates_q5: &'static [u8],
38 pub delta_min_q15: &'static [i16],
39}
40
41#[derive(Clone, Copy)]
42pub struct SideInfoIndices {
43 pub gains_indices: [i8; MAX_NB_SUBFR],
44 pub ltp_index: [i8; MAX_NB_SUBFR],
45 pub nlsf_indices: [i8; MAX_LPC_ORDER + 1],
46 pub lag_index: i16,
47 pub contour_index: i8,
48 pub signal_type: i8,
49 pub voicing_idx: i8,
50 pub quant_offset_type: i8,
51 pub nlsf_interp_coef_q2: i8,
52 pub per_index: i8,
53 pub ltp_scale_index: i8,
54 pub seed: i8,
55
56 pub pred_idx: i8,
57
58 pub side_idx: i8,
59
60 pub only_middle: i8,
61}
62
63impl Default for SideInfoIndices {
64 fn default() -> Self {
65 Self {
66 gains_indices: [0; MAX_NB_SUBFR],
67 ltp_index: [0; MAX_NB_SUBFR],
68 nlsf_indices: [0; MAX_LPC_ORDER + 1],
69 lag_index: 0,
70 contour_index: 0,
71 signal_type: 0,
72 voicing_idx: 0,
73 quant_offset_type: 0,
74 nlsf_interp_coef_q2: 4,
75 per_index: 0,
76 ltp_scale_index: 0,
77 seed: 0,
78 pred_idx: 0,
79 side_idx: 0,
80 only_middle: 0,
81 }
82 }
83}
84
85#[derive(Clone, Copy, Default)]
86pub struct SilkShapeState {
87 pub last_gain_index: i8,
88 pub harm_boost_smth_q16: i32,
89 pub harm_shape_gain_smth_q16: i32,
90 pub tilt_smth_q16: i32,
91}
92
93#[derive(Clone, Copy)]
94pub struct SilkVADState {
95 pub ana_state: [i32; 2],
96 pub ana_state1: [i32; 2],
97 pub ana_state2: [i32; 2],
98 pub xnrg_subfr: [i32; VAD_N_BANDS],
99 pub nrg_ratio_smth_q8: [i32; VAD_N_BANDS],
100 pub hp_state: i16,
101 pub nl: [i32; VAD_N_BANDS],
102 pub inv_nl: [i32; VAD_N_BANDS],
103 pub noise_level_bias: [i32; VAD_N_BANDS],
104 pub counter: i32,
105}
106
107impl Default for SilkVADState {
108 fn default() -> Self {
109 Self {
110 ana_state: [0; 2],
111 ana_state1: [0; 2],
112 ana_state2: [0; 2],
113 xnrg_subfr: [0; VAD_N_BANDS],
114 nrg_ratio_smth_q8: [0; VAD_N_BANDS],
115 hp_state: 0,
116 nl: [0; VAD_N_BANDS],
117 inv_nl: [0; VAD_N_BANDS],
118 noise_level_bias: [0; VAD_N_BANDS],
119 counter: 0,
120 }
121 }
122}
123
124#[derive(Clone, Copy, Default)]
125pub struct SilkLPState {
126 pub in_lp_state: [i32; 2],
127 pub transition_frame_no: i32,
128 pub mode: i32,
129 pub saved_fs_khz: i32,
130}
131
132pub struct SilkEncoderStateCommon {
133 pub indices: SideInfoIndices,
134 pub in_hp_state: [i32; 2],
135 pub snr_db_q7: i32,
136 pub input_quality_bands_q15: [i32; VAD_N_BANDS],
137 pub speech_activity_q8: i32,
138 pub use_cbr: i32,
139 pub fs_khz: i32,
140 pub nb_subfr: i32,
141 pub warping_q16: i32,
142 pub la_shape: i32,
143 pub shape_win_length: i32,
144 pub shaping_lpc_order: i32,
145 pub predict_lpc_order: i32,
146 pub subfr_length: i32,
147 pub la_pitch: i32,
148 pub frame_length: i32,
149 pub ltp_mem_length: i32,
150 pub pitch_lpc_win_length: i32,
151 pub pitch_estimation_complexity: i32,
152 pub pitch_estimation_threshold_q16: i32,
153 pub first_frame_after_reset: i32,
154 pub prev_signal_type: i32,
155 pub input_tilt_q15: i32,
156 pub n_states_delayed_decision: i32,
157 pub prev_lag: i32,
158 pub x_buf: [i16; 2 * MAX_FRAME_LENGTH + LA_SHAPE_MAX],
159 pub x_buf_idx: i32,
160 pub prev_nlsf_q15: [i16; MAX_LPC_ORDER],
161 pub nlsf_mu_q20: i32,
162 pub n_nlsf_survivors: i32,
163 pub variable_hp_smth1_q15: i32,
164 pub variable_hp_smth2_q15: i32,
165 pub s_lp: SilkLPState,
166 pub s_vad: SilkVADState,
167 pub lbrr_enabled: i32,
168 pub indices_lbrr: [SideInfoIndices; MAX_FRAMES_PER_PACKET],
169 pub pulses_lbrr: [[i8; MAX_FRAME_LENGTH]; MAX_FRAMES_PER_PACKET],
170 pub n_frames_encoded: i32,
171 pub n_frames_per_packet: i32,
172 pub target_rate_bps: i32,
173 pub packet_size_ms: i32,
174 pub complexity: i32,
175 pub sum_log_gain_q7: i32,
176 pub packet_loss_perc: i32,
177 pub lbrr_flag: i8,
178 pub no_speech_counter: i32,
179 pub in_dtx: i32,
180 pub vad_flags: [i32; MAX_FRAMES_PER_PACKET],
181
182 pub frame_counter: i32,
183 pub ec_prev_signal_type: i32,
184 pub ec_prev_lag_index: i16,
185 pub frames_since_onset: i32,
186 pub input_buf: [i16; MAX_FRAME_LENGTH + 2],
187 pub input_buf_ix: i32,
188 pub controlled_since_last_payload: i32,
189 pub use_interpolated_nlsfs: i32,
190 pub use_dtx: i32,
191 pub use_in_band_fec: i32,
192 pub lbrr_gain_increases: i32,
193 pub lbrr_flags: [i32; MAX_FRAMES_PER_PACKET],
194 pub prefill_flag: i32,
195
196 pub n_channels: i32,
197}
198
199impl Default for SilkEncoderStateCommon {
200 fn default() -> Self {
201 Self {
202 indices: SideInfoIndices::default(),
203 in_hp_state: [0; 2],
204 snr_db_q7: 0,
205 input_quality_bands_q15: [0; VAD_N_BANDS],
206 speech_activity_q8: 0,
207 use_cbr: 0,
208 fs_khz: 0,
209 nb_subfr: 0,
210 warping_q16: 0,
211 la_shape: 0,
212 shape_win_length: 0,
213 shaping_lpc_order: 0,
214 predict_lpc_order: 0,
215 subfr_length: 0,
216 la_pitch: 0,
217 frame_length: 0,
218 ltp_mem_length: 0,
219 pitch_lpc_win_length: 0,
220 pitch_estimation_complexity: 0,
221 pitch_estimation_threshold_q16: 0,
222 first_frame_after_reset: 0,
223 prev_signal_type: 0,
224 input_tilt_q15: 0,
225 n_states_delayed_decision: 0,
226 prev_lag: 0,
227 x_buf: [0; 2 * MAX_FRAME_LENGTH + LA_SHAPE_MAX],
228 x_buf_idx: 0,
229 prev_nlsf_q15: [0; MAX_LPC_ORDER],
230 nlsf_mu_q20: 0,
231 n_nlsf_survivors: 0,
232 variable_hp_smth1_q15: 0,
233 variable_hp_smth2_q15: 0,
234 s_lp: SilkLPState::default(),
235 s_vad: SilkVADState::default(),
236 lbrr_enabled: 0,
237 indices_lbrr: [SideInfoIndices::default(); MAX_FRAMES_PER_PACKET],
238 pulses_lbrr: [[0; MAX_FRAME_LENGTH]; MAX_FRAMES_PER_PACKET],
239 n_frames_encoded: 0,
240 n_frames_per_packet: 0,
241 target_rate_bps: 0,
242 packet_size_ms: 0,
243 complexity: 0,
244 sum_log_gain_q7: 0,
245 packet_loss_perc: 0,
246 lbrr_flag: 0,
247 no_speech_counter: 0,
248 in_dtx: 0,
249 vad_flags: [0; MAX_FRAMES_PER_PACKET],
250 frame_counter: 0,
251 ec_prev_signal_type: 0,
252 ec_prev_lag_index: 0,
253 frames_since_onset: 0,
254 input_buf: [0; MAX_FRAME_LENGTH + 2],
255 input_buf_ix: 0,
256 controlled_since_last_payload: 0,
257 use_interpolated_nlsfs: 0,
258 use_dtx: 0,
259 use_in_band_fec: 0,
260 lbrr_gain_increases: 0,
261 lbrr_flags: [0; MAX_FRAMES_PER_PACKET],
262 prefill_flag: 0,
263 n_channels: 1,
264 }
265 }
266}
267
268pub struct SilkEncoderState {
269 pub s_cmn: SilkEncoderStateCommon,
270 pub s_shape: SilkShapeState,
271 pub pulses: [i8; MAX_FRAME_LENGTH],
272 pub s_nsq: SilkNSQState,
273 pub ltp_corr_q15: i32,
274 pub res_nrg_smth: i32,
275 pub pitch_estimation_lpc_order: i32,
276 pub ps_nlsf_cb: Option<&'static NLSFCodebook>,
277
278 pub stereo: SilkStereoState,
279
280 pub resampler_delay_buf: [i16; 48],
281}
282
283impl Default for SilkEncoderState {
284 fn default() -> Self {
285 Self {
286 s_cmn: SilkEncoderStateCommon::default(),
287 s_shape: SilkShapeState::default(),
288 pulses: [0; MAX_FRAME_LENGTH],
289 s_nsq: SilkNSQState::default(),
290 ltp_corr_q15: 0,
291 res_nrg_smth: 0,
292 pitch_estimation_lpc_order: 0,
293 ps_nlsf_cb: None,
294 stereo: SilkStereoState::default(),
295 resampler_delay_buf: [0; 48],
296 }
297 }
298}
299
300#[derive(Clone, Copy)]
301pub struct SilkNSQState {
302 pub xq: [i16; 2 * MAX_FRAME_LENGTH],
303 pub s_ltp_shp_q14: [i32; 2 * MAX_FRAME_LENGTH],
304 pub s_lpc_q14: [i32; MAX_SUB_FRAME_LENGTH + NSQ_LPC_BUF_LENGTH],
305 pub s_ar2_q14: [i32; MAX_SHAPE_LPC_ORDER],
306 pub s_lf_ar_q14: i32,
307 pub s_diff_shp_q14: i32,
308 pub lag_prev: i32,
309 pub s_ltp_buf_idx: i32,
310 pub s_ltp_shp_buf_idx: i32,
311 pub rand_seed: i32,
312 pub prev_gain_q16: i32,
313 pub rewhite_flag: i32,
314 pub prev_sig_type: i8,
315}
316
317impl Default for SilkNSQState {
318 fn default() -> Self {
319 Self {
320 xq: [0; 2 * MAX_FRAME_LENGTH],
321 s_ltp_shp_q14: [0; 2 * MAX_FRAME_LENGTH],
322 s_lpc_q14: [0; MAX_SUB_FRAME_LENGTH + NSQ_LPC_BUF_LENGTH],
323 s_ar2_q14: [0; MAX_SHAPE_LPC_ORDER],
324 s_lf_ar_q14: 0,
325 s_diff_shp_q14: 0,
326 lag_prev: 0,
327 s_ltp_buf_idx: 0,
328 s_ltp_shp_buf_idx: 0,
329 rand_seed: 0,
330 prev_gain_q16: 0,
331 rewhite_flag: 0,
332 prev_sig_type: 0,
333 }
334 }
335}
336
337#[derive(Clone, Copy)]
338pub struct SilkEncoderControl {
339 pub input_quality_q14: i32,
340 pub coding_quality_q14: i32,
341 pub pitch_l: [i32; MAX_NB_SUBFR],
342 pub gains_q16: [i32; MAX_NB_SUBFR],
343 pub gains_unq_q16: [i32; MAX_NB_SUBFR],
344 pub pred_coef_q12: [[i16; MAX_LPC_ORDER]; 2],
345 pub ltp_coef_q14: [i16; MAX_NB_SUBFR * LTP_ORDER],
346 pub ltp_scale_q14: i32,
347 pub ar_q13: [i16; MAX_NB_SUBFR * MAX_SHAPE_LPC_ORDER],
348 pub lf_shp_q14: [i32; MAX_NB_SUBFR],
349 pub tilt_q14: [i32; MAX_NB_SUBFR],
350 pub harm_shape_gain_q14: [i32; MAX_NB_SUBFR],
351 pub lambda_q10: i32,
352 pub pred_gain_q16: i32,
353 pub ltp_red_cod_gain_q7: i32,
354 pub res_nrg: [i32; MAX_NB_SUBFR],
355 pub res_nrg_q: [i32; MAX_NB_SUBFR],
356 pub last_gain_index_prev: i8,
357}
358
359impl Default for SilkEncoderControl {
360 fn default() -> Self {
361 Self {
362 input_quality_q14: 0,
363 coding_quality_q14: 0,
364 pitch_l: [0; MAX_NB_SUBFR],
365 gains_q16: [0; MAX_NB_SUBFR],
366 gains_unq_q16: [0; MAX_NB_SUBFR],
367 pred_coef_q12: [[0; MAX_LPC_ORDER]; 2],
368 ltp_coef_q14: [0; MAX_NB_SUBFR * LTP_ORDER],
369 ltp_scale_q14: 0,
370 ar_q13: [0; MAX_NB_SUBFR * MAX_SHAPE_LPC_ORDER],
371 lf_shp_q14: [0; MAX_NB_SUBFR],
372 tilt_q14: [0; MAX_NB_SUBFR],
373 harm_shape_gain_q14: [0; MAX_NB_SUBFR],
374 lambda_q10: 0,
375 pred_gain_q16: 0,
376 ltp_red_cod_gain_q7: 0,
377 res_nrg: [0; MAX_NB_SUBFR],
378 res_nrg_q: [0; MAX_NB_SUBFR],
379 last_gain_index_prev: 0,
380 }
381 }
382}