Skip to main content

rusty_opus/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    /// Float noise-shaping smoothing state, used only by the float SILK
81    /// analysis path (`silk::flp`). Mirrors `silk_shape_state_FLP`.
82    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    /// Normalized pitch correlation carried across frames by the float SILK
276    /// analysis path (`psEnc->LTPCorr` in `silk_encoder_state_FLP`).
277    pub flp_ltp_corr: f32,
278    /// When set, the encoder runs the float SILK analysis (`silk::flp`) in
279    /// place of the fixed-point analysis. The NSQ stays fixed-point.
280    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}