Skip to main content

opus_rs/silk/
structs.rs

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}