unsafe_libopus/silk/
gain_quant.rs1use 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}