unsafe_libopus/silk/
gain_quant.rs

1use crate::silk::lin2log::silk_lin2log;
2use crate::silk::log2lin::silk_log2lin;
3use crate::silk::SigProc_FIX::{silk_max_int, silk_min_32, silk_min_int};
4
5use crate::silk::define::{
6    MAX_DELTA_GAIN_QUANT, MIN_DELTA_GAIN_QUANT, MIN_QGAIN_DB, N_LEVELS_QGAIN,
7};
8
9pub const OFFSET: i32 = MIN_QGAIN_DB * 128 / 6 + 16 * 128;
10pub unsafe fn silk_gains_quant(
11    ind: *mut i8,
12    gain_Q16: *mut i32,
13    prev_ind: *mut i8,
14    conditional: i32,
15    nb_subfr: i32,
16) {
17    let mut k: i32 = 0;
18    let mut double_step_size_threshold: i32 = 0;
19    k = 0;
20    while k < nb_subfr {
21        *ind.offset(k as isize) = ((65536 * (64 - 1) / ((88 - 2) * 128 / 6)) as i64
22            * (silk_lin2log(*gain_Q16.offset(k as isize)) - (2 * 128 / 6 + 16 * 128)) as i16 as i64
23            >> 16) as i32 as i8;
24        if (*ind.offset(k as isize) as i32) < *prev_ind as i32 {
25            let ref mut fresh0 = *ind.offset(k as isize);
26            *fresh0 += 1;
27        }
28        *ind.offset(k as isize) = (if 0 > 64 - 1 {
29            if *ind.offset(k as isize) as i32 > 0 {
30                0
31            } else if (*ind.offset(k as isize) as i32) < 64 - 1 {
32                64 - 1
33            } else {
34                *ind.offset(k as isize) as i32
35            }
36        } else if *ind.offset(k as isize) as i32 > 64 - 1 {
37            64 - 1
38        } else if (*ind.offset(k as isize) as i32) < 0 {
39            0
40        } else {
41            *ind.offset(k as isize) as i32
42        }) as i8;
43        if k == 0 && conditional == 0 {
44            *ind.offset(k as isize) = (if *prev_ind as i32 + -(4) > 64 - 1 {
45                if *ind.offset(k as isize) as i32 > *prev_ind as i32 + -(4) {
46                    *prev_ind as i32 + -(4)
47                } else if (*ind.offset(k as isize) as i32) < 64 - 1 {
48                    64 - 1
49                } else {
50                    *ind.offset(k as isize) as i32
51                }
52            } else if *ind.offset(k as isize) as i32 > 64 - 1 {
53                64 - 1
54            } else if (*ind.offset(k as isize) as i32) < *prev_ind as i32 + -(4) {
55                *prev_ind as i32 + -(4)
56            } else {
57                *ind.offset(k as isize) as i32
58            }) as i8;
59            *prev_ind = *ind.offset(k as isize);
60        } else {
61            *ind.offset(k as isize) = (*ind.offset(k as isize) as i32 - *prev_ind as i32) as i8;
62            double_step_size_threshold =
63                2 * MAX_DELTA_GAIN_QUANT - N_LEVELS_QGAIN + *prev_ind as i32;
64            if *ind.offset(k as isize) as i32 > double_step_size_threshold {
65                *ind.offset(k as isize) = (double_step_size_threshold
66                    + (*ind.offset(k as isize) as i32 - double_step_size_threshold + 1 >> 1))
67                    as i8;
68            }
69            *ind.offset(k as isize) = (if -(4) > 36 {
70                if *ind.offset(k as isize) as i32 > -(4) {
71                    -(4)
72                } else if (*ind.offset(k as isize) as i32) < 36 {
73                    36
74                } else {
75                    *ind.offset(k as isize) as i32
76                }
77            } else if *ind.offset(k as isize) as i32 > 36 {
78                36
79            } else if (*ind.offset(k as isize) as i32) < -(4) {
80                -(4)
81            } else {
82                *ind.offset(k as isize) as i32
83            }) as i8;
84            if *ind.offset(k as isize) as i32 > double_step_size_threshold {
85                *prev_ind = (*prev_ind as i32
86                    + (((*ind.offset(k as isize) as u32) << 1) as i32 - double_step_size_threshold))
87                    as i8;
88                *prev_ind = silk_min_int(*prev_ind as i32, N_LEVELS_QGAIN - 1) as i8;
89            } else {
90                *prev_ind = (*prev_ind as i32 + *ind.offset(k as isize) as i32) as i8;
91            }
92            let ref mut fresh1 = *ind.offset(k as isize);
93            *fresh1 = (*fresh1 as i32 - MIN_DELTA_GAIN_QUANT) as i8;
94        }
95        *gain_Q16.offset(k as isize) = silk_log2lin(silk_min_32(
96            ((65536 * ((88 - 2) * 128 / 6) / (64 - 1)) as i64 * *prev_ind as i16 as i64 >> 16)
97                as i32
98                + OFFSET,
99            3967,
100        ));
101        k += 1;
102    }
103}
104pub unsafe fn silk_gains_dequant(
105    gain_Q16: *mut i32,
106    ind: *const i8,
107    prev_ind: *mut i8,
108    conditional: i32,
109    nb_subfr: i32,
110) {
111    let mut k: i32 = 0;
112    let mut ind_tmp: i32 = 0;
113    let mut double_step_size_threshold: i32 = 0;
114    k = 0;
115    while k < nb_subfr {
116        if k == 0 && conditional == 0 {
117            *prev_ind = silk_max_int(*ind.offset(k as isize) as i32, *prev_ind as i32 - 16) as i8;
118        } else {
119            ind_tmp = *ind.offset(k as isize) as i32 + MIN_DELTA_GAIN_QUANT;
120            double_step_size_threshold =
121                2 * MAX_DELTA_GAIN_QUANT - N_LEVELS_QGAIN + *prev_ind as i32;
122            if ind_tmp > double_step_size_threshold {
123                *prev_ind = (*prev_ind as i32
124                    + (((ind_tmp as u32) << 1) as i32 - double_step_size_threshold))
125                    as i8;
126            } else {
127                *prev_ind = (*prev_ind as i32 + ind_tmp) as i8;
128            }
129        }
130        *prev_ind = (if 0 > 64 - 1 {
131            if *prev_ind as i32 > 0 {
132                0
133            } else if (*prev_ind as i32) < 64 - 1 {
134                64 - 1
135            } else {
136                *prev_ind as i32
137            }
138        } else if *prev_ind as i32 > 64 - 1 {
139            64 - 1
140        } else if (*prev_ind as i32) < 0 {
141            0
142        } else {
143            *prev_ind as i32
144        }) as i8;
145        *gain_Q16.offset(k as isize) = silk_log2lin(silk_min_32(
146            ((65536 * ((88 - 2) * 128 / 6) / (64 - 1)) as i64 * *prev_ind as i16 as i64 >> 16)
147                as i32
148                + OFFSET,
149            3967,
150        ));
151        k += 1;
152    }
153}
154pub unsafe fn silk_gains_ID(ind: *const i8, nb_subfr: i32) -> i32 {
155    let mut k: i32 = 0;
156    let mut gainsID: i32 = 0;
157    gainsID = 0;
158    k = 0;
159    while k < nb_subfr {
160        gainsID = *ind.offset(k as isize) as i32 + ((gainsID as u32) << 8) as i32;
161        k += 1;
162    }
163    return gainsID;
164}