Skip to content

Commit c94435f

Browse files
committed
refactor: make silk_decode_core safe
1 parent b499210 commit c94435f

30 files changed

+559
-709
lines changed

src/silk/CNG.rs

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,9 @@ use crate::externs::{memcpy, memmove, memset};
99
use crate::silk::define::{CNG_BUF_MASK_MAX, MAX_LPC_ORDER, TYPE_NO_VOICE_ACTIVITY};
1010
use crate::silk::structs::{silk_CNG_struct, silk_decoder_control, silk_decoder_state};
1111
use crate::silk::Inlines::silk_SQRT_APPROX;
12+
use crate::silk::SigProc_FIX::silk_RAND;
1213
use crate::silk::NLSF2A::silk_NLSF2A;
14+
1315
#[inline]
1416
unsafe fn silk_CNG_exc(exc_Q14: *mut i32, exc_buf_Q14: *mut i32, length: i32, rand_seed: *mut i32) {
1517
let mut seed: i32 = 0;
@@ -23,23 +25,22 @@ unsafe fn silk_CNG_exc(exc_Q14: *mut i32, exc_buf_Q14: *mut i32, length: i32, ra
2325
seed = *rand_seed;
2426
i = 0;
2527
while i < length {
26-
seed = 907633515_u32.wrapping_add((seed as u32).wrapping_mul(196314165)) as i32;
28+
seed = silk_RAND(seed);
2729
idx = seed >> 24 & exc_mask;
2830
*exc_Q14.offset(i as isize) = *exc_buf_Q14.offset(idx as isize);
2931
i += 1;
3032
}
3133
*rand_seed = seed;
3234
}
3335
pub fn silk_CNG_Reset(psDec: &mut silk_decoder_state) {
34-
let mut i: i32 = 0;
3536
let mut NLSF_step_Q15: i32 = 0;
3637
let mut NLSF_acc_Q15: i32 = 0;
37-
NLSF_step_Q15 = 0x7fff / (psDec.LPC_order + 1);
38+
NLSF_step_Q15 = 0x7fff / (psDec.LPC_order as i32 + 1);
3839
NLSF_acc_Q15 = 0;
39-
i = 0;
40+
let mut i = 0;
4041
while i < psDec.LPC_order {
4142
NLSF_acc_Q15 += NLSF_step_Q15;
42-
psDec.sCNG.CNG_smth_NLSF_Q15[i as usize] = NLSF_acc_Q15 as i16;
43+
psDec.sCNG.CNG_smth_NLSF_Q15[i] = NLSF_acc_Q15 as i16;
4344
i += 1;
4445
}
4546
psDec.sCNG.CNG_smth_Gain_Q16 = 0;
@@ -65,7 +66,7 @@ pub unsafe fn silk_CNG(
6566
}
6667
if psDec.lossCnt == 0 && psDec.prevSignalType == TYPE_NO_VOICE_ACTIVITY {
6768
i = 0;
68-
while i < psDec.LPC_order {
69+
while i < psDec.LPC_order as i32 {
6970
(*psCNG).CNG_smth_NLSF_Q15[i as usize] = ((*psCNG).CNG_smth_NLSF_Q15[i as usize] as i32
7071
+ ((psDec.prevNLSF_Q15[i as usize] as i32
7172
- (*psCNG).CNG_smth_NLSF_Q15[i as usize] as i32) as i64
@@ -76,7 +77,7 @@ pub unsafe fn silk_CNG(
7677
max_Gain_Q16 = 0;
7778
subfr = 0;
7879
i = 0;
79-
while i < psDec.nb_subfr {
80+
while i < psDec.nb_subfr as i32 {
8081
if (*psDecCtrl).Gains_Q16[i as usize] > max_Gain_Q16 {
8182
max_Gain_Q16 = (*psDecCtrl).Gains_Q16[i as usize];
8283
subfr = i;
@@ -96,12 +97,12 @@ pub unsafe fn silk_CNG(
9697
((*psCNG).CNG_exc_buf_Q14).as_mut_ptr() as *mut core::ffi::c_void,
9798
&mut *(psDec.exc_Q14)
9899
.as_mut_ptr()
99-
.offset((subfr * psDec.subfr_length) as isize) as *mut i32
100+
.offset((subfr * psDec.subfr_length as i32) as isize) as *mut i32
100101
as *const core::ffi::c_void,
101102
(psDec.subfr_length as u64).wrapping_mul(::core::mem::size_of::<i32>() as u64),
102103
);
103104
i = 0;
104-
while i < psDec.nb_subfr {
105+
while i < psDec.nb_subfr as i32 {
105106
(*psCNG).CNG_smth_Gain_Q16 += (((*psDecCtrl).Gains_Q16[i as usize]
106107
- (*psCNG).CNG_smth_Gain_Q16) as i64
107108
* 4634 as i64
@@ -145,7 +146,7 @@ pub unsafe fn silk_CNG(
145146
assert!(psDec.LPC_order == 10 || psDec.LPC_order == 16);
146147
i = 0;
147148
while i < length {
148-
LPC_pred_Q10 = psDec.LPC_order >> 1;
149+
LPC_pred_Q10 = psDec.LPC_order as i32 >> 1;
149150
LPC_pred_Q10 = (LPC_pred_Q10 as i64
150151
+ (*CNG_sig_Q14.as_mut_ptr().offset((16 + i - 1) as isize) as i64
151152
* A_Q12[0 as usize] as i64
@@ -214,7 +215,7 @@ pub unsafe fn silk_CNG(
214215
}
215216
*CNG_sig_Q14
216217
.as_mut_ptr()
217-
.offset((MAX_LPC_ORDER + i) as isize) =
218+
.offset((MAX_LPC_ORDER as i32 + i) as isize) =
218219
if (*CNG_sig_Q14.as_mut_ptr().offset((16 + i) as isize) as u32).wrapping_add(
219220
(((if 0x80000000 as u32 as i32 >> 4 > 0x7fffffff >> 4 {
220221
if LPC_pred_Q10 > 0x80000000 as u32 as i32 >> 4 {

src/silk/LPC_analysis_filter.rs

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,13 @@ use crate::silk::SigProc_FIX::{silk_RSHIFT_ROUND, silk_SAT16};
88
/// filter always starts with zero state
99
/// first d output samples are set to zero
1010
///
11-
/// out O Output signal
12-
/// in I Input signal
13-
/// B I MA prediction coefficients, Q12 [order]
14-
/// len I Signal length
15-
/// d I Filter order
11+
/// ```text
12+
/// out O Output signal
13+
/// in I Input signal
14+
/// B I MA prediction coefficients, Q12 [order]
15+
/// len I Signal length
16+
/// d I Filter order
17+
/// ```
1618
pub fn silk_LPC_analysis_filter(out: &mut [i16], input: &[i16], B: &[i16]) {
1719
let len = input.len();
1820
let d = B.len();

src/silk/LP_variable_cutoff.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -81,12 +81,12 @@ fn silk_LP_interpolate_filter_taps(
8181
/// frame_length I Frame length
8282
/// ```
8383
pub fn silk_LP_variable_cutoff(psLP: &mut silk_LP_state, frame: &mut [i16]) {
84-
assert!(psLP.transition_frame_no >= 0 && psLP.transition_frame_no <= TRANSITION_FRAMES);
84+
assert!(psLP.transition_frame_no >= 0 && psLP.transition_frame_no <= TRANSITION_FRAMES as i32);
8585

8686
/* Run filter if needed */
8787
if psLP.mode != 0 {
8888
/* Calculate index and interpolation factor for interpolation */
89-
let fac_Q16 = (TRANSITION_FRAMES - psLP.transition_frame_no) << (16 - 6);
89+
let fac_Q16 = (TRANSITION_FRAMES as i32 - psLP.transition_frame_no) << (16 - 6);
9090
let ind = fac_Q16 >> 16;
9191
let fac_Q16 = fac_Q16 - (ind << 16);
9292

src/silk/NLSF_encode.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ pub unsafe fn silk_NLSF_encode(
8383
*RD_Q25.as_mut_ptr().offset(s as isize) = silk_NLSF_del_dec_quant(
8484
&mut *tempIndices2
8585
.as_mut_ptr()
86-
.offset((s * MAX_LPC_ORDER) as isize),
86+
.offset((s * MAX_LPC_ORDER as i32) as isize),
8787
res_Q10.as_mut_ptr() as *const i16,
8888
W_adj_Q5.as_mut_ptr() as *const i16,
8989
pred_Q8.as_mut_ptr() as *const u8,

src/silk/NSQ.rs

Lines changed: 25 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,7 @@ use crate::silk::structs::{silk_encoder_state, silk_nsq_state, SideInfoIndices};
109109
use crate::silk::tables_other::silk_Quantization_Offsets_Q10;
110110
use crate::silk::Inlines::{silk_DIV32_varQ, silk_INVERSE32_varQ};
111111
use crate::silk::LPC_analysis_filter::silk_LPC_analysis_filter;
112+
use crate::silk::SigProc_FIX::silk_RAND;
112113

113114
pub unsafe fn silk_NSQ_c(
114115
psEncC: &silk_encoder_state,
@@ -152,17 +153,17 @@ pub unsafe fn silk_NSQ_c(
152153
let mut sLTP: Vec<i16> = ::std::vec::from_elem(0, vla_0);
153154
let vla_1 = psEncC.subfr_length as usize;
154155
let mut x_sc_Q10: Vec<i32> = ::std::vec::from_elem(0, vla_1);
155-
(*NSQ).sLTP_shp_buf_idx = psEncC.ltp_mem_length;
156-
(*NSQ).sLTP_buf_idx = psEncC.ltp_mem_length;
156+
(*NSQ).sLTP_shp_buf_idx = psEncC.ltp_mem_length as i32;
157+
(*NSQ).sLTP_buf_idx = psEncC.ltp_mem_length as i32;
157158
pxq = &mut *((*NSQ).xq)
158159
.as_mut_ptr()
159160
.offset(psEncC.ltp_mem_length as isize) as *mut i16;
160161
k = 0;
161-
while k < psEncC.nb_subfr {
162+
while k < psEncC.nb_subfr as i32 {
162163
A_Q12 = &*PredCoef_Q12
163-
.offset(((k >> 1 | 1 - LSF_interpolation_flag) * MAX_LPC_ORDER) as isize)
164+
.offset(((k >> 1 | 1 - LSF_interpolation_flag) * MAX_LPC_ORDER as i32) as isize)
164165
as *const i16;
165-
B_Q14 = &*LTPCoef_Q14.offset((k * LTP_ORDER) as isize) as *const i16;
166+
B_Q14 = &*LTPCoef_Q14.offset((k * LTP_ORDER as i32) as isize) as *const i16;
166167
AR_shp_Q13 = &*AR_Q13.offset((k * MAX_SHAPE_LPC_ORDER) as isize) as *const i16;
167168
HarmShapeFIRPacked_Q14 = *HarmShapeGain_Q14.offset(k as isize) >> 2;
168169
HarmShapeFIRPacked_Q14 |=
@@ -171,17 +172,19 @@ pub unsafe fn silk_NSQ_c(
171172
if (*psIndices).signalType as i32 == TYPE_VOICED {
172173
lag = *pitchL.offset(k as isize);
173174
if k & 3 - ((LSF_interpolation_flag as u32) << 1) as i32 == 0 {
174-
start_idx =
175-
psEncC.ltp_mem_length - lag - psEncC.predictLPCOrder - LTP_ORDER / 2;
175+
start_idx = psEncC.ltp_mem_length as i32
176+
- lag
177+
- psEncC.predictLPCOrder
178+
- LTP_ORDER as i32 / 2;
176179
assert!(start_idx > 0);
177180
silk_LPC_analysis_filter(
178181
&mut sLTP[start_idx as usize..psEncC.ltp_mem_length as usize],
179-
&(*NSQ).xq[(start_idx + k * psEncC.subfr_length) as usize..]
180-
[..(psEncC.ltp_mem_length - start_idx) as usize],
182+
&(*NSQ).xq[(start_idx + k * psEncC.subfr_length as i32) as usize..]
183+
[..(psEncC.ltp_mem_length - start_idx as usize) as usize],
181184
std::slice::from_raw_parts(A_Q12, psEncC.predictLPCOrder as usize),
182185
);
183186
(*NSQ).rewhite_flag = 1;
184-
(*NSQ).sLTP_buf_idx = psEncC.ltp_mem_length;
187+
(*NSQ).sLTP_buf_idx = psEncC.ltp_mem_length as i32;
185188
}
186189
}
187190
silk_nsq_scale_states(
@@ -214,7 +217,7 @@ pub unsafe fn silk_NSQ_c(
214217
*Gains_Q16.offset(k as isize),
215218
Lambda_Q10,
216219
offset_Q10,
217-
psEncC.subfr_length,
220+
psEncC.subfr_length as i32,
218221
psEncC.shapingLPCOrder,
219222
psEncC.predictLPCOrder,
220223
psEncC.arch,
@@ -229,16 +232,14 @@ pub unsafe fn silk_NSQ_c(
229232
((*NSQ).xq).as_mut_ptr() as *mut core::ffi::c_void,
230233
&mut *((*NSQ).xq)
231234
.as_mut_ptr()
232-
.offset(psEncC.frame_length as isize) as *mut i16
233-
as *const core::ffi::c_void,
235+
.offset(psEncC.frame_length as isize) as *mut i16 as *const core::ffi::c_void,
234236
(psEncC.ltp_mem_length as u64).wrapping_mul(::core::mem::size_of::<i16>() as u64),
235237
);
236238
memmove(
237239
((*NSQ).sLTP_shp_Q14).as_mut_ptr() as *mut core::ffi::c_void,
238240
&mut *((*NSQ).sLTP_shp_Q14)
239241
.as_mut_ptr()
240-
.offset(psEncC.frame_length as isize) as *mut i32
241-
as *const core::ffi::c_void,
242+
.offset(psEncC.frame_length as isize) as *mut i32 as *const core::ffi::c_void,
242243
(psEncC.ltp_mem_length as u64).wrapping_mul(::core::mem::size_of::<i32>() as u64),
243244
);
244245
}
@@ -292,16 +293,16 @@ unsafe fn silk_noise_shape_quantizer(
292293
.as_mut_ptr()
293294
.offset(((*NSQ).sLTP_shp_buf_idx - lag + HARM_SHAPE_FIR_TAPS / 2) as isize)
294295
as *mut i32;
295-
pred_lag_ptr =
296-
&mut *sLTP_Q15.offset(((*NSQ).sLTP_buf_idx - lag + LTP_ORDER / 2) as isize) as *mut i32;
296+
pred_lag_ptr = &mut *sLTP_Q15
297+
.offset(((*NSQ).sLTP_buf_idx - lag + LTP_ORDER as i32 / 2) as isize)
298+
as *mut i32;
297299
Gain_Q10 = Gain_Q16 >> 6;
298300
psLPC_Q14 = &mut *((*NSQ).sLPC_Q14)
299301
.as_mut_ptr()
300302
.offset((NSQ_LPC_BUF_LENGTH - 1) as isize) as *mut i32;
301303
i = 0;
302304
while i < length {
303-
(*NSQ).rand_seed =
304-
907633515_u32.wrapping_add(((*NSQ).rand_seed as u32).wrapping_mul(196314165)) as i32;
305+
(*NSQ).rand_seed = silk_RAND((*NSQ).rand_seed);
305306
LPC_pred_Q10 =
306307
silk_noise_shape_quantizer_short_prediction_c(psLPC_Q14, a_Q12, predictLPCOrder);
307308
if signalType == TYPE_VOICED {
@@ -518,7 +519,7 @@ unsafe fn silk_nsq_scale_states(
518519
(inv_gain_Q31 >> 5 - 1) + 1 >> 1
519520
};
520521
i = 0;
521-
while i < psEncC.subfr_length {
522+
while i < psEncC.subfr_length as i32 {
522523
*x_sc_Q10.offset(i as isize) =
523524
(*x16.offset(i as isize) as i64 * inv_gain_Q26 as i64 >> 16) as i32;
524525
i += 1;
@@ -529,7 +530,7 @@ unsafe fn silk_nsq_scale_states(
529530
as u32)
530531
<< 2) as i32;
531532
}
532-
i = (*NSQ).sLTP_buf_idx - lag - LTP_ORDER / 2;
533+
i = (*NSQ).sLTP_buf_idx - lag - LTP_ORDER as i32 / 2;
533534
while i < (*NSQ).sLTP_buf_idx {
534535
*sLTP_Q15.offset(i as isize) =
535536
(inv_gain_Q31 as i64 * *sLTP.offset(i as isize) as i64 >> 16) as i32;
@@ -538,14 +539,14 @@ unsafe fn silk_nsq_scale_states(
538539
}
539540
if *Gains_Q16.offset(subfr as isize) != (*NSQ).prev_gain_Q16 {
540541
gain_adj_Q16 = silk_DIV32_varQ((*NSQ).prev_gain_Q16, *Gains_Q16.offset(subfr as isize), 16);
541-
i = (*NSQ).sLTP_shp_buf_idx - psEncC.ltp_mem_length;
542+
i = (*NSQ).sLTP_shp_buf_idx - psEncC.ltp_mem_length as i32;
542543
while i < (*NSQ).sLTP_shp_buf_idx {
543544
(*NSQ).sLTP_shp_Q14[i as usize] =
544545
(gain_adj_Q16 as i64 * (*NSQ).sLTP_shp_Q14[i as usize] as i64 >> 16) as i32;
545546
i += 1;
546547
}
547548
if signal_type == TYPE_VOICED && (*NSQ).rewhite_flag == 0 {
548-
i = (*NSQ).sLTP_buf_idx - lag - LTP_ORDER / 2;
549+
i = (*NSQ).sLTP_buf_idx - lag - LTP_ORDER as i32 / 2;
549550
while i < (*NSQ).sLTP_buf_idx {
550551
*sLTP_Q15.offset(i as isize) =
551552
(gain_adj_Q16 as i64 * *sLTP_Q15.offset(i as isize) as i64 >> 16) as i32;
@@ -555,7 +556,7 @@ unsafe fn silk_nsq_scale_states(
555556
(*NSQ).sLF_AR_shp_Q14 = (gain_adj_Q16 as i64 * (*NSQ).sLF_AR_shp_Q14 as i64 >> 16) as i32;
556557
(*NSQ).sDiff_shp_Q14 = (gain_adj_Q16 as i64 * (*NSQ).sDiff_shp_Q14 as i64 >> 16) as i32;
557558
i = 0;
558-
while i < NSQ_LPC_BUF_LENGTH {
559+
while i < NSQ_LPC_BUF_LENGTH as i32 {
559560
(*NSQ).sLPC_Q14[i as usize] =
560561
(gain_adj_Q16 as i64 * (*NSQ).sLPC_Q14[i as usize] as i64 >> 16) as i32;
561562
i += 1;

0 commit comments

Comments
 (0)