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}
81
82#[derive(Clone, Copy)]
83pub struct SilkVADState {
84 pub ana_state: [i32; 2],
85 pub ana_state1: [i32; 2],
86 pub ana_state2: [i32; 2],
87 pub xnrg_subfr: [i32; VAD_N_BANDS],
88 pub nrg_ratio_smth_q8: [i32; VAD_N_BANDS],
89 pub hp_state: i16,
90 pub nl: [i32; VAD_N_BANDS],
91 pub inv_nl: [i32; VAD_N_BANDS],
92 pub noise_level_bias: [i32; VAD_N_BANDS],
93 pub counter: i32,
94}
95
96impl Default for SilkVADState {
97 fn default() -> Self {
98 Self {
99 ana_state: [0; 2],
100 ana_state1: [0; 2],
101 ana_state2: [0; 2],
102 xnrg_subfr: [0; VAD_N_BANDS],
103 nrg_ratio_smth_q8: [0; VAD_N_BANDS],
104 hp_state: 0,
105 nl: [0; VAD_N_BANDS],
106 inv_nl: [0; VAD_N_BANDS],
107 noise_level_bias: [0; VAD_N_BANDS],
108 counter: 0,
109 }
110 }
111}
112
113#[derive(Clone, Copy, Default)]
114pub struct SilkLPState {
115 pub in_lp_state: [i32; 2],
116 pub transition_frame_no: i32,
117 pub mode: i32,
118 pub saved_fs_khz: i32,
119}
120
121pub struct SilkEncoderStateCommon {
122 pub indices: SideInfoIndices,
123 pub in_hp_state: [i32; 2],
124 pub snr_db_q7: i32,
125 pub input_quality_bands_q15: [i32; VAD_N_BANDS],
126 pub speech_activity_q8: i32,
127 pub use_cbr: i32,
128 pub fs_khz: i32,
129 pub nb_subfr: i32,
130 pub warping_q16: i32,
131 pub la_shape: i32,
132 pub shape_win_length: i32,
133 pub shaping_lpc_order: i32,
134 pub predict_lpc_order: i32,
135 pub subfr_length: i32,
136 pub la_pitch: i32,
137 pub frame_length: i32,
138 pub ltp_mem_length: i32,
139 pub pitch_lpc_win_length: i32,
140 pub pitch_estimation_complexity: i32,
141 pub pitch_estimation_threshold_q16: i32,
142 pub first_frame_after_reset: i32,
143 pub prev_signal_type: i32,
144 pub input_tilt_q15: i32,
145 pub n_states_delayed_decision: i32,
146 pub prev_lag: i32,
147 pub x_buf: [i16; 2 * MAX_FRAME_LENGTH + LA_SHAPE_MAX],
148 pub x_buf_idx: i32,
149 pub prev_nlsf_q15: [i16; MAX_LPC_ORDER],
150 pub nlsf_mu_q20: i32,
151 pub n_nlsf_survivors: i32,
152 pub variable_hp_smth1_q15: i32,
153 pub variable_hp_smth2_q15: i32,
154 pub s_lp: SilkLPState,
155 pub s_vad: SilkVADState,
156 pub lbrr_enabled: i32,
157 pub indices_lbrr: [SideInfoIndices; MAX_FRAMES_PER_PACKET],
158 pub pulses_lbrr: [[i8; MAX_FRAME_LENGTH]; MAX_FRAMES_PER_PACKET],
159 pub n_frames_encoded: i32,
160 pub n_frames_per_packet: i32,
161 pub target_rate_bps: i32,
162 pub packet_size_ms: i32,
163 pub complexity: i32,
164 pub sum_log_gain_q7: i32,
165 pub packet_loss_perc: i32,
166 pub lbrr_flag: i8,
167 pub no_speech_counter: i32,
168 pub in_dtx: i32,
169 pub vad_flags: [i32; MAX_FRAMES_PER_PACKET],
170
171 pub frame_counter: i32,
172 pub ec_prev_signal_type: i32,
173 pub ec_prev_lag_index: i16,
174 pub frames_since_onset: i32,
175 pub input_buf: [i16; MAX_FRAME_LENGTH + 2],
176 pub input_buf_ix: i32,
177 pub controlled_since_last_payload: i32,
178 pub use_interpolated_nlsfs: i32,
179 pub use_dtx: i32,
180 pub use_in_band_fec: i32,
181 pub lbrr_gain_increases: i32,
182 pub lbrr_flags: [i32; MAX_FRAMES_PER_PACKET],
183 pub prefill_flag: i32,
184
185 pub n_channels: i32,
186}
187
188impl Default for SilkEncoderStateCommon {
189 fn default() -> Self {
190 Self {
191 indices: SideInfoIndices::default(),
192 in_hp_state: [0; 2],
193 snr_db_q7: 0,
194 input_quality_bands_q15: [0; VAD_N_BANDS],
195 speech_activity_q8: 0,
196 use_cbr: 0,
197 fs_khz: 0,
198 nb_subfr: 0,
199 warping_q16: 0,
200 la_shape: 0,
201 shape_win_length: 0,
202 shaping_lpc_order: 0,
203 predict_lpc_order: 0,
204 subfr_length: 0,
205 la_pitch: 0,
206 frame_length: 0,
207 ltp_mem_length: 0,
208 pitch_lpc_win_length: 0,
209 pitch_estimation_complexity: 0,
210 pitch_estimation_threshold_q16: 0,
211 first_frame_after_reset: 0,
212 prev_signal_type: 0,
213 input_tilt_q15: 0,
214 n_states_delayed_decision: 0,
215 prev_lag: 0,
216 x_buf: [0; 2 * MAX_FRAME_LENGTH + LA_SHAPE_MAX],
217 x_buf_idx: 0,
218 prev_nlsf_q15: [0; MAX_LPC_ORDER],
219 nlsf_mu_q20: 0,
220 n_nlsf_survivors: 0,
221 variable_hp_smth1_q15: 0,
222 variable_hp_smth2_q15: 0,
223 s_lp: SilkLPState::default(),
224 s_vad: SilkVADState::default(),
225 lbrr_enabled: 0,
226 indices_lbrr: [SideInfoIndices::default(); MAX_FRAMES_PER_PACKET],
227 pulses_lbrr: [[0; MAX_FRAME_LENGTH]; MAX_FRAMES_PER_PACKET],
228 n_frames_encoded: 0,
229 n_frames_per_packet: 0,
230 target_rate_bps: 0,
231 packet_size_ms: 0,
232 complexity: 0,
233 sum_log_gain_q7: 0,
234 packet_loss_perc: 0,
235 lbrr_flag: 0,
236 no_speech_counter: 0,
237 in_dtx: 0,
238 vad_flags: [0; MAX_FRAMES_PER_PACKET],
239 frame_counter: 0,
240 ec_prev_signal_type: 0,
241 ec_prev_lag_index: 0,
242 frames_since_onset: 0,
243 input_buf: [0; MAX_FRAME_LENGTH + 2],
244 input_buf_ix: 0,
245 controlled_since_last_payload: 0,
246 use_interpolated_nlsfs: 0,
247 use_dtx: 0,
248 use_in_band_fec: 0,
249 lbrr_gain_increases: 0,
250 lbrr_flags: [0; MAX_FRAMES_PER_PACKET],
251 prefill_flag: 0,
252 n_channels: 1,
253 }
254 }
255}
256
257pub struct SilkEncoderState {
258 pub s_cmn: SilkEncoderStateCommon,
259 pub s_shape: SilkShapeState,
260 pub pulses: [i8; MAX_FRAME_LENGTH],
261 pub s_nsq: SilkNSQState,
262 pub ltp_corr_q15: i32,
263 pub res_nrg_smth: i32,
264 pub pitch_estimation_lpc_order: i32,
265 pub ps_nlsf_cb: Option<&'static NLSFCodebook>,
266
267 pub stereo: SilkStereoState,
268
269 pub resampler_delay_buf: [i16; 48],
270}
271
272impl Default for SilkEncoderState {
273 fn default() -> Self {
274 Self {
275 s_cmn: SilkEncoderStateCommon::default(),
276 s_shape: SilkShapeState::default(),
277 pulses: [0; MAX_FRAME_LENGTH],
278 s_nsq: SilkNSQState::default(),
279 ltp_corr_q15: 0,
280 res_nrg_smth: 0,
281 pitch_estimation_lpc_order: 0,
282 ps_nlsf_cb: None,
283 stereo: SilkStereoState::default(),
284 resampler_delay_buf: [0; 48],
285 }
286 }
287}
288
289#[derive(Clone, Copy)]
290pub struct SilkNSQState {
291 pub xq: [i16; 2 * MAX_FRAME_LENGTH],
292 pub s_ltp_shp_q14: [i32; 2 * MAX_FRAME_LENGTH],
293 pub s_lpc_q14: [i32; MAX_SUB_FRAME_LENGTH + NSQ_LPC_BUF_LENGTH],
294 pub s_ar2_q14: [i32; MAX_SHAPE_LPC_ORDER],
295 pub s_lf_ar_q14: i32,
296 pub s_diff_shp_q14: i32,
297 pub lag_prev: i32,
298 pub s_ltp_buf_idx: i32,
299 pub s_ltp_shp_buf_idx: i32,
300 pub rand_seed: i32,
301 pub prev_gain_q16: i32,
302 pub rewhite_flag: i32,
303 pub prev_sig_type: i8,
304}
305
306impl Default for SilkNSQState {
307 fn default() -> Self {
308 Self {
309 xq: [0; 2 * MAX_FRAME_LENGTH],
310 s_ltp_shp_q14: [0; 2 * MAX_FRAME_LENGTH],
311 s_lpc_q14: [0; MAX_SUB_FRAME_LENGTH + NSQ_LPC_BUF_LENGTH],
312 s_ar2_q14: [0; MAX_SHAPE_LPC_ORDER],
313 s_lf_ar_q14: 0,
314 s_diff_shp_q14: 0,
315 lag_prev: 0,
316 s_ltp_buf_idx: 0,
317 s_ltp_shp_buf_idx: 0,
318 rand_seed: 0,
319 prev_gain_q16: 0,
320 rewhite_flag: 0,
321 prev_sig_type: 0,
322 }
323 }
324}
325
326#[derive(Clone, Copy)]
327pub struct SilkEncoderControl {
328 pub input_quality_q14: i32,
329 pub coding_quality_q14: i32,
330 pub pitch_l: [i32; MAX_NB_SUBFR],
331 pub gains_q16: [i32; MAX_NB_SUBFR],
332 pub gains_unq_q16: [i32; MAX_NB_SUBFR],
333 pub pred_coef_q12: [[i16; MAX_LPC_ORDER]; 2],
334 pub ltp_coef_q14: [i16; MAX_NB_SUBFR * LTP_ORDER],
335 pub ltp_scale_q14: i32,
336 pub ar_q13: [i16; MAX_NB_SUBFR * MAX_SHAPE_LPC_ORDER],
337 pub lf_shp_q14: [i32; MAX_NB_SUBFR],
338 pub tilt_q14: [i32; MAX_NB_SUBFR],
339 pub harm_shape_gain_q14: [i32; MAX_NB_SUBFR],
340 pub lambda_q10: i32,
341 pub pred_gain_q16: i32,
342 pub ltp_red_cod_gain_q7: i32,
343 pub res_nrg: [i32; MAX_NB_SUBFR],
344 pub res_nrg_q: [i32; MAX_NB_SUBFR],
345 pub last_gain_index_prev: i8,
346}
347
348impl Default for SilkEncoderControl {
349 fn default() -> Self {
350 Self {
351 input_quality_q14: 0,
352 coding_quality_q14: 0,
353 pitch_l: [0; MAX_NB_SUBFR],
354 gains_q16: [0; MAX_NB_SUBFR],
355 gains_unq_q16: [0; MAX_NB_SUBFR],
356 pred_coef_q12: [[0; MAX_LPC_ORDER]; 2],
357 ltp_coef_q14: [0; MAX_NB_SUBFR * LTP_ORDER],
358 ltp_scale_q14: 0,
359 ar_q13: [0; MAX_NB_SUBFR * MAX_SHAPE_LPC_ORDER],
360 lf_shp_q14: [0; MAX_NB_SUBFR],
361 tilt_q14: [0; MAX_NB_SUBFR],
362 harm_shape_gain_q14: [0; MAX_NB_SUBFR],
363 lambda_q10: 0,
364 pred_gain_q16: 0,
365 ltp_red_cod_gain_q7: 0,
366 res_nrg: [0; MAX_NB_SUBFR],
367 res_nrg_q: [0; MAX_NB_SUBFR],
368 last_gain_index_prev: 0,
369 }
370 }
371}