Line data Source code
1 : /******************************************************************************
2 : * ETSI TS 103 634 V1.6.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 2577903 : 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 2577903 : LC3_INT lastnz = 1, nt_half;
66 2577903 : LC3_FLOAT offset = 0.375;
67 : LC3_INT32 bits, bits2;
68 : LC3_FLOAT inv_gain;
69 :
70 2577903 : assert(target >= 0);
71 :
72 2577903 : nbits_lsb = 0;
73 :
74 2577903 : nt_half = nt >> 1;
75 2577903 : rateFlag = 0; c = 0;
76 :
77 2577903 : if (hrmode)
78 : {
79 0 : offset = 0.5;
80 : }
81 :
82 : /* Quantization */
83 2577903 : inv_gain = 1.0 / gain;
84 :
85 541394423 : for (i = 0; i < nt; i++) {
86 538816520 : if (x[i] > 0)
87 : {
88 268106978 : xq[i] = (LC3_INT32) ( x[i] * inv_gain + offset);
89 : }
90 : else
91 : {
92 270709542 : xq[i] = -((LC3_INT32) (-x[i] * inv_gain + offset));
93 : }
94 538816520 : if (hrmode == 0) {
95 538816520 : assert(xq[i] <= 32767 && xq[i] >= -32768);
96 : }
97 : }
98 :
99 : /* Rate flag */
100 2577903 : if (fs != 96000 && (totalBits > (160 + FS2FS_IDX(fs) * 160)))
101 : {
102 1990412 : rateFlag = 512;
103 : }
104 :
105 : /* Init */
106 2577903 : if (fs != 96000 && (mode == 0 && (totalBits >= (480 + FS2FS_IDX(fs) * 160))))
107 : {
108 409293 : mode = 1;
109 : }
110 :
111 : /* Last non-zero 2-tuple */
112 5629281 : for (i = nt - 2; i >= 2; i = i - 2) {
113 5615656 : if (xq[i + 1] != 0 || xq[i] != 0) {
114 2564278 : lastnz = i + 1;
115 2564278 : break;
116 : }
117 : }
118 :
119 2577903 : if (mode < 0)
120 : {
121 1779817 : lastnz2 = lastnz + 1;
122 : }
123 : else
124 : {
125 798086 : lastnz2 = 2;
126 : }
127 :
128 2577903 : bits = bits2 = 0;
129 :
130 : /* Calculate number of estimated bits */
131 :
132 268934785 : for (k = 0; k < lastnz; k = k + 2)
133 : {
134 266356882 : t = c + rateFlag;
135 266356882 : if (k > nt_half)
136 : {
137 129762779 : t += 256;
138 : }
139 :
140 266356882 : codingdata[0] = t;
141 :
142 266356882 : a = abs(xq[k]);
143 266356882 : b = abs(xq[k + 1]);
144 266356882 : m = MAX(a, b);
145 :
146 266356882 : if (m == 0)
147 : {
148 18685707 : maxlev = -1;
149 : }
150 : else
151 : {
152 247671175 : maxlev = 29 - (clz_func(MAX(m, 3)) - 1);
153 : }
154 :
155 266356882 : codingdata[1] = maxlev;
156 :
157 266356882 : if (mode <= 0) {
158 222085823 : bits = bits + (MIN(a, 1) << 11);
159 222085823 : bits = bits + (MIN(b, 1) << 11);
160 : }
161 :
162 266356882 : lev1 = 0;
163 :
164 734655417 : while (MAX(a, b) >= 4)
165 : {
166 468298535 : pki = ari_spec_lookup_fl[t + lev1 * 1024];
167 468298535 : bits = bits + ari_spec_bits_fl[pki][16];
168 :
169 468298535 : if (lev1 == 0 && mode > 0)
170 : {
171 34423151 : nbits_lsb += 2;
172 : }
173 : else
174 : {
175 433875384 : bits = bits + 2 * 2048;
176 : }
177 :
178 468298535 : a = a >> 1;
179 468298535 : b = b >> 1;
180 468298535 : lev1 = MIN(lev1 + 1, 3);
181 : }
182 :
183 266356882 : pki = ari_spec_lookup_fl[t + lev1 * 1024];
184 266356882 : sym = a + 4 * b;
185 266356882 : codingdata[2] = sym;
186 266356882 : codingdata += 3;
187 266356882 : bits = bits + ari_spec_bits_fl[pki][sym];
188 :
189 266356882 : if (mode > 0)
190 : {
191 44271059 : a1_msb = abs(xq[k]);
192 44271059 : b1_msb = abs(xq[k + 1]);
193 :
194 44271059 : if (lev1 > 0)
195 : {
196 34423151 : a1_msb = a1_msb >> 1;
197 34423151 : b1_msb = b1_msb >> 1;
198 :
199 34423151 : if (a1_msb == 0 && xq[k] != 0)
200 : {
201 1533040 : nbits_lsb++;
202 : }
203 :
204 34423151 : if (b1_msb == 0 && xq[k + 1] != 0)
205 : {
206 1559320 : nbits_lsb++;
207 : }
208 : }
209 :
210 44271059 : bits = bits + (MIN(a1_msb, 1) << 11);
211 44271059 : bits = bits + (MIN(b1_msb, 1) << 11);
212 : }
213 :
214 266356882 : if (mode >= 0 && (abs(xq[k]) != 0 || abs(xq[k + 1]) != 0) && bits <= target * 2048)
215 : {
216 75807097 : lastnz2 = k + 2;
217 75807097 : bits2 = bits;
218 : }
219 :
220 266356882 : lev1 = lev1 - 1;
221 :
222 266356882 : if (lev1 <= 0)
223 : {
224 143732284 : t = 1 + (a + b) * (lev1 + 2);
225 : }
226 : else
227 : {
228 122624598 : t = 13 + lev1;
229 : }
230 :
231 266356882 : c = (c & 15) * 16 + t;
232 : }
233 :
234 2577903 : *nbits = (bits + 2047) >> 11; /* same as ceil((LC3_FLOAT)*nbits / 2048.0);*/
235 :
236 2577903 : if (mode >= 0)
237 : {
238 798086 : *nbits2 = (bits2 + 2047) >> 11; /* ceil((LC3_FLOAT)*nbits2 / 2048.0); */
239 : }
240 : else
241 : {
242 1779817 : *nbits2 = *nbits;
243 : }
244 :
245 2577903 : if (mode > 0)
246 : {
247 409293 : *nbits += nbits_lsb;
248 409293 : *nbits2 += nbits_lsb;
249 : }
250 :
251 : /* Truncation of high-frequency coefficients */
252 2744739 : for (i = lastnz2; i <= lastnz; i++)
253 : {
254 166836 : xq[i] = 0;
255 : }
256 :
257 : /* Truncation of LSBs */
258 2577903 : if (mode > 0 && *nbits > target)
259 : {
260 21563 : *lsbMode = 1;
261 : }
262 : else
263 : {
264 2556340 : *lsbMode = 0;
265 : }
266 :
267 2577903 : *lastnzout = lastnz2;
268 2577903 : }
|