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