Skip to main content

opus_rs/silk/
structs.rs

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}