Skip to main content

opus_rs/silk/
decoder_structs.rs

1use crate::silk::define::*;
2use crate::silk::structs::{NLSFCodebook, SideInfoIndices};
3
4#[derive(Clone)]
5pub struct SilkCNGState {
6    pub cng_exc_buf_q14: [i32; MAX_FRAME_LENGTH],
7    pub cng_smth_nlsf_q15: [i16; MAX_LPC_ORDER],
8    pub cng_synth_state: [i32; MAX_LPC_ORDER],
9    pub cng_smth_gain_q16: i32,
10    pub rand_seed: i32,
11    pub fs_khz: i32,
12}
13
14impl Default for SilkCNGState {
15    fn default() -> Self {
16        Self {
17            cng_exc_buf_q14: [0; MAX_FRAME_LENGTH],
18            cng_smth_nlsf_q15: [0; MAX_LPC_ORDER],
19            cng_synth_state: [0; MAX_LPC_ORDER],
20            cng_smth_gain_q16: 0,
21            rand_seed: 0,
22            fs_khz: 0,
23        }
24    }
25}
26
27#[derive(Clone, Default)]
28pub struct SilkPLCState {
29    pub pitch_l_q8: i32,
30    pub ltp_coef_q14: [i16; LTP_ORDER],
31    pub prev_lpc_q12: [i16; MAX_LPC_ORDER],
32    pub last_frame_lost: i32,
33    pub rand_seed: i32,
34    pub rand_scale_q14: i16,
35    pub conc_energy: i32,
36    pub conc_energy_shift: i32,
37    pub prev_ltp_scale_q14: i16,
38    pub prev_gain_q16: [i32; 2],
39    pub fs_khz: i32,
40    pub nb_subfr: i32,
41    pub subfr_length: i32,
42    pub enable_deep_plc: i32,
43}
44
45#[derive(Clone)]
46pub struct SilkDecoderState {
47    pub prev_gain_q16: i32,
48    pub exc_q14: [i32; MAX_FRAME_LENGTH],
49    pub s_lpc_q14_buf: [i32; MAX_LPC_ORDER],
50    pub out_buf: [i16; MAX_FRAME_LENGTH + 2 * MAX_SUB_FRAME_LENGTH],
51    pub lag_prev: i32,
52    pub last_gain_index: i8,
53    pub fs_khz: i32,
54    pub fs_api_hz: i32,
55    pub nb_subfr: i32,
56    pub frame_length: i32,
57    pub subfr_length: i32,
58    pub ltp_mem_length: i32,
59    pub lpc_order: i32,
60    pub prev_nlsf_q15: [i16; MAX_LPC_ORDER],
61    pub first_frame_after_reset: i32,
62    pub pitch_lag_low_bits_icdf: &'static [u8],
63    pub pitch_contour_icdf: &'static [u8],
64    pub n_frames_decoded: i32,
65    pub n_frames_per_packet: i32,
66    pub ec_prev_signal_type: i32,
67    pub ec_prev_lag_index: i16,
68    pub vad_flags: [i32; MAX_FRAMES_PER_PACKET],
69    pub lbrr_flag: i32,
70    pub lbrr_flags: [i32; MAX_FRAMES_PER_PACKET],
71    pub ps_nlsf_cb: Option<&'static NLSFCodebook>,
72    pub indices: SideInfoIndices,
73    pub s_cng: SilkCNGState,
74    pub loss_cnt: i32,
75    pub prev_signal_type: i32,
76    pub s_plc: SilkPLCState,
77}
78
79impl Default for SilkDecoderState {
80    fn default() -> Self {
81        Self {
82            prev_gain_q16: 0,
83            exc_q14: [0; MAX_FRAME_LENGTH],
84            s_lpc_q14_buf: [0; MAX_LPC_ORDER],
85            out_buf: [0; MAX_FRAME_LENGTH + 2 * MAX_SUB_FRAME_LENGTH],
86            lag_prev: 100,
87            last_gain_index: 10,
88            fs_khz: 0,
89            fs_api_hz: 0,
90            nb_subfr: 0,
91            frame_length: 0,
92            subfr_length: 0,
93            ltp_mem_length: 0,
94            lpc_order: 0,
95            prev_nlsf_q15: [0; MAX_LPC_ORDER],
96            first_frame_after_reset: 1,
97            pitch_lag_low_bits_icdf: &crate::silk::tables::SILK_UNIFORM4_ICDF,
98            pitch_contour_icdf: &crate::silk::tables::SILK_PITCH_CONTOUR_ICDF,
99            n_frames_decoded: 0,
100            n_frames_per_packet: 0,
101            ec_prev_signal_type: 0,
102            ec_prev_lag_index: 0,
103            vad_flags: [0; MAX_FRAMES_PER_PACKET],
104            lbrr_flag: 0,
105            lbrr_flags: [0; MAX_FRAMES_PER_PACKET],
106            ps_nlsf_cb: None,
107            indices: SideInfoIndices::default(),
108            s_cng: SilkCNGState::default(),
109            loss_cnt: 0,
110            prev_signal_type: TYPE_NO_VOICE_ACTIVITY,
111            s_plc: SilkPLCState::default(),
112        }
113    }
114}
115
116#[derive(Clone, Default)]
117pub struct SilkDecoderControl {
118    pub pitch_l: [i32; MAX_NB_SUBFR],
119    pub gains_q16: [i32; MAX_NB_SUBFR],
120    pub pred_coef_q12: [[i16; MAX_LPC_ORDER]; 2],
121    pub ltp_coef_q14: [i16; LTP_ORDER * MAX_NB_SUBFR],
122    pub ltp_scale_q14: i32,
123}
124
125impl SilkDecoderControl {
126    pub fn new() -> Self {
127        Self {
128            pitch_l: [0; MAX_NB_SUBFR],
129            gains_q16: [0; MAX_NB_SUBFR],
130            pred_coef_q12: [[0; MAX_LPC_ORDER]; 2],
131            ltp_coef_q14: [0; LTP_ORDER * MAX_NB_SUBFR],
132            ltp_scale_q14: 0,
133        }
134    }
135}