Skip to content

Commit 570fb0b

Browse files
committed
refactor: make silk_stereo_decode_pred and silk_stereo_decode_mid_only safe
1 parent 5b255f9 commit 570fb0b

File tree

2 files changed

+55
-35
lines changed

2 files changed

+55
-35
lines changed

src/silk/dec_API.rs

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -43,15 +43,15 @@ pub struct silk_decoder {
4343
pub sStereo: stereo_dec_state,
4444
pub nChannelsAPI: i32,
4545
pub nChannelsInternal: i32,
46-
pub prev_decode_only_middle: i32,
46+
pub prev_decode_only_middle: bool,
4747
}
4848
pub fn silk_InitDecoder() -> silk_decoder {
4949
silk_decoder {
5050
channel_state: [silk_init_decoder(), silk_init_decoder()],
5151
sStereo: stereo_dec_state::default(),
5252
nChannelsAPI: 0,
5353
nChannelsInternal: 0,
54-
prev_decode_only_middle: 0,
54+
prev_decode_only_middle: false,
5555
}
5656
}
5757
pub unsafe fn silk_Decode(
@@ -66,7 +66,7 @@ pub unsafe fn silk_Decode(
6666
) -> i32 {
6767
let mut i: i32 = 0;
6868
let mut n: i32 = 0;
69-
let mut decode_only_middle: i32 = 0;
69+
let mut decode_only_middle: bool = false;
7070
let mut ret: i32 = SILK_NO_ERROR;
7171
let mut nSamplesOutDec: i32 = 0;
7272
let mut LBRR_symbol: i32 = 0;
@@ -203,7 +203,7 @@ pub unsafe fn silk_Decode(
203203
let mut pulses: [i16; 320] = [0; 320];
204204
let mut condCoding: i32 = 0;
205205
if decControl.nChannelsInternal == 2 && n == 0 {
206-
silk_stereo_decode_pred(psRangeDec, MS_pred_Q13.as_mut_ptr());
206+
silk_stereo_decode_pred(psRangeDec, &mut MS_pred_Q13);
207207
if channel_state[1].LBRR_flags[i as usize] == 0 {
208208
silk_stereo_decode_mid_only(psRangeDec, &mut decode_only_middle);
209209
}
@@ -247,15 +247,15 @@ pub unsafe fn silk_Decode(
247247
|| lostFlag == FLAG_DECODE_LBRR
248248
&& channel_state[0].LBRR_flags[channel_state[0].nFramesDecoded as usize] == 1
249249
{
250-
silk_stereo_decode_pred(psRangeDec, MS_pred_Q13.as_mut_ptr());
250+
silk_stereo_decode_pred(psRangeDec, &mut MS_pred_Q13);
251251
if lostFlag == FLAG_DECODE_NORMAL
252252
&& channel_state[1].VAD_flags[channel_state[0].nFramesDecoded as usize] == 0
253253
|| lostFlag == FLAG_DECODE_LBRR
254254
&& channel_state[1].LBRR_flags[channel_state[0].nFramesDecoded as usize] == 0
255255
{
256256
silk_stereo_decode_mid_only(psRangeDec, &mut decode_only_middle);
257257
} else {
258-
decode_only_middle = 0;
258+
decode_only_middle = false;
259259
}
260260
} else {
261261
n = 0;
@@ -266,8 +266,8 @@ pub unsafe fn silk_Decode(
266266
}
267267
}
268268
if decControl.nChannelsInternal == 2
269-
&& decode_only_middle == 0
270-
&& psDec.prev_decode_only_middle == 1
269+
&& decode_only_middle == false
270+
&& psDec.prev_decode_only_middle == true
271271
{
272272
memset(
273273
(channel_state[1].outBuf).as_mut_ptr() as *mut core::ffi::c_void,
@@ -305,9 +305,9 @@ pub unsafe fn silk_Decode(
305305
.offset(2 as isize);
306306
}
307307
if lostFlag == FLAG_DECODE_NORMAL {
308-
has_side = (decode_only_middle == 0) as i32;
308+
has_side = (decode_only_middle == false) as i32;
309309
} else {
310-
has_side = (psDec.prev_decode_only_middle == 0
310+
has_side = (psDec.prev_decode_only_middle == false
311311
|| decControl.nChannelsInternal == 2
312312
&& lostFlag == FLAG_DECODE_LBRR
313313
&& channel_state[1].LBRR_flags[channel_state[1].nFramesDecoded as usize] == 1)
@@ -328,7 +328,7 @@ pub unsafe fn silk_Decode(
328328
} else {
329329
CODE_INDEPENDENTLY
330330
};
331-
} else if n > 0 && psDec.prev_decode_only_middle != 0 {
331+
} else if n > 0 && psDec.prev_decode_only_middle != false {
332332
condCoding_0 = CODE_INDEPENDENTLY_NO_LTP_SCALING;
333333
} else {
334334
condCoding_0 = CODE_CONDITIONALLY;

src/silk/stereo_decode_pred.rs

Lines changed: 44 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,58 @@
11
use crate::celt::entdec::{ec_dec, ec_dec_icdf};
2+
use crate::silk::define::STEREO_QUANT_SUB_STEPS;
3+
use crate::silk::macros::silk_SMULWB;
24
use crate::silk::tables_other::{
35
silk_stereo_only_code_mid_iCDF, silk_stereo_pred_joint_iCDF, silk_stereo_pred_quant_Q13,
46
silk_uniform3_iCDF, silk_uniform5_iCDF,
57
};
8+
use crate::silk::SigProc_FIX::SILK_FIX_CONST;
69

7-
pub unsafe fn silk_stereo_decode_pred(psRangeDec: &mut ec_dec, pred_Q13: *mut i32) {
8-
let mut n: i32 = 0;
9-
let mut ix: [[i32; 3]; 2] = [[0; 3]; 2];
10-
let mut low_Q13: i32 = 0;
11-
let mut step_Q13: i32 = 0;
12-
n = ec_dec_icdf(psRangeDec, &silk_stereo_pred_joint_iCDF, 8);
13-
ix[0 as usize][2 as usize] = n / 5;
14-
ix[1 as usize][2 as usize] = n - 5 * ix[0 as usize][2 as usize];
15-
n = 0;
10+
/// Decode mid/side predictors
11+
///
12+
/// ```text
13+
/// psRangeDec I/O Compressor data structure
14+
/// pred_Q13[] O Predictors
15+
/// ```
16+
pub fn silk_stereo_decode_pred(psRangeDec: &mut ec_dec, pred_Q13: &mut [i32; 2]) {
17+
let n = ec_dec_icdf(psRangeDec, &silk_stereo_pred_joint_iCDF, 8) as usize;
18+
19+
let mut ix: [[usize; 3]; 2] = [[0; 3]; 2];
20+
ix[0][2] = n / 5;
21+
ix[1][2] = n - 5 * ix[0][2];
22+
23+
/* Entropy decoding */
24+
let mut n = 0;
1625
while n < 2 {
17-
ix[n as usize][0 as usize] = ec_dec_icdf(psRangeDec, &silk_uniform3_iCDF, 8);
18-
ix[n as usize][1 as usize] = ec_dec_icdf(psRangeDec, &silk_uniform5_iCDF, 8);
26+
ix[n][0] = ec_dec_icdf(psRangeDec, &silk_uniform3_iCDF, 8) as usize;
27+
ix[n][1] = ec_dec_icdf(psRangeDec, &silk_uniform5_iCDF, 8) as usize;
1928
n += 1;
2029
}
21-
n = 0;
30+
31+
/* Dequantize */
32+
let mut n = 0;
2233
while n < 2 {
23-
ix[n as usize][0 as usize] += 3 * ix[n as usize][2 as usize];
24-
low_Q13 = silk_stereo_pred_quant_Q13[ix[n as usize][0 as usize] as usize] as i32;
25-
step_Q13 = ((silk_stereo_pred_quant_Q13[(ix[n as usize][0 as usize] + 1) as usize] as i32
26-
- low_Q13) as i64
27-
* (0.5f64 / 5 as f64 * ((1) << 16) as f64 + 0.5f64) as i32 as i16 as i64
28-
>> 16) as i32;
29-
*pred_Q13.offset(n as isize) =
30-
low_Q13 + step_Q13 as i16 as i32 * (2 * ix[n as usize][1 as usize] + 1) as i16 as i32;
34+
ix[n][0] += 3 * ix[n][2];
35+
let low_Q13 = silk_stereo_pred_quant_Q13[ix[n][0]] as i32;
36+
let step_Q13 = silk_SMULWB(
37+
(silk_stereo_pred_quant_Q13[ix[n][0] + 1] as i32 - low_Q13),
38+
SILK_FIX_CONST!(0.5 / STEREO_QUANT_SUB_STEPS as f64, 16),
39+
);
40+
41+
pred_Q13[n] = low_Q13 + step_Q13 as i16 as i32 * (2 * ix[n][1] + 1) as i16 as i32;
3142
n += 1;
3243
}
33-
let ref mut fresh0 = *pred_Q13.offset(0 as isize);
34-
*fresh0 -= *pred_Q13.offset(1 as isize);
44+
45+
/* Subtract second from first predictor (helps when actually applying these) */
46+
pred_Q13[0] -= pred_Q13[1];
3547
}
36-
pub unsafe fn silk_stereo_decode_mid_only(psRangeDec: &mut ec_dec, decode_only_mid: *mut i32) {
37-
*decode_only_mid = ec_dec_icdf(psRangeDec, &silk_stereo_only_code_mid_iCDF, 8);
48+
49+
/// Decode mid-only flag
50+
///
51+
/// ```text
52+
/// psRangeDec I/O Compressor data structure
53+
/// decode_only_mid O Flag that only mid channel has been coded
54+
/// ```
55+
pub fn silk_stereo_decode_mid_only(psRangeDec: &mut ec_dec, decode_only_mid: &mut bool) {
56+
/* Decode flag that only mid channel is coded */
57+
*decode_only_mid = ec_dec_icdf(psRangeDec, &silk_stereo_only_code_mid_iCDF, 8) != 0;
3858
}

0 commit comments

Comments
 (0)