Line | Branch | Exec | Source |
---|---|---|---|
1 | /* | ||
2 | * Copyright (c) 2007-2008 CSIRO | ||
3 | * Copyright (c) 2007-2009 Xiph.Org Foundation | ||
4 | * Copyright (c) 2008-2009 Gregory Maxwell | ||
5 | * Copyright (c) 2012 Andrew D'Addesio | ||
6 | * Copyright (c) 2013-2014 Mozilla Corporation | ||
7 | * Copyright (c) 2017 Rostislav Pehlivanov <atomnuker@gmail.com> | ||
8 | * | ||
9 | * This file is part of FFmpeg. | ||
10 | * | ||
11 | * FFmpeg is free software; you can redistribute it and/or | ||
12 | * modify it under the terms of the GNU Lesser General Public | ||
13 | * License as published by the Free Software Foundation; either | ||
14 | * version 2.1 of the License, or (at your option) any later version. | ||
15 | * | ||
16 | * FFmpeg is distributed in the hope that it will be useful, | ||
17 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
18 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
19 | * Lesser General Public License for more details. | ||
20 | * | ||
21 | * You should have received a copy of the GNU Lesser General Public | ||
22 | * License along with FFmpeg; if not, write to the Free Software | ||
23 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | ||
24 | */ | ||
25 | |||
26 | #include <float.h> | ||
27 | |||
28 | #include "config_components.h" | ||
29 | |||
30 | #include "libavutil/mem.h" | ||
31 | #include "mathops.h" | ||
32 | #include "tab.h" | ||
33 | #include "pvq.h" | ||
34 | |||
35 | #define ROUND_MUL16(a,b) ((MUL16(a, b) + 16384) >> 15) | ||
36 | |||
37 | #define CELT_PVQ_U(n, k) (ff_celt_pvq_u_row[FFMIN(n, k)][FFMAX(n, k)]) | ||
38 | #define CELT_PVQ_V(n, k) (CELT_PVQ_U(n, k) + CELT_PVQ_U(n, (k) + 1)) | ||
39 | |||
40 | 1039102 | static inline int16_t celt_cos(int16_t x) | |
41 | { | ||
42 | 1039102 | x = (MUL16(x, x) + 4096) >> 13; | |
43 | 1039102 | x = (32767-x) + ROUND_MUL16(x, (-7651 + ROUND_MUL16(x, (8277 + ROUND_MUL16(-626, x))))); | |
44 | 1039102 | return x + 1; | |
45 | } | ||
46 | |||
47 | 519551 | static inline int celt_log2tan(int isin, int icos) | |
48 | { | ||
49 | int lc, ls; | ||
50 | 519551 | lc = opus_ilog(icos); | |
51 | 519551 | ls = opus_ilog(isin); | |
52 | 519551 | icos <<= 15 - lc; | |
53 | 519551 | isin <<= 15 - ls; | |
54 | 519551 | return (ls << 11) - (lc << 11) + | |
55 | 1039102 | ROUND_MUL16(isin, ROUND_MUL16(isin, -2597) + 7932) - | |
56 | 519551 | ROUND_MUL16(icos, ROUND_MUL16(icos, -2597) + 7932); | |
57 | } | ||
58 | |||
59 | 1007694 | static inline int celt_bits2pulses(const uint8_t *cache, int bits) | |
60 | { | ||
61 | // TODO: Find the size of cache and make it into an array in the parameters list | ||
62 | 1007694 | int i, low = 0, high; | |
63 | |||
64 | 1007694 | high = cache[0]; | |
65 | 1007694 | bits--; | |
66 | |||
67 |
2/2✓ Branch 0 taken 6046164 times.
✓ Branch 1 taken 1007694 times.
|
7053858 | for (i = 0; i < 6; i++) { |
68 | 6046164 | int center = (low + high + 1) >> 1; | |
69 |
2/2✓ Branch 0 taken 3424102 times.
✓ Branch 1 taken 2622062 times.
|
6046164 | if (cache[center] >= bits) |
70 | 3424102 | high = center; | |
71 | else | ||
72 | 2622062 | low = center; | |
73 | } | ||
74 | |||
75 |
4/4✓ Branch 0 taken 861380 times.
✓ Branch 1 taken 146314 times.
✓ Branch 2 taken 408572 times.
✓ Branch 3 taken 599122 times.
|
1007694 | return (bits - (low == 0 ? -1 : cache[low]) <= cache[high] - bits) ? low : high; |
76 | } | ||
77 | |||
78 | 1019453 | static inline int celt_pulses2bits(const uint8_t *cache, int pulses) | |
79 | { | ||
80 | // TODO: Find the size of cache and make it into an array in the parameters list | ||
81 |
2/2✓ Branch 0 taken 880651 times.
✓ Branch 1 taken 138802 times.
|
1019453 | return (pulses == 0) ? 0 : cache[pulses] + 1; |
82 | } | ||
83 | |||
84 | 868892 | static inline void celt_normalize_residual(const int * restrict iy, float * restrict X, | |
85 | int N, float g) | ||
86 | { | ||
87 | int i; | ||
88 |
2/2✓ Branch 0 taken 7350932 times.
✓ Branch 1 taken 868892 times.
|
8219824 | for (i = 0; i < N; i++) |
89 | 7350932 | X[i] = g * iy[i]; | |
90 | 868892 | } | |
91 | |||
92 | 376059 | static void celt_exp_rotation_impl(float *X, uint32_t len, uint32_t stride, | |
93 | float c, float s) | ||
94 | { | ||
95 | float *Xptr; | ||
96 | int i; | ||
97 | |||
98 | 376059 | Xptr = X; | |
99 |
2/2✓ Branch 0 taken 5067813 times.
✓ Branch 1 taken 376059 times.
|
5443872 | for (i = 0; i < len - stride; i++) { |
100 | 5067813 | float x1 = Xptr[0]; | |
101 | 5067813 | float x2 = Xptr[stride]; | |
102 | 5067813 | Xptr[stride] = c * x2 + s * x1; | |
103 | 5067813 | *Xptr++ = c * x1 - s * x2; | |
104 | } | ||
105 | |||
106 | 376059 | Xptr = &X[len - 2 * stride - 1]; | |
107 |
2/2✓ Branch 0 taken 4223222 times.
✓ Branch 1 taken 376059 times.
|
4599281 | for (i = len - 2 * stride - 1; i >= 0; i--) { |
108 | 4223222 | float x1 = Xptr[0]; | |
109 | 4223222 | float x2 = Xptr[stride]; | |
110 | 4223222 | Xptr[stride] = c * x2 + s * x1; | |
111 | 4223222 | *Xptr-- = c * x1 - s * x2; | |
112 | } | ||
113 | 376059 | } | |
114 | |||
115 | 868892 | static inline void celt_exp_rotation(float *X, uint32_t len, | |
116 | uint32_t stride, uint32_t K, | ||
117 | enum CeltSpread spread, const int encode) | ||
118 | { | ||
119 | 868892 | uint32_t stride2 = 0; | |
120 | float c, s; | ||
121 | float gain, theta; | ||
122 | int i; | ||
123 | |||
124 |
4/4✓ Branch 0 taken 169420 times.
✓ Branch 1 taken 699472 times.
✓ Branch 2 taken 5544 times.
✓ Branch 3 taken 163876 times.
|
868892 | if (2*K >= len || spread == CELT_SPREAD_NONE) |
125 | 705016 | return; | |
126 | |||
127 | 163876 | gain = (float)len / (len + (20 - 5*spread) * K); | |
128 | 163876 | theta = M_PI * gain * gain / 4; | |
129 | |||
130 | 163876 | c = cosf(theta); | |
131 | 163876 | s = sinf(theta); | |
132 | |||
133 |
2/2✓ Branch 0 taken 139366 times.
✓ Branch 1 taken 24510 times.
|
163876 | if (len >= stride << 3) { |
134 | 139366 | stride2 = 1; | |
135 | /* This is just a simple (equivalent) way of computing sqrt(len/stride) with rounding. | ||
136 | It's basically incrementing long as (stride2+0.5)^2 < len/stride. */ | ||
137 |
2/2✓ Branch 0 taken 452565 times.
✓ Branch 1 taken 139366 times.
|
591931 | while ((stride2 * stride2 + stride2) * stride + (stride >> 2) < len) |
138 | 452565 | stride2++; | |
139 | } | ||
140 | |||
141 | 163876 | len /= stride; | |
142 |
2/2✓ Branch 0 taken 221705 times.
✓ Branch 1 taken 163876 times.
|
385581 | for (i = 0; i < stride; i++) { |
143 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 221705 times.
|
221705 | if (encode) { |
144 | ✗ | celt_exp_rotation_impl(X + i * len, len, 1, c, -s); | |
145 | ✗ | if (stride2) | |
146 | ✗ | celt_exp_rotation_impl(X + i * len, len, stride2, s, -c); | |
147 | } else { | ||
148 |
2/2✓ Branch 0 taken 154354 times.
✓ Branch 1 taken 67351 times.
|
221705 | if (stride2) |
149 | 154354 | celt_exp_rotation_impl(X + i * len, len, stride2, s, c); | |
150 | 221705 | celt_exp_rotation_impl(X + i * len, len, 1, c, s); | |
151 | } | ||
152 | } | ||
153 | } | ||
154 | |||
155 | 868892 | static inline uint32_t celt_extract_collapse_mask(const int *iy, uint32_t N, uint32_t B) | |
156 | { | ||
157 | 868892 | int i, j, N0 = N / B; | |
158 | 868892 | uint32_t collapse_mask = 0; | |
159 | |||
160 |
2/2✓ Branch 0 taken 742013 times.
✓ Branch 1 taken 126879 times.
|
868892 | if (B <= 1) |
161 | 742013 | return 1; | |
162 | |||
163 |
2/2✓ Branch 0 taken 408468 times.
✓ Branch 1 taken 126879 times.
|
535347 | for (i = 0; i < B; i++) |
164 |
2/2✓ Branch 0 taken 1118808 times.
✓ Branch 1 taken 408468 times.
|
1527276 | for (j = 0; j < N0; j++) |
165 | 1118808 | collapse_mask |= (!!iy[i*N0+j]) << i; | |
166 | 126879 | return collapse_mask; | |
167 | } | ||
168 | |||
169 | 186299 | static inline void celt_stereo_merge(float *X, float *Y, float mid, int N) | |
170 | { | ||
171 | int i; | ||
172 | 186299 | float xp = 0, side = 0; | |
173 | float E[2]; | ||
174 | float mid2; | ||
175 | float gain[2]; | ||
176 | |||
177 | /* Compute the norm of X+Y and X-Y as |X|^2 + |Y|^2 +/- sum(xy) */ | ||
178 |
2/2✓ Branch 0 taken 4294876 times.
✓ Branch 1 taken 186299 times.
|
4481175 | for (i = 0; i < N; i++) { |
179 | 4294876 | xp += X[i] * Y[i]; | |
180 | 4294876 | side += Y[i] * Y[i]; | |
181 | } | ||
182 | |||
183 | /* Compensating for the mid normalization */ | ||
184 | 186299 | xp *= mid; | |
185 | 186299 | mid2 = mid; | |
186 | 186299 | E[0] = mid2 * mid2 + side - 2 * xp; | |
187 | 186299 | E[1] = mid2 * mid2 + side + 2 * xp; | |
188 |
4/4✓ Branch 0 taken 186227 times.
✓ Branch 1 taken 72 times.
✓ Branch 2 taken 84 times.
✓ Branch 3 taken 186143 times.
|
186299 | if (E[0] < 6e-4f || E[1] < 6e-4f) { |
189 |
2/2✓ Branch 0 taken 998 times.
✓ Branch 1 taken 156 times.
|
1154 | for (i = 0; i < N; i++) |
190 | 998 | Y[i] = X[i]; | |
191 | 156 | return; | |
192 | } | ||
193 | |||
194 | 186143 | gain[0] = 1.0f / sqrtf(E[0]); | |
195 | 186143 | gain[1] = 1.0f / sqrtf(E[1]); | |
196 | |||
197 |
2/2✓ Branch 0 taken 4293878 times.
✓ Branch 1 taken 186143 times.
|
4480021 | for (i = 0; i < N; i++) { |
198 | float value[2]; | ||
199 | /* Apply mid scaling (side is already scaled) */ | ||
200 | 4293878 | value[0] = mid * X[i]; | |
201 | 4293878 | value[1] = Y[i]; | |
202 | 4293878 | X[i] = gain[0] * (value[0] - value[1]); | |
203 | 4293878 | Y[i] = gain[1] * (value[0] + value[1]); | |
204 | } | ||
205 | } | ||
206 | |||
207 | 140404 | static void celt_interleave_hadamard(float *tmp, float *X, int N0, | |
208 | int stride, int hadamard) | ||
209 | { | ||
210 | 140404 | int i, j, N = N0*stride; | |
211 |
2/2✓ Branch 0 taken 76152 times.
✓ Branch 1 taken 64252 times.
|
140404 | const uint8_t *order = &ff_celt_hadamard_order[hadamard ? stride - 2 : 30]; |
212 | |||
213 |
2/2✓ Branch 0 taken 747146 times.
✓ Branch 1 taken 140404 times.
|
887550 | for (i = 0; i < stride; i++) |
214 |
2/2✓ Branch 0 taken 3664528 times.
✓ Branch 1 taken 747146 times.
|
4411674 | for (j = 0; j < N0; j++) |
215 | 3664528 | tmp[j*stride+i] = X[order[i]*N0+j]; | |
216 | |||
217 | 140404 | memcpy(X, tmp, N*sizeof(float)); | |
218 | 140404 | } | |
219 | |||
220 | 91020 | static void celt_deinterleave_hadamard(float *tmp, float *X, int N0, | |
221 | int stride, int hadamard) | ||
222 | { | ||
223 | 91020 | int i, j, N = N0*stride; | |
224 |
2/2✓ Branch 0 taken 50902 times.
✓ Branch 1 taken 40118 times.
|
91020 | const uint8_t *order = &ff_celt_hadamard_order[hadamard ? stride - 2 : 30]; |
225 | |||
226 |
2/2✓ Branch 0 taken 467136 times.
✓ Branch 1 taken 91020 times.
|
558156 | for (i = 0; i < stride; i++) |
227 |
2/2✓ Branch 0 taken 2285770 times.
✓ Branch 1 taken 467136 times.
|
2752906 | for (j = 0; j < N0; j++) |
228 | 2285770 | tmp[order[i]*N0+j] = X[j*stride+i]; | |
229 | |||
230 | 91020 | memcpy(X, tmp, N*sizeof(float)); | |
231 | 91020 | } | |
232 | |||
233 | 356997 | static void celt_haar1(float *X, int N0, int stride) | |
234 | { | ||
235 | int i, j; | ||
236 | 356997 | N0 >>= 1; | |
237 |
2/2✓ Branch 0 taken 676243 times.
✓ Branch 1 taken 356997 times.
|
1033240 | for (i = 0; i < stride; i++) { |
238 |
2/2✓ Branch 0 taken 5132312 times.
✓ Branch 1 taken 676243 times.
|
5808555 | for (j = 0; j < N0; j++) { |
239 | 5132312 | float x0 = X[stride * (2 * j + 0) + i]; | |
240 | 5132312 | float x1 = X[stride * (2 * j + 1) + i]; | |
241 | 5132312 | X[stride * (2 * j + 0) + i] = (x0 + x1) * M_SQRT1_2; | |
242 | 5132312 | X[stride * (2 * j + 1) + i] = (x0 - x1) * M_SQRT1_2; | |
243 | } | ||
244 | } | ||
245 | 356997 | } | |
246 | |||
247 | 575935 | static inline int celt_compute_qn(int N, int b, int offset, int pulse_cap, | |
248 | int stereo) | ||
249 | { | ||
250 | int qn, qb; | ||
251 | 575935 | int N2 = 2 * N - 1; | |
252 |
4/4✓ Branch 0 taken 188735 times.
✓ Branch 1 taken 387200 times.
✓ Branch 2 taken 48661 times.
✓ Branch 3 taken 140074 times.
|
575935 | if (stereo && N == 2) |
253 | 48661 | N2--; | |
254 | |||
255 | /* The upper limit ensures that in a stereo split with itheta==16384, we'll | ||
256 | * always have enough bits left over to code at least one pulse in the | ||
257 | * side; otherwise it would collapse, since it doesn't get folded. */ | ||
258 | 575935 | qb = FFMIN3(b - pulse_cap - (4 << 3), (b + N2 * offset) / N2, 8 << 3); | |
259 |
2/2✓ Branch 0 taken 574220 times.
✓ Branch 1 taken 1715 times.
|
575935 | qn = (qb < (1 << 3 >> 1)) ? 1 : ((ff_celt_qn_exp2[qb & 0x7] >> (14 - (qb >> 3))) + 1) >> 1 << 1; |
260 | 575935 | return qn; | |
261 | } | ||
262 | |||
263 | /* Convert the quantized vector to an index */ | ||
264 | ✗ | static inline uint32_t celt_icwrsi(uint32_t N, uint32_t K, const int *y) | |
265 | { | ||
266 | ✗ | int i, idx = 0, sum = 0; | |
267 | ✗ | for (i = N - 1; i >= 0; i--) { | |
268 | ✗ | const uint32_t i_s = CELT_PVQ_U(N - i, sum + FFABS(y[i]) + 1); | |
269 | ✗ | idx += CELT_PVQ_U(N - i, sum) + (y[i] < 0)*i_s; | |
270 | ✗ | sum += FFABS(y[i]); | |
271 | } | ||
272 | ✗ | return idx; | |
273 | } | ||
274 | |||
275 | // this code was adapted from libopus | ||
276 | 868892 | static inline uint64_t celt_cwrsi(uint32_t N, uint32_t K, uint32_t i, int *y) | |
277 | { | ||
278 | 868892 | uint64_t norm = 0; | |
279 | uint32_t q, p; | ||
280 | int s, val; | ||
281 | int k0; | ||
282 | |||
283 |
2/2✓ Branch 0 taken 5613148 times.
✓ Branch 1 taken 868892 times.
|
6482040 | while (N > 2) { |
284 | /*Lots of pulses case:*/ | ||
285 |
2/2✓ Branch 0 taken 1668292 times.
✓ Branch 1 taken 3944856 times.
|
5613148 | if (K >= N) { |
286 | 1668292 | const uint32_t *row = ff_celt_pvq_u_row[N]; | |
287 | |||
288 | /* Are the pulses in this dimension negative? */ | ||
289 | 1668292 | p = row[K + 1]; | |
290 | 1668292 | s = -(i >= p); | |
291 | 1668292 | i -= p & s; | |
292 | |||
293 | /*Count how many pulses were placed in this dimension.*/ | ||
294 | 1668292 | k0 = K; | |
295 | 1668292 | q = row[N]; | |
296 |
2/2✓ Branch 0 taken 269151 times.
✓ Branch 1 taken 1399141 times.
|
1668292 | if (q > i) { |
297 | 269151 | K = N; | |
298 | do { | ||
299 | 387560 | p = ff_celt_pvq_u_row[--K][N]; | |
300 |
2/2✓ Branch 0 taken 118409 times.
✓ Branch 1 taken 269151 times.
|
387560 | } while (p > i); |
301 | } else | ||
302 |
2/2✓ Branch 0 taken 7353979 times.
✓ Branch 1 taken 1399141 times.
|
8753120 | for (p = row[K]; p > i; p = row[K]) |
303 | 7353979 | K--; | |
304 | |||
305 | 1668292 | i -= p; | |
306 | 1668292 | val = (k0 - K + s) ^ s; | |
307 | 1668292 | norm += val * val; | |
308 | 1668292 | *y++ = val; | |
309 | } else { /*Lots of dimensions case:*/ | ||
310 | /*Are there any pulses in this dimension at all?*/ | ||
311 | 3944856 | p = ff_celt_pvq_u_row[K ][N]; | |
312 | 3944856 | q = ff_celt_pvq_u_row[K + 1][N]; | |
313 | |||
314 |
4/4✓ Branch 0 taken 3392797 times.
✓ Branch 1 taken 552059 times.
✓ Branch 2 taken 2840145 times.
✓ Branch 3 taken 552652 times.
|
3944856 | if (p <= i && i < q) { |
315 | 2840145 | i -= p; | |
316 | 2840145 | *y++ = 0; | |
317 | } else { | ||
318 | /*Are the pulses in this dimension negative?*/ | ||
319 | 1104711 | s = -(i >= q); | |
320 | 1104711 | i -= q & s; | |
321 | |||
322 | /*Count how many pulses were placed in this dimension.*/ | ||
323 | 1104711 | k0 = K; | |
324 | 1286305 | do p = ff_celt_pvq_u_row[--K][N]; | |
325 |
2/2✓ Branch 0 taken 181594 times.
✓ Branch 1 taken 1104711 times.
|
1286305 | while (p > i); |
326 | |||
327 | 1104711 | i -= p; | |
328 | 1104711 | val = (k0 - K + s) ^ s; | |
329 | 1104711 | norm += val * val; | |
330 | 1104711 | *y++ = val; | |
331 | } | ||
332 | } | ||
333 | 5613148 | N--; | |
334 | } | ||
335 | |||
336 | /* N == 2 */ | ||
337 | 868892 | p = 2 * K + 1; | |
338 | 868892 | s = -(i >= p); | |
339 | 868892 | i -= p & s; | |
340 | 868892 | k0 = K; | |
341 | 868892 | K = (i + 1) / 2; | |
342 | |||
343 |
2/2✓ Branch 0 taken 612521 times.
✓ Branch 1 taken 256371 times.
|
868892 | if (K) |
344 | 612521 | i -= 2 * K - 1; | |
345 | |||
346 | 868892 | val = (k0 - K + s) ^ s; | |
347 | 868892 | norm += val * val; | |
348 | 868892 | *y++ = val; | |
349 | |||
350 | /* N==1 */ | ||
351 | 868892 | s = -i; | |
352 | 868892 | val = (K + s) ^ s; | |
353 | 868892 | norm += val * val; | |
354 | 868892 | *y = val; | |
355 | |||
356 | 868892 | return norm; | |
357 | } | ||
358 | |||
359 | ✗ | static inline void celt_encode_pulses(OpusRangeCoder *rc, int *y, uint32_t N, uint32_t K) | |
360 | { | ||
361 | ✗ | ff_opus_rc_enc_uint(rc, celt_icwrsi(N, K, y), CELT_PVQ_V(N, K)); | |
362 | ✗ | } | |
363 | |||
364 | 868892 | static inline float celt_decode_pulses(OpusRangeCoder *rc, int *y, uint32_t N, uint32_t K) | |
365 | { | ||
366 |
4/4✓ Branch 0 taken 313633 times.
✓ Branch 1 taken 555259 times.
✓ Branch 2 taken 281486 times.
✓ Branch 3 taken 587406 times.
|
868892 | const uint32_t idx = ff_opus_rc_dec_uint(rc, CELT_PVQ_V(N, K)); |
367 | 868892 | return celt_cwrsi(N, K, idx, y); | |
368 | } | ||
369 | |||
370 | #if CONFIG_OPUS_ENCODER | ||
371 | /* | ||
372 | * Faster than libopus's search, operates entirely in the signed domain. | ||
373 | * Slightly worse/better depending on N, K and the input vector. | ||
374 | */ | ||
375 | ✗ | static float ppp_pvq_search_c(float *X, int *y, int K, int N) | |
376 | { | ||
377 | ✗ | int i, y_norm = 0; | |
378 | ✗ | float res = 0.0f, xy_norm = 0.0f; | |
379 | |||
380 | ✗ | for (i = 0; i < N; i++) | |
381 | ✗ | res += FFABS(X[i]); | |
382 | |||
383 | ✗ | res = K/(res + FLT_EPSILON); | |
384 | |||
385 | ✗ | for (i = 0; i < N; i++) { | |
386 | ✗ | y[i] = lrintf(res*X[i]); | |
387 | ✗ | y_norm += y[i]*y[i]; | |
388 | ✗ | xy_norm += y[i]*X[i]; | |
389 | ✗ | K -= FFABS(y[i]); | |
390 | } | ||
391 | |||
392 | ✗ | while (K) { | |
393 | ✗ | int max_idx = 0, phase = FFSIGN(K); | |
394 | ✗ | float max_num = 0.0f; | |
395 | ✗ | float max_den = 1.0f; | |
396 | ✗ | y_norm += 1.0f; | |
397 | |||
398 | ✗ | for (i = 0; i < N; i++) { | |
399 | /* If the sum has been overshot and the best place has 0 pulses allocated | ||
400 | * to it, attempting to decrease it further will actually increase the | ||
401 | * sum. Prevent this by disregarding any 0 positions when decrementing. */ | ||
402 | ✗ | const int ca = 1 ^ ((y[i] == 0) & (phase < 0)); | |
403 | ✗ | const int y_new = y_norm + 2*phase*FFABS(y[i]); | |
404 | ✗ | float xy_new = xy_norm + 1*phase*FFABS(X[i]); | |
405 | ✗ | xy_new = xy_new * xy_new; | |
406 | ✗ | if (ca && (max_den*xy_new) > (y_new*max_num)) { | |
407 | ✗ | max_den = y_new; | |
408 | ✗ | max_num = xy_new; | |
409 | ✗ | max_idx = i; | |
410 | } | ||
411 | } | ||
412 | |||
413 | ✗ | K -= phase; | |
414 | |||
415 | ✗ | phase *= FFSIGN(X[max_idx]); | |
416 | ✗ | xy_norm += 1*phase*X[max_idx]; | |
417 | ✗ | y_norm += 2*phase*y[max_idx]; | |
418 | ✗ | y[max_idx] += phase; | |
419 | } | ||
420 | |||
421 | ✗ | return (float)y_norm; | |
422 | } | ||
423 | #endif | ||
424 | |||
425 | ✗ | static uint32_t celt_alg_quant(OpusRangeCoder *rc, float *X, uint32_t N, uint32_t K, | |
426 | enum CeltSpread spread, uint32_t blocks, float gain, | ||
427 | CeltPVQ *pvq) | ||
428 | { | ||
429 | ✗ | int *y = pvq->qcoeff; | |
430 | |||
431 | ✗ | celt_exp_rotation(X, N, blocks, K, spread, 1); | |
432 | ✗ | gain /= sqrtf(pvq->pvq_search(X, y, K, N)); | |
433 | ✗ | celt_encode_pulses(rc, y, N, K); | |
434 | ✗ | celt_normalize_residual(y, X, N, gain); | |
435 | ✗ | celt_exp_rotation(X, N, blocks, K, spread, 0); | |
436 | ✗ | return celt_extract_collapse_mask(y, N, blocks); | |
437 | } | ||
438 | |||
439 | /** Decode pulse vector and combine the result with the pitch vector to produce | ||
440 | the final normalised signal in the current band. */ | ||
441 | 868892 | static uint32_t celt_alg_unquant(OpusRangeCoder *rc, float *X, uint32_t N, uint32_t K, | |
442 | enum CeltSpread spread, uint32_t blocks, float gain, | ||
443 | CeltPVQ *pvq) | ||
444 | { | ||
445 | 868892 | int *y = pvq->qcoeff; | |
446 | |||
447 | 868892 | gain /= sqrtf(celt_decode_pulses(rc, y, N, K)); | |
448 | 868892 | celt_normalize_residual(y, X, N, gain); | |
449 | 868892 | celt_exp_rotation(X, N, blocks, K, spread, 0); | |
450 | 868892 | return celt_extract_collapse_mask(y, N, blocks); | |
451 | } | ||
452 | |||
453 | ✗ | static int celt_calc_theta(const float *X, const float *Y, int coupling, int N) | |
454 | { | ||
455 | int i; | ||
456 | ✗ | float e[2] = { 0.0f, 0.0f }; | |
457 | ✗ | if (coupling) { /* Coupling case */ | |
458 | ✗ | for (i = 0; i < N; i++) { | |
459 | ✗ | e[0] += (X[i] + Y[i])*(X[i] + Y[i]); | |
460 | ✗ | e[1] += (X[i] - Y[i])*(X[i] - Y[i]); | |
461 | } | ||
462 | } else { | ||
463 | ✗ | for (i = 0; i < N; i++) { | |
464 | ✗ | e[0] += X[i]*X[i]; | |
465 | ✗ | e[1] += Y[i]*Y[i]; | |
466 | } | ||
467 | } | ||
468 | ✗ | return lrintf(32768.0f*atan2f(sqrtf(e[1]), sqrtf(e[0]))/M_PI); | |
469 | } | ||
470 | |||
471 | ✗ | static void celt_stereo_is_decouple(float *X, float *Y, float e_l, float e_r, int N) | |
472 | { | ||
473 | int i; | ||
474 | ✗ | const float energy_n = 1.0f/(sqrtf(e_l*e_l + e_r*e_r) + FLT_EPSILON); | |
475 | ✗ | e_l *= energy_n; | |
476 | ✗ | e_r *= energy_n; | |
477 | ✗ | for (i = 0; i < N; i++) | |
478 | ✗ | X[i] = e_l*X[i] + e_r*Y[i]; | |
479 | ✗ | } | |
480 | |||
481 | ✗ | static void celt_stereo_ms_decouple(float *X, float *Y, int N) | |
482 | { | ||
483 | int i; | ||
484 | ✗ | for (i = 0; i < N; i++) { | |
485 | ✗ | const float Xret = X[i]; | |
486 | ✗ | X[i] = (X[i] + Y[i])*M_SQRT1_2; | |
487 | ✗ | Y[i] = (Y[i] - Xret)*M_SQRT1_2; | |
488 | } | ||
489 | ✗ | } | |
490 | |||
491 | 1745036 | static av_always_inline uint32_t quant_band_template(CeltPVQ *pvq, CeltFrame *f, | |
492 | OpusRangeCoder *rc, | ||
493 | const int band, float *X, | ||
494 | float *Y, int N, int b, | ||
495 | uint32_t blocks, float *lowband, | ||
496 | int duration, float *lowband_out, | ||
497 | int level, float gain, | ||
498 | float *lowband_scratch, | ||
499 | int fill, int quant) | ||
500 | { | ||
501 | int i; | ||
502 | const uint8_t *cache; | ||
503 | 1745036 | int stereo = !!Y, split = stereo; | |
504 | 1745036 | int imid = 0, iside = 0; | |
505 | 1745036 | uint32_t N0 = N; | |
506 | 1745036 | int N_B = N / blocks; | |
507 | 1745036 | int N_B0 = N_B; | |
508 | 1745036 | int B0 = blocks; | |
509 | 1745036 | int time_divide = 0; | |
510 | 1745036 | int recombine = 0; | |
511 | 1745036 | int inv = 0; | |
512 | 1745036 | float mid = 0, side = 0; | |
513 | 1745036 | int longblocks = (B0 == 1); | |
514 | 1745036 | uint32_t cm = 0; | |
515 | |||
516 |
2/2✓ Branch 0 taken 109648 times.
✓ Branch 1 taken 1635388 times.
|
1745036 | if (N == 1) { |
517 | 109648 | float *x = X; | |
518 |
2/2✓ Branch 0 taken 176024 times.
✓ Branch 1 taken 109648 times.
|
285672 | for (i = 0; i <= stereo; i++) { |
519 | 176024 | int sign = 0; | |
520 |
2/2✓ Branch 0 taken 169213 times.
✓ Branch 1 taken 6811 times.
|
176024 | if (f->remaining2 >= 1 << 3) { |
521 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 169213 times.
|
169213 | if (quant) { |
522 | ✗ | sign = x[0] < 0; | |
523 | ✗ | ff_opus_rc_put_raw(rc, sign, 1); | |
524 | } else { | ||
525 | 169213 | sign = ff_opus_rc_get_raw(rc, 1); | |
526 | } | ||
527 | 169213 | f->remaining2 -= 1 << 3; | |
528 | } | ||
529 | 176024 | x[0] = 1.0f - 2.0f*sign; | |
530 | 176024 | x = Y; | |
531 | } | ||
532 |
1/2✓ Branch 0 taken 109648 times.
✗ Branch 1 not taken.
|
109648 | if (lowband_out) |
533 | 109648 | lowband_out[0] = X[0]; | |
534 | 109648 | return 1; | |
535 | } | ||
536 | |||
537 |
4/4✓ Branch 0 taken 1394894 times.
✓ Branch 1 taken 240494 times.
✓ Branch 2 taken 620494 times.
✓ Branch 3 taken 774400 times.
|
1635388 | if (!stereo && level == 0) { |
538 | 620494 | int tf_change = f->tf_change[band]; | |
539 | int k; | ||
540 |
2/2✓ Branch 0 taken 40217 times.
✓ Branch 1 taken 580277 times.
|
620494 | if (tf_change > 0) |
541 | 40217 | recombine = tf_change; | |
542 | /* Band recombining to increase frequency resolution */ | ||
543 | |||
544 |
4/4✓ Branch 0 taken 371425 times.
✓ Branch 1 taken 249069 times.
✓ Branch 2 taken 345583 times.
✓ Branch 3 taken 25842 times.
|
620494 | if (lowband && |
545 |
6/6✓ Branch 0 taken 334650 times.
✓ Branch 1 taken 10933 times.
✓ Branch 2 taken 275618 times.
✓ Branch 3 taken 59032 times.
✓ Branch 4 taken 23601 times.
✓ Branch 5 taken 262950 times.
|
345583 | (recombine || ((N_B & 1) == 0 && tf_change < 0) || B0 > 1)) { |
546 |
2/2✓ Branch 0 taken 2682290 times.
✓ Branch 1 taken 108475 times.
|
2790765 | for (i = 0; i < N; i++) |
547 | 2682290 | lowband_scratch[i] = lowband[i]; | |
548 | 108475 | lowband = lowband_scratch; | |
549 | } | ||
550 | |||
551 |
2/2✓ Branch 0 taken 67800 times.
✓ Branch 1 taken 620494 times.
|
688294 | for (k = 0; k < recombine; k++) { |
552 |
3/4✓ Branch 0 taken 67800 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 42647 times.
✓ Branch 3 taken 25153 times.
|
67800 | if (quant || lowband) |
553 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 42647 times.
|
42647 | celt_haar1(quant ? X : lowband, N >> k, 1 << k); |
554 | 67800 | fill = ff_celt_bit_interleave[fill & 0xF] | ff_celt_bit_interleave[fill >> 4] << 2; | |
555 | } | ||
556 | 620494 | blocks >>= recombine; | |
557 | 620494 | N_B <<= recombine; | |
558 | |||
559 | /* Increasing the time resolution */ | ||
560 |
4/4✓ Branch 0 taken 719652 times.
✓ Branch 1 taken 50519 times.
✓ Branch 2 taken 149677 times.
✓ Branch 3 taken 569975 times.
|
770171 | while ((N_B & 1) == 0 && tf_change < 0) { |
561 |
3/4✓ Branch 0 taken 149677 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 96873 times.
✓ Branch 3 taken 52804 times.
|
149677 | if (quant || lowband) |
562 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 96873 times.
|
96873 | celt_haar1(quant ? X : lowband, N_B, blocks); |
563 | 149677 | fill |= fill << blocks; | |
564 | 149677 | blocks <<= 1; | |
565 | 149677 | N_B >>= 1; | |
566 | 149677 | time_divide++; | |
567 | 149677 | tf_change++; | |
568 | } | ||
569 | 620494 | B0 = blocks; | |
570 | 620494 | N_B0 = N_B; | |
571 | |||
572 | /* Reorganize the samples in time order instead of frequency order */ | ||
573 |
5/6✓ Branch 0 taken 140404 times.
✓ Branch 1 taken 480090 times.
✓ Branch 2 taken 140404 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 91020 times.
✓ Branch 5 taken 49384 times.
|
620494 | if (B0 > 1 && (quant || lowband)) |
574 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 91020 times.
|
91020 | celt_deinterleave_hadamard(pvq->hadamard_tmp, quant ? X : lowband, |
575 | N_B >> recombine, B0 << recombine, | ||
576 | longblocks); | ||
577 | } | ||
578 | |||
579 | /* If we need 1.5 more bit than we can produce, split the band in two. */ | ||
580 | 1635388 | cache = ff_celt_cache_bits + | |
581 | 1635388 | ff_celt_cache_index[(duration + 1) * CELT_MAX_BANDS + band]; | |
582 |
8/8✓ Branch 0 taken 1394894 times.
✓ Branch 1 taken 240494 times.
✓ Branch 2 taken 1195112 times.
✓ Branch 3 taken 199782 times.
✓ Branch 4 taken 441684 times.
✓ Branch 5 taken 753428 times.
✓ Branch 6 taken 387200 times.
✓ Branch 7 taken 54484 times.
|
1635388 | if (!stereo && duration >= 0 && b > cache[cache[0]] + 12 && N > 2) { |
583 | 387200 | N >>= 1; | |
584 | 387200 | Y = X + N; | |
585 | 387200 | split = 1; | |
586 | 387200 | duration -= 1; | |
587 |
2/2✓ Branch 0 taken 245873 times.
✓ Branch 1 taken 141327 times.
|
387200 | if (blocks == 1) |
588 | 245873 | fill = (fill & 1) | (fill << 1); | |
589 | 387200 | blocks = (blocks + 1) >> 1; | |
590 | } | ||
591 | |||
592 |
2/2✓ Branch 0 taken 627694 times.
✓ Branch 1 taken 1007694 times.
|
1635388 | if (split) { |
593 | int qn; | ||
594 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 627694 times.
|
627694 | int itheta = quant ? celt_calc_theta(X, Y, stereo, N) : 0; |
595 | int mbits, sbits, delta; | ||
596 | int qalloc; | ||
597 | int pulse_cap; | ||
598 | int offset; | ||
599 | int orig_fill; | ||
600 | int tell; | ||
601 | |||
602 | /* Decide on the resolution to give to the split parameter theta */ | ||
603 | 627694 | pulse_cap = ff_celt_log_freq_range[band] + duration * 8; | |
604 |
4/4✓ Branch 0 taken 240494 times.
✓ Branch 1 taken 387200 times.
✓ Branch 2 taken 54195 times.
✓ Branch 3 taken 186299 times.
|
627694 | offset = (pulse_cap >> 1) - (stereo && N == 2 ? CELT_QTHETA_OFFSET_TWOPHASE : |
605 | CELT_QTHETA_OFFSET); | ||
606 |
4/4✓ Branch 0 taken 240494 times.
✓ Branch 1 taken 387200 times.
✓ Branch 2 taken 188735 times.
✓ Branch 3 taken 51759 times.
|
627694 | qn = (stereo && band >= f->intensity_stereo) ? 1 : |
607 | 575935 | celt_compute_qn(N, b, offset, pulse_cap, stereo); | |
608 | 627694 | tell = opus_rc_tell_frac(rc); | |
609 |
2/2✓ Branch 0 taken 574220 times.
✓ Branch 1 taken 53474 times.
|
627694 | if (qn != 1) { |
610 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 574220 times.
|
574220 | if (quant) |
611 | ✗ | itheta = (itheta*qn + 8192) >> 14; | |
612 | /* Entropy coding of the angle. We use a uniform pdf for the | ||
613 | * time split, a step for stereo, and a triangular one for the rest. */ | ||
614 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 574220 times.
|
574220 | if (quant) { |
615 | ✗ | if (stereo && N > 2) | |
616 | ✗ | ff_opus_rc_enc_uint_step(rc, itheta, qn / 2); | |
617 | ✗ | else if (stereo || B0 > 1) | |
618 | ✗ | ff_opus_rc_enc_uint(rc, itheta, qn + 1); | |
619 | else | ||
620 | ✗ | ff_opus_rc_enc_uint_tri(rc, itheta, qn); | |
621 | ✗ | itheta = itheta * 16384 / qn; | |
622 | ✗ | if (stereo) { | |
623 | ✗ | if (itheta == 0) | |
624 | ✗ | celt_stereo_is_decouple(X, Y, f->block[0].lin_energy[band], | |
625 | f->block[1].lin_energy[band], N); | ||
626 | else | ||
627 | ✗ | celt_stereo_ms_decouple(X, Y, N); | |
628 | } | ||
629 | } else { | ||
630 |
4/4✓ Branch 0 taken 187020 times.
✓ Branch 1 taken 387200 times.
✓ Branch 2 taken 138861 times.
✓ Branch 3 taken 48159 times.
|
574220 | if (stereo && N > 2) |
631 | 138861 | itheta = ff_opus_rc_dec_uint_step(rc, qn / 2); | |
632 |
4/4✓ Branch 0 taken 387200 times.
✓ Branch 1 taken 48159 times.
✓ Branch 2 taken 141327 times.
✓ Branch 3 taken 245873 times.
|
435359 | else if (stereo || B0 > 1) |
633 | 189486 | itheta = ff_opus_rc_dec_uint(rc, qn+1); | |
634 | else | ||
635 | 245873 | itheta = ff_opus_rc_dec_uint_tri(rc, qn); | |
636 | 574220 | itheta = itheta * 16384 / qn; | |
637 | } | ||
638 |
1/2✓ Branch 0 taken 53474 times.
✗ Branch 1 not taken.
|
53474 | } else if (stereo) { |
639 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 53474 times.
|
53474 | if (quant) { |
640 | ✗ | inv = f->apply_phase_inv ? itheta > 8192 : 0; | |
641 | ✗ | if (inv) { | |
642 | ✗ | for (i = 0; i < N; i++) | |
643 | ✗ | Y[i] *= -1; | |
644 | } | ||
645 | ✗ | celt_stereo_is_decouple(X, Y, f->block[0].lin_energy[band], | |
646 | f->block[1].lin_energy[band], N); | ||
647 | |||
648 | ✗ | if (b > 2 << 3 && f->remaining2 > 2 << 3) { | |
649 | ✗ | ff_opus_rc_enc_log(rc, inv, 2); | |
650 | } else { | ||
651 | ✗ | inv = 0; | |
652 | } | ||
653 | } else { | ||
654 |
3/4✓ Branch 0 taken 19635 times.
✓ Branch 1 taken 33839 times.
✓ Branch 2 taken 19635 times.
✗ Branch 3 not taken.
|
53474 | inv = (b > 2 << 3 && f->remaining2 > 2 << 3) ? ff_opus_rc_dec_log(rc, 2) : 0; |
655 |
1/2✓ Branch 0 taken 53474 times.
✗ Branch 1 not taken.
|
53474 | inv = f->apply_phase_inv ? inv : 0; |
656 | } | ||
657 | 53474 | itheta = 0; | |
658 | } | ||
659 | 627694 | qalloc = opus_rc_tell_frac(rc) - tell; | |
660 | 627694 | b -= qalloc; | |
661 | |||
662 | 627694 | orig_fill = fill; | |
663 |
2/2✓ Branch 0 taken 105759 times.
✓ Branch 1 taken 521935 times.
|
627694 | if (itheta == 0) { |
664 | 105759 | imid = 32767; | |
665 | 105759 | iside = 0; | |
666 | 105759 | fill = av_zero_extend(fill, blocks); | |
667 | 105759 | delta = -16384; | |
668 |
2/2✓ Branch 0 taken 2384 times.
✓ Branch 1 taken 519551 times.
|
521935 | } else if (itheta == 16384) { |
669 | 2384 | imid = 0; | |
670 | 2384 | iside = 32767; | |
671 | 2384 | fill &= ((1 << blocks) - 1) << blocks; | |
672 | 2384 | delta = 16384; | |
673 | } else { | ||
674 | 519551 | imid = celt_cos(itheta); | |
675 | 519551 | iside = celt_cos(16384-itheta); | |
676 | /* This is the mid vs side allocation that minimizes squared error | ||
677 | in that band. */ | ||
678 | 519551 | delta = ROUND_MUL16((N - 1) << 7, celt_log2tan(iside, imid)); | |
679 | } | ||
680 | |||
681 | 627694 | mid = imid / 32768.0f; | |
682 | 627694 | side = iside / 32768.0f; | |
683 | |||
684 | /* This is a special case for N=2 that only works for stereo and takes | ||
685 | advantage of the fact that mid and side are orthogonal to encode | ||
686 | the side with just one bit. */ | ||
687 |
4/4✓ Branch 0 taken 104284 times.
✓ Branch 1 taken 523410 times.
✓ Branch 2 taken 54195 times.
✓ Branch 3 taken 50089 times.
|
627694 | if (N == 2 && stereo) { |
688 | int c; | ||
689 | 54195 | int sign = 0; | |
690 | float tmp; | ||
691 | float *x2, *y2; | ||
692 | 54195 | mbits = b; | |
693 | /* Only need one bit for the side */ | ||
694 |
4/4✓ Branch 0 taken 30179 times.
✓ Branch 1 taken 24016 times.
✓ Branch 2 taken 28840 times.
✓ Branch 3 taken 1339 times.
|
54195 | sbits = (itheta != 0 && itheta != 16384) ? 1 << 3 : 0; |
695 | 54195 | mbits -= sbits; | |
696 | 54195 | c = (itheta > 8192); | |
697 | 54195 | f->remaining2 -= qalloc+sbits; | |
698 | |||
699 |
2/2✓ Branch 0 taken 11376 times.
✓ Branch 1 taken 42819 times.
|
54195 | x2 = c ? Y : X; |
700 |
2/2✓ Branch 0 taken 11376 times.
✓ Branch 1 taken 42819 times.
|
54195 | y2 = c ? X : Y; |
701 |
2/2✓ Branch 0 taken 28840 times.
✓ Branch 1 taken 25355 times.
|
54195 | if (sbits) { |
702 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 28840 times.
|
28840 | if (quant) { |
703 | ✗ | sign = x2[0]*y2[1] - x2[1]*y2[0] < 0; | |
704 | ✗ | ff_opus_rc_put_raw(rc, sign, 1); | |
705 | } else { | ||
706 | 28840 | sign = ff_opus_rc_get_raw(rc, 1); | |
707 | } | ||
708 | } | ||
709 | 54195 | sign = 1 - 2 * sign; | |
710 | /* We use orig_fill here because we want to fold the side, but if | ||
711 | itheta==16384, we'll have cleared the low bits of fill. */ | ||
712 | 54195 | cm = pvq->quant_band(pvq, f, rc, band, x2, NULL, N, mbits, blocks, lowband, duration, | |
713 | lowband_out, level, gain, lowband_scratch, orig_fill); | ||
714 | /* We don't split N=2 bands, so cm is either 1 or 0 (for a fold-collapse), | ||
715 | and there's no need to worry about mixing with the other channel. */ | ||
716 | 54195 | y2[0] = -sign * x2[1]; | |
717 | 54195 | y2[1] = sign * x2[0]; | |
718 | 54195 | X[0] *= mid; | |
719 | 54195 | X[1] *= mid; | |
720 | 54195 | Y[0] *= side; | |
721 | 54195 | Y[1] *= side; | |
722 | 54195 | tmp = X[0]; | |
723 | 54195 | X[0] = tmp - Y[0]; | |
724 | 54195 | Y[0] = tmp + Y[0]; | |
725 | 54195 | tmp = X[1]; | |
726 | 54195 | X[1] = tmp - Y[1]; | |
727 | 54195 | Y[1] = tmp + Y[1]; | |
728 | } else { | ||
729 | /* "Normal" split code */ | ||
730 | 573499 | float *next_lowband2 = NULL; | |
731 | 573499 | float *next_lowband_out1 = NULL; | |
732 | 573499 | int next_level = 0; | |
733 | int rebalance; | ||
734 | uint32_t cmt; | ||
735 | |||
736 | /* Give more bits to low-energy MDCTs than they would | ||
737 | * otherwise deserve */ | ||
738 |
6/6✓ Branch 0 taken 170425 times.
✓ Branch 1 taken 403074 times.
✓ Branch 2 taken 141327 times.
✓ Branch 3 taken 29098 times.
✓ Branch 4 taken 140343 times.
✓ Branch 5 taken 984 times.
|
573499 | if (B0 > 1 && !stereo && (itheta & 0x3fff)) { |
739 |
2/2✓ Branch 0 taken 61276 times.
✓ Branch 1 taken 79067 times.
|
140343 | if (itheta > 8192) |
740 | /* Rough approximation for pre-echo masking */ | ||
741 | 61276 | delta -= delta >> (4 - duration); | |
742 | else | ||
743 | /* Corresponds to a forward-masking slope of | ||
744 | * 1.5 dB per 10 ms */ | ||
745 | 79067 | delta = FFMIN(0, delta + (N << 3 >> (5 - duration))); | |
746 | } | ||
747 | 573499 | mbits = av_clip((b - delta) / 2, 0, b); | |
748 | 573499 | sbits = b - mbits; | |
749 | 573499 | f->remaining2 -= qalloc; | |
750 | |||
751 |
4/4✓ Branch 0 taken 452857 times.
✓ Branch 1 taken 120642 times.
✓ Branch 2 taken 292705 times.
✓ Branch 3 taken 160152 times.
|
573499 | if (lowband && !stereo) |
752 | 292705 | next_lowband2 = lowband + N; /* >32-bit split case */ | |
753 | |||
754 | /* Only stereo needs to pass on lowband_out. | ||
755 | * Otherwise, it's handled at the end */ | ||
756 |
2/2✓ Branch 0 taken 186299 times.
✓ Branch 1 taken 387200 times.
|
573499 | if (stereo) |
757 | 186299 | next_lowband_out1 = lowband_out; | |
758 | else | ||
759 | 387200 | next_level = level + 1; | |
760 | |||
761 | 573499 | rebalance = f->remaining2; | |
762 |
2/2✓ Branch 0 taken 351878 times.
✓ Branch 1 taken 221621 times.
|
573499 | if (mbits >= sbits) { |
763 | /* In stereo mode, we do not apply a scaling to the mid | ||
764 | * because we need the normalized mid for folding later */ | ||
765 |
2/2✓ Branch 0 taken 202679 times.
✓ Branch 1 taken 149199 times.
|
351878 | cm = pvq->quant_band(pvq, f, rc, band, X, NULL, N, mbits, blocks, |
766 | lowband, duration, next_lowband_out1, next_level, | ||
767 | stereo ? 1.0f : (gain * mid), lowband_scratch, fill); | ||
768 | 351878 | rebalance = mbits - (rebalance - f->remaining2); | |
769 |
4/4✓ Branch 0 taken 95802 times.
✓ Branch 1 taken 256076 times.
✓ Branch 2 taken 86613 times.
✓ Branch 3 taken 9189 times.
|
351878 | if (rebalance > 3 << 3 && itheta != 0) |
770 | 86613 | sbits += rebalance - (3 << 3); | |
771 | |||
772 | /* For a stereo split, the high bits of fill are always zero, | ||
773 | * so no folding will be done to the side. */ | ||
774 | 351878 | cmt = pvq->quant_band(pvq, f, rc, band, Y, NULL, N, sbits, blocks, | |
775 | next_lowband2, duration, NULL, next_level, | ||
776 | gain * side, NULL, fill >> blocks); | ||
777 | 351878 | cm |= cmt << ((B0 >> 1) & (stereo - 1)); | |
778 | } else { | ||
779 | /* For a stereo split, the high bits of fill are always zero, | ||
780 | * so no folding will be done to the side. */ | ||
781 | 221621 | cm = pvq->quant_band(pvq, f, rc, band, Y, NULL, N, sbits, blocks, | |
782 | next_lowband2, duration, NULL, next_level, | ||
783 | gain * side, NULL, fill >> blocks); | ||
784 | 221621 | cm <<= ((B0 >> 1) & (stereo - 1)); | |
785 | 221621 | rebalance = sbits - (rebalance - f->remaining2); | |
786 |
4/4✓ Branch 0 taken 81295 times.
✓ Branch 1 taken 140326 times.
✓ Branch 2 taken 81050 times.
✓ Branch 3 taken 245 times.
|
221621 | if (rebalance > 3 << 3 && itheta != 16384) |
787 | 81050 | mbits += rebalance - (3 << 3); | |
788 | |||
789 | /* In stereo mode, we do not apply a scaling to the mid because | ||
790 | * we need the normalized mid for folding later */ | ||
791 |
2/2✓ Branch 0 taken 184521 times.
✓ Branch 1 taken 37100 times.
|
221621 | cm |= pvq->quant_band(pvq, f, rc, band, X, NULL, N, mbits, blocks, |
792 | lowband, duration, next_lowband_out1, next_level, | ||
793 | stereo ? 1.0f : (gain * mid), lowband_scratch, fill); | ||
794 | } | ||
795 | } | ||
796 | } else { | ||
797 | /* This is the basic no-split case */ | ||
798 | 1007694 | uint32_t q = celt_bits2pulses(cache, b); | |
799 | 1007694 | uint32_t curr_bits = celt_pulses2bits(cache, q); | |
800 | 1007694 | f->remaining2 -= curr_bits; | |
801 | |||
802 | /* Ensures we can never bust the budget */ | ||
803 |
4/4✓ Branch 0 taken 14994 times.
✓ Branch 1 taken 1004459 times.
✓ Branch 2 taken 11759 times.
✓ Branch 3 taken 3235 times.
|
1019453 | while (f->remaining2 < 0 && q > 0) { |
804 | 11759 | f->remaining2 += curr_bits; | |
805 | 11759 | curr_bits = celt_pulses2bits(cache, --q); | |
806 | 11759 | f->remaining2 -= curr_bits; | |
807 | } | ||
808 | |||
809 |
2/2✓ Branch 0 taken 868892 times.
✓ Branch 1 taken 138802 times.
|
1007694 | if (q != 0) { |
810 | /* Finally do the actual (de)quantization */ | ||
811 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 868892 times.
|
868892 | if (quant) { |
812 | ✗ | cm = celt_alg_quant(rc, X, N, (q < 8) ? q : (8 + (q & 7)) << ((q >> 3) - 1), | |
813 | f->spread, blocks, gain, pvq); | ||
814 | } else { | ||
815 |
2/2✓ Branch 0 taken 558333 times.
✓ Branch 1 taken 310559 times.
|
868892 | cm = celt_alg_unquant(rc, X, N, (q < 8) ? q : (8 + (q & 7)) << ((q >> 3) - 1), |
816 | f->spread, blocks, gain, pvq); | ||
817 | } | ||
818 | } else { | ||
819 | /* If there's no pulse, fill the band anyway */ | ||
820 | 138802 | uint32_t cm_mask = (1 << blocks) - 1; | |
821 | 138802 | fill &= cm_mask; | |
822 |
2/2✓ Branch 0 taken 54173 times.
✓ Branch 1 taken 84629 times.
|
138802 | if (fill) { |
823 |
2/2✓ Branch 0 taken 9195 times.
✓ Branch 1 taken 44978 times.
|
54173 | if (!lowband) { |
824 | /* Noise */ | ||
825 |
2/2✓ Branch 0 taken 212472 times.
✓ Branch 1 taken 9195 times.
|
221667 | for (i = 0; i < N; i++) |
826 | 212472 | X[i] = (((int32_t)celt_rng(f)) >> 20); | |
827 | 9195 | cm = cm_mask; | |
828 | } else { | ||
829 | /* Folded spectrum */ | ||
830 |
2/2✓ Branch 0 taken 1772186 times.
✓ Branch 1 taken 44978 times.
|
1817164 | for (i = 0; i < N; i++) { |
831 | /* About 48 dB below the "normal" folding level */ | ||
832 |
2/2✓ Branch 1 taken 887413 times.
✓ Branch 2 taken 884773 times.
|
1772186 | X[i] = lowband[i] + (((celt_rng(f)) & 0x8000) ? 1.0f / 256 : -1.0f / 256); |
833 | } | ||
834 | 44978 | cm = fill; | |
835 | } | ||
836 | 54173 | celt_renormalize_vector(X, N, gain); | |
837 | } else { | ||
838 | 84629 | memset(X, 0, N*sizeof(float)); | |
839 | } | ||
840 | } | ||
841 | } | ||
842 | |||
843 | /* This code is used by the decoder and by the resynthesis-enabled encoder */ | ||
844 |
2/2✓ Branch 0 taken 240494 times.
✓ Branch 1 taken 1394894 times.
|
1635388 | if (stereo) { |
845 |
2/2✓ Branch 0 taken 186299 times.
✓ Branch 1 taken 54195 times.
|
240494 | if (N > 2) |
846 | 186299 | celt_stereo_merge(X, Y, mid, N); | |
847 |
2/2✓ Branch 0 taken 6978 times.
✓ Branch 1 taken 233516 times.
|
240494 | if (inv) { |
848 |
2/2✓ Branch 0 taken 391242 times.
✓ Branch 1 taken 6978 times.
|
398220 | for (i = 0; i < N; i++) |
849 | 391242 | Y[i] *= -1; | |
850 | } | ||
851 |
2/2✓ Branch 0 taken 620494 times.
✓ Branch 1 taken 774400 times.
|
1394894 | } else if (level == 0) { |
852 | int k; | ||
853 | |||
854 | /* Undo the sample reorganization going from time order to frequency order */ | ||
855 |
2/2✓ Branch 0 taken 140404 times.
✓ Branch 1 taken 480090 times.
|
620494 | if (B0 > 1) |
856 | 140404 | celt_interleave_hadamard(pvq->hadamard_tmp, X, N_B >> recombine, | |
857 | B0 << recombine, longblocks); | ||
858 | |||
859 | /* Undo time-freq changes that we did earlier */ | ||
860 | 620494 | N_B = N_B0; | |
861 | 620494 | blocks = B0; | |
862 |
2/2✓ Branch 0 taken 149677 times.
✓ Branch 1 taken 620494 times.
|
770171 | for (k = 0; k < time_divide; k++) { |
863 | 149677 | blocks >>= 1; | |
864 | 149677 | N_B <<= 1; | |
865 | 149677 | cm |= cm >> blocks; | |
866 | 149677 | celt_haar1(X, N_B, blocks); | |
867 | } | ||
868 | |||
869 |
2/2✓ Branch 0 taken 67800 times.
✓ Branch 1 taken 620494 times.
|
688294 | for (k = 0; k < recombine; k++) { |
870 | 67800 | cm = ff_celt_bit_deinterleave[cm]; | |
871 | 67800 | celt_haar1(X, N0>>k, 1<<k); | |
872 | } | ||
873 | 620494 | blocks <<= recombine; | |
874 | |||
875 | /* Scale output for later folding */ | ||
876 |
2/2✓ Branch 0 taken 434195 times.
✓ Branch 1 taken 186299 times.
|
620494 | if (lowband_out) { |
877 | 434195 | float n = sqrtf(N0); | |
878 |
2/2✓ Branch 0 taken 7769770 times.
✓ Branch 1 taken 434195 times.
|
8203965 | for (i = 0; i < N0; i++) |
879 | 7769770 | lowband_out[i] = n * X[i]; | |
880 | } | ||
881 | 620494 | cm = av_zero_extend(cm, blocks); | |
882 | } | ||
883 | |||
884 | 1635388 | return cm; | |
885 | } | ||
886 | |||
887 | 1745036 | static QUANT_FN(pvq_decode_band) | |
888 | { | ||
889 | #if CONFIG_OPUS_DECODER | ||
890 | 1745036 | return quant_band_template(pvq, f, rc, band, X, Y, N, b, blocks, lowband, duration, | |
891 | lowband_out, level, gain, lowband_scratch, fill, 0); | ||
892 | #else | ||
893 | return 0; | ||
894 | #endif | ||
895 | } | ||
896 | |||
897 | ✗ | static QUANT_FN(pvq_encode_band) | |
898 | { | ||
899 | #if CONFIG_OPUS_ENCODER | ||
900 | ✗ | return quant_band_template(pvq, f, rc, band, X, Y, N, b, blocks, lowband, duration, | |
901 | lowband_out, level, gain, lowband_scratch, fill, 1); | ||
902 | #else | ||
903 | return 0; | ||
904 | #endif | ||
905 | } | ||
906 | |||
907 | 86 | int av_cold ff_celt_pvq_init(CeltPVQ **pvq, int encode) | |
908 | { | ||
909 | 86 | CeltPVQ *s = av_malloc(sizeof(CeltPVQ)); | |
910 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 86 times.
|
86 | if (!s) |
911 | ✗ | return AVERROR(ENOMEM); | |
912 | |||
913 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 86 times.
|
86 | s->quant_band = encode ? pvq_encode_band : pvq_decode_band; |
914 | |||
915 | #if CONFIG_OPUS_ENCODER | ||
916 | 86 | s->pvq_search = ppp_pvq_search_c; | |
917 | #if ARCH_X86 | ||
918 | 86 | ff_celt_pvq_init_x86(s); | |
919 | #endif | ||
920 | #endif | ||
921 | |||
922 | 86 | *pvq = s; | |
923 | |||
924 | 86 | return 0; | |
925 | } | ||
926 | |||
927 | 86 | void av_cold ff_celt_pvq_uninit(CeltPVQ **pvq) | |
928 | { | ||
929 | 86 | av_freep(pvq); | |
930 | 86 | } | |
931 |