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}