Line data Source code
1 : /******************************************************************************
2 : * ETSI TS 103 634 V1.5.1 *
3 : * Low Complexity Communication Codec Plus (LC3plus) *
4 : * *
5 : * Copyright licence is solely granted through ETSI Intellectual Property *
6 : * Rights Policy, 3rd April 2019. No patent licence is granted by implication, *
7 : * estoppel or otherwise. *
8 : ******************************************************************************/
9 :
10 : #include "options.h"
11 : #include "wmc_auto.h"
12 : #include "functions.h"
13 :
14 : LC3_INT32 find_last_nz_pair(LC3_INT32 x[], LC3_INT32 length);
15 0 : LC3_INT32 find_last_nz_pair(LC3_INT32 x[], LC3_INT32 length)
16 : {
17 : LC3_INT32 last_nz, lobs[4]; LC3_INT32 stage, i;
18 :
19 0 : lobs[0] = 4;
20 :
21 0 : lobs[1] = (length >> 1); /* length/2 */
22 :
23 0 : lobs[2] = (lobs[1]+ (length >> 2));
24 :
25 0 : lobs[3] = (lobs[2]+ (length >> 3));
26 :
27 :
28 0 : last_nz = 0;
29 :
30 0 : i = length;
31 :
32 0 : for (stage = 3; stage >= 0; --stage)
33 : {
34 : /* unmapped kernel */
35 0 : for (; i >= lobs[stage]; i -= 2)
36 : {
37 0 : if (x[i - 2] != 0)
38 : {
39 0 : last_nz = MAX(last_nz, i);
40 : }
41 0 : if (x[i - 1] != 0)
42 : {
43 0 : last_nz = MAX(last_nz, i);
44 : }
45 : }
46 0 : if (last_nz > 0)
47 : {
48 0 : break;
49 : }
50 : }
51 :
52 0 : return MAX(last_nz, 2);
53 : }
54 :
55 :
56 0 : void processQuantizeSpec_fl(LC3_FLOAT x[], LC3_FLOAT gain, LC3_INT xq[], LC3_INT nt, LC3_INT totalBits, LC3_INT* nbits, LC3_INT* nbits2, LC3_INT fs,
57 : LC3_INT* lastnzout, LC3_INT* codingdata, LC3_INT* lsbMode, LC3_INT mode, LC3_INT target, LC3_INT hrmode)
58 : {
59 :
60 : LC3_INT rateFlag, i, lastnz2, m, maxlev, k;
61 : LC3_INT nbits_lsb;
62 : LC3_INT c;
63 : LC3_INT a, b, lev1, sym, t, pki;
64 : LC3_INT a1_msb, b1_msb;
65 0 : LC3_INT lastnz = 1, nt_half;
66 0 : LC3_FLOAT offset = 0.375;
67 : LC3_INT32 bits, bits2;
68 : LC3_FLOAT inv_gain;
69 :
70 0 : assert(target >= 0);
71 :
72 0 : nbits_lsb = 0;
73 :
74 0 : nt_half = nt >> 1;
75 0 : rateFlag = 0; c = 0;
76 :
77 0 : if (hrmode)
78 : {
79 0 : offset = 0.5;
80 : }
81 :
82 : /* Quantization */
83 0 : inv_gain = 1.0 / gain;
84 :
85 0 : for (i = 0; i < nt; i++) {
86 0 : if (x[i] > 0)
87 : {
88 0 : xq[i] = (LC3_INT32) ( x[i] * inv_gain + offset);
89 : }
90 : else
91 : {
92 0 : xq[i] = -((LC3_INT32) (-x[i] * inv_gain + offset));
93 : }
94 0 : if (hrmode == 0) {
95 0 : assert(xq[i] <= 32767 && xq[i] >= -32768);
96 : }
97 : }
98 :
99 : /* Rate flag */
100 0 : if (fs != 96000 && (totalBits > (160 + FS2FS_IDX(fs) * 160)))
101 : {
102 0 : rateFlag = 512;
103 : }
104 :
105 : /* Init */
106 0 : if (fs != 96000 && (mode == 0 && (totalBits >= (480 + FS2FS_IDX(fs) * 160))))
107 : {
108 0 : mode = 1;
109 : }
110 :
111 : /* Last non-zero 2-tuple */
112 0 : for (i = nt - 2; i >= 2; i = i - 2) {
113 0 : if (xq[i + 1] != 0 || xq[i] != 0) {
114 0 : lastnz = i + 1;
115 0 : break;
116 : }
117 : }
118 :
119 0 : if (mode < 0)
120 : {
121 0 : lastnz2 = lastnz + 1;
122 : }
123 : else
124 : {
125 0 : lastnz2 = 2;
126 : }
127 :
128 0 : bits = bits2 = 0;
129 :
130 : /* Calculate number of estimated bits */
131 :
132 0 : for (k = 0; k < lastnz; k = k + 2)
133 : {
134 0 : t = c + rateFlag;
135 0 : if (k > nt_half)
136 : {
137 0 : t += 256;
138 : }
139 :
140 0 : codingdata[0] = t;
141 :
142 0 : a = abs(xq[k]);
143 0 : b = abs(xq[k + 1]);
144 0 : m = MAX(a, b);
145 :
146 0 : if (m == 0)
147 : {
148 0 : maxlev = -1;
149 : }
150 : else
151 : {
152 0 : maxlev = 29 - (clz_func(MAX(m, 3)) - 1);
153 : }
154 :
155 0 : codingdata[1] = maxlev;
156 :
157 0 : if (mode <= 0) {
158 0 : bits = bits + (MIN(a, 1) << 11);
159 0 : bits = bits + (MIN(b, 1) << 11);
160 : }
161 :
162 0 : lev1 = 0;
163 :
164 0 : while (MAX(a, b) >= 4)
165 : {
166 0 : pki = ari_spec_lookup_fl[t + lev1 * 1024];
167 0 : bits = bits + ari_spec_bits_fl[pki][16];
168 :
169 0 : if (lev1 == 0 && mode > 0)
170 : {
171 0 : nbits_lsb += 2;
172 : }
173 : else
174 : {
175 0 : bits = bits + 2 * 2048;
176 : }
177 :
178 0 : a = a >> 1;
179 0 : b = b >> 1;
180 0 : lev1 = MIN(lev1 + 1, 3);
181 : }
182 :
183 0 : pki = ari_spec_lookup_fl[t + lev1 * 1024];
184 0 : sym = a + 4 * b;
185 0 : codingdata[2] = sym;
186 0 : codingdata += 3;
187 0 : bits = bits + ari_spec_bits_fl[pki][sym];
188 :
189 0 : if (mode > 0)
190 : {
191 0 : a1_msb = abs(xq[k]);
192 0 : b1_msb = abs(xq[k + 1]);
193 :
194 0 : if (lev1 > 0)
195 : {
196 0 : a1_msb = a1_msb >> 1;
197 0 : b1_msb = b1_msb >> 1;
198 :
199 0 : if (a1_msb == 0 && xq[k] != 0)
200 : {
201 0 : nbits_lsb++;
202 : }
203 :
204 0 : if (b1_msb == 0 && xq[k + 1] != 0)
205 : {
206 0 : nbits_lsb++;
207 : }
208 : }
209 :
210 0 : bits = bits + (MIN(a1_msb, 1) << 11);
211 0 : bits = bits + (MIN(b1_msb, 1) << 11);
212 : }
213 :
214 0 : if (mode >= 0 && (abs(xq[k]) != 0 || abs(xq[k + 1]) != 0) && bits <= target * 2048)
215 : {
216 0 : lastnz2 = k + 2;
217 0 : bits2 = bits;
218 : }
219 :
220 0 : lev1 = lev1 - 1;
221 :
222 0 : if (lev1 <= 0)
223 : {
224 0 : t = 1 + (a + b) * (lev1 + 2);
225 : }
226 : else
227 : {
228 0 : t = 13 + lev1;
229 : }
230 :
231 0 : c = (c & 15) * 16 + t;
232 : }
233 :
234 0 : *nbits = (bits + 2047) >> 11; // Exactly same as ceil((LC3_FLOAT)*nbits / 2048.0);
235 :
236 0 : if (mode >= 0)
237 : {
238 0 : *nbits2 = (bits2 + 2047) >> 11; //ceil((LC3_FLOAT)*nbits2 / 2048.0);
239 : }
240 : else
241 : {
242 0 : *nbits2 = *nbits;
243 : }
244 :
245 0 : if (mode > 0)
246 : {
247 0 : *nbits += nbits_lsb;
248 0 : *nbits2 += nbits_lsb;
249 : }
250 :
251 : /* Truncation of high-frequency coefficients */
252 0 : for (i = lastnz2; i <= lastnz; i++)
253 : {
254 0 : xq[i] = 0;
255 : }
256 :
257 : /* Truncation of LSBs */
258 0 : if (mode > 0 && *nbits > target)
259 : {
260 0 : *lsbMode = 1;
261 : }
262 : else
263 : {
264 0 : *lsbMode = 0;
265 : }
266 :
267 0 : *lastnzout = lastnz2;
268 0 : }
|