blob: 3b1f5cfbbe8a81c7f47b700ac87899d809906285 [file] [log] [blame]
Vignesh Venkatasubramanian2bd8b542014-02-20 10:50:35 -08001/* Copyright (c) 2007-2008 CSIRO
2 Copyright (c) 2007-2009 Xiph.Org Foundation
3 Copyright (c) 2008-2009 Gregory Maxwell
4 Written by Jean-Marc Valin and Gregory Maxwell */
5/*
6 Redistribution and use in source and binary forms, with or without
7 modification, are permitted provided that the following conditions
8 are met:
9
10 - Redistributions of source code must retain the above copyright
11 notice, this list of conditions and the following disclaimer.
12
13 - Redistributions in binary form must reproduce the above copyright
14 notice, this list of conditions and the following disclaimer in the
15 documentation and/or other materials provided with the distribution.
16
17 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18 ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
19 LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
20 A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
21 OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
22 EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
23 PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
24 PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
25 LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
26 NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
27 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28*/
29
30#ifdef HAVE_CONFIG_H
31#include "config.h"
32#endif
33
34#include <math.h>
35#include "bands.h"
36#include "modes.h"
37#include "vq.h"
38#include "cwrs.h"
39#include "stack_alloc.h"
40#include "os_support.h"
41#include "mathops.h"
42#include "rate.h"
43#include "quant_bands.h"
44#include "pitch.h"
45
46int hysteresis_decision(opus_val16 val, const opus_val16 *thresholds, const opus_val16 *hysteresis, int N, int prev)
47{
48 int i;
49 for (i=0;i<N;i++)
50 {
51 if (val < thresholds[i])
52 break;
53 }
54 if (i>prev && val < thresholds[prev]+hysteresis[prev])
55 i=prev;
56 if (i<prev && val > thresholds[prev-1]-hysteresis[prev-1])
57 i=prev;
58 return i;
59}
60
61opus_uint32 celt_lcg_rand(opus_uint32 seed)
62{
63 return 1664525 * seed + 1013904223;
64}
65
66/* This is a cos() approximation designed to be bit-exact on any platform. Bit exactness
67 with this approximation is important because it has an impact on the bit allocation */
Felicia Lim0c2090c2017-07-05 17:36:56 -070068opus_int16 bitexact_cos(opus_int16 x)
Vignesh Venkatasubramanian2bd8b542014-02-20 10:50:35 -080069{
70 opus_int32 tmp;
71 opus_int16 x2;
72 tmp = (4096+((opus_int32)(x)*(x)))>>13;
73 celt_assert(tmp<=32767);
74 x2 = tmp;
75 x2 = (32767-x2) + FRAC_MUL16(x2, (-7651 + FRAC_MUL16(x2, (8277 + FRAC_MUL16(-626, x2)))));
76 celt_assert(x2<=32766);
77 return 1+x2;
78}
79
Felicia Lim0c2090c2017-07-05 17:36:56 -070080int bitexact_log2tan(int isin,int icos)
Vignesh Venkatasubramanian2bd8b542014-02-20 10:50:35 -080081{
82 int lc;
83 int ls;
84 lc=EC_ILOG(icos);
85 ls=EC_ILOG(isin);
86 icos<<=15-lc;
87 isin<<=15-ls;
88 return (ls-lc)*(1<<11)
89 +FRAC_MUL16(isin, FRAC_MUL16(isin, -2597) + 7932)
90 -FRAC_MUL16(icos, FRAC_MUL16(icos, -2597) + 7932);
91}
92
93#ifdef FIXED_POINT
94/* Compute the amplitude (sqrt energy) in each of the bands */
Felicia Lim0c2090c2017-07-05 17:36:56 -070095void compute_band_energies(const CELTMode *m, const celt_sig *X, celt_ener *bandE, int end, int C, int LM, int arch)
Vignesh Venkatasubramanian2bd8b542014-02-20 10:50:35 -080096{
97 int i, c, N;
98 const opus_int16 *eBands = m->eBands;
Felicia Lim0c2090c2017-07-05 17:36:56 -070099 (void)arch;
flimc91ee5b2016-01-26 14:33:44 +0100100 N = m->shortMdctSize<<LM;
Vignesh Venkatasubramanian2bd8b542014-02-20 10:50:35 -0800101 c=0; do {
102 for (i=0;i<end;i++)
103 {
104 int j;
105 opus_val32 maxval=0;
106 opus_val32 sum = 0;
107
flimc91ee5b2016-01-26 14:33:44 +0100108 maxval = celt_maxabs32(&X[c*N+(eBands[i]<<LM)], (eBands[i+1]-eBands[i])<<LM);
Vignesh Venkatasubramanian2bd8b542014-02-20 10:50:35 -0800109 if (maxval > 0)
110 {
flimc91ee5b2016-01-26 14:33:44 +0100111 int shift = celt_ilog2(maxval) - 14 + (((m->logN[i]>>BITRES)+LM+1)>>1);
112 j=eBands[i]<<LM;
113 if (shift>0)
114 {
115 do {
116 sum = MAC16_16(sum, EXTRACT16(SHR32(X[j+c*N],shift)),
117 EXTRACT16(SHR32(X[j+c*N],shift)));
118 } while (++j<eBands[i+1]<<LM);
119 } else {
120 do {
121 sum = MAC16_16(sum, EXTRACT16(SHL32(X[j+c*N],-shift)),
122 EXTRACT16(SHL32(X[j+c*N],-shift)));
123 } while (++j<eBands[i+1]<<LM);
124 }
Vignesh Venkatasubramanian2bd8b542014-02-20 10:50:35 -0800125 /* We're adding one here to ensure the normalized band isn't larger than unity norm */
126 bandE[i+c*m->nbEBands] = EPSILON+VSHR32(EXTEND32(celt_sqrt(sum)),-shift);
127 } else {
128 bandE[i+c*m->nbEBands] = EPSILON;
129 }
130 /*printf ("%f ", bandE[i+c*m->nbEBands]);*/
131 }
132 } while (++c<C);
133 /*printf ("\n");*/
134}
135
136/* Normalise each band such that the energy is one. */
137void normalise_bands(const CELTMode *m, const celt_sig * OPUS_RESTRICT freq, celt_norm * OPUS_RESTRICT X, const celt_ener *bandE, int end, int C, int M)
138{
139 int i, c, N;
140 const opus_int16 *eBands = m->eBands;
141 N = M*m->shortMdctSize;
142 c=0; do {
143 i=0; do {
144 opus_val16 g;
145 int j,shift;
146 opus_val16 E;
147 shift = celt_zlog2(bandE[i+c*m->nbEBands])-13;
148 E = VSHR32(bandE[i+c*m->nbEBands], shift);
149 g = EXTRACT16(celt_rcp(SHL32(E,3)));
150 j=M*eBands[i]; do {
151 X[j+c*N] = MULT16_16_Q15(VSHR32(freq[j+c*N],shift-1),g);
152 } while (++j<M*eBands[i+1]);
153 } while (++i<end);
154 } while (++c<C);
155}
156
157#else /* FIXED_POINT */
158/* Compute the amplitude (sqrt energy) in each of the bands */
Felicia Lim0c2090c2017-07-05 17:36:56 -0700159void compute_band_energies(const CELTMode *m, const celt_sig *X, celt_ener *bandE, int end, int C, int LM, int arch)
Vignesh Venkatasubramanian2bd8b542014-02-20 10:50:35 -0800160{
161 int i, c, N;
162 const opus_int16 *eBands = m->eBands;
flimc91ee5b2016-01-26 14:33:44 +0100163 N = m->shortMdctSize<<LM;
Vignesh Venkatasubramanian2bd8b542014-02-20 10:50:35 -0800164 c=0; do {
165 for (i=0;i<end;i++)
166 {
flimc91ee5b2016-01-26 14:33:44 +0100167 opus_val32 sum;
Felicia Lim0c2090c2017-07-05 17:36:56 -0700168 sum = 1e-27f + celt_inner_prod(&X[c*N+(eBands[i]<<LM)], &X[c*N+(eBands[i]<<LM)], (eBands[i+1]-eBands[i])<<LM, arch);
Vignesh Venkatasubramanian2bd8b542014-02-20 10:50:35 -0800169 bandE[i+c*m->nbEBands] = celt_sqrt(sum);
170 /*printf ("%f ", bandE[i+c*m->nbEBands]);*/
171 }
172 } while (++c<C);
173 /*printf ("\n");*/
174}
175
176/* Normalise each band such that the energy is one. */
177void normalise_bands(const CELTMode *m, const celt_sig * OPUS_RESTRICT freq, celt_norm * OPUS_RESTRICT X, const celt_ener *bandE, int end, int C, int M)
178{
179 int i, c, N;
180 const opus_int16 *eBands = m->eBands;
181 N = M*m->shortMdctSize;
182 c=0; do {
183 for (i=0;i<end;i++)
184 {
185 int j;
186 opus_val16 g = 1.f/(1e-27f+bandE[i+c*m->nbEBands]);
187 for (j=M*eBands[i];j<M*eBands[i+1];j++)
188 X[j+c*N] = freq[j+c*N]*g;
189 }
190 } while (++c<C);
191}
192
193#endif /* FIXED_POINT */
194
195/* De-normalise the energy to produce the synthesis from the unit-energy bands */
196void denormalise_bands(const CELTMode *m, const celt_norm * OPUS_RESTRICT X,
flimc91ee5b2016-01-26 14:33:44 +0100197 celt_sig * OPUS_RESTRICT freq, const opus_val16 *bandLogE, int start,
198 int end, int M, int downsample, int silence)
Vignesh Venkatasubramanian2bd8b542014-02-20 10:50:35 -0800199{
flimc91ee5b2016-01-26 14:33:44 +0100200 int i, N;
201 int bound;
202 celt_sig * OPUS_RESTRICT f;
203 const celt_norm * OPUS_RESTRICT x;
Vignesh Venkatasubramanian2bd8b542014-02-20 10:50:35 -0800204 const opus_int16 *eBands = m->eBands;
205 N = M*m->shortMdctSize;
flimc91ee5b2016-01-26 14:33:44 +0100206 bound = M*eBands[end];
207 if (downsample!=1)
208 bound = IMIN(bound, N/downsample);
209 if (silence)
210 {
211 bound = 0;
212 start = end = 0;
213 }
214 f = freq;
215 x = X+M*eBands[start];
216 for (i=0;i<M*eBands[start];i++)
217 *f++ = 0;
218 for (i=start;i<end;i++)
219 {
220 int j, band_end;
221 opus_val16 g;
222 opus_val16 lg;
Vignesh Venkatasubramanian2bd8b542014-02-20 10:50:35 -0800223#ifdef FIXED_POINT
flimc91ee5b2016-01-26 14:33:44 +0100224 int shift;
Vignesh Venkatasubramanian2bd8b542014-02-20 10:50:35 -0800225#endif
flimc91ee5b2016-01-26 14:33:44 +0100226 j=M*eBands[i];
227 band_end = M*eBands[i+1];
Felicia Lim0c2090c2017-07-05 17:36:56 -0700228 lg = SATURATE16(ADD32(bandLogE[i], SHL32((opus_val32)eMeans[i],6)));
Vignesh Venkatasubramanian2bd8b542014-02-20 10:50:35 -0800229#ifndef FIXED_POINT
Felicia Lim0c2090c2017-07-05 17:36:56 -0700230 g = celt_exp2(MIN32(32.f, lg));
Vignesh Venkatasubramanian2bd8b542014-02-20 10:50:35 -0800231#else
flimc91ee5b2016-01-26 14:33:44 +0100232 /* Handle the integer part of the log energy */
233 shift = 16-(lg>>DB_SHIFT);
234 if (shift>31)
235 {
236 shift=0;
237 g=0;
238 } else {
239 /* Handle the fractional part. */
240 g = celt_exp2_frac(lg&((1<<DB_SHIFT)-1));
241 }
242 /* Handle extreme gains with negative shift. */
243 if (shift<0)
244 {
Felicia Lim0c2090c2017-07-05 17:36:56 -0700245 /* For shift <= -2 and g > 16384 we'd be likely to overflow, so we're
246 capping the gain here, which is equivalent to a cap of 18 on lg.
247 This shouldn't trigger unless the bitstream is already corrupted. */
248 if (shift <= -2)
flimc91ee5b2016-01-26 14:33:44 +0100249 {
Felicia Lim0c2090c2017-07-05 17:36:56 -0700250 g = 16384;
flimc91ee5b2016-01-26 14:33:44 +0100251 shift = -2;
252 }
253 do {
254 *f++ = SHL32(MULT16_16(*x++, g), -shift);
255 } while (++j<band_end);
256 } else
Vignesh Venkatasubramanian2bd8b542014-02-20 10:50:35 -0800257#endif
258 /* Be careful of the fixed-point "else" just above when changing this code */
259 do {
260 *f++ = SHR32(MULT16_16(*x++, g), shift);
261 } while (++j<band_end);
flimc91ee5b2016-01-26 14:33:44 +0100262 }
263 celt_assert(start <= end);
264 OPUS_CLEAR(&freq[bound], N-bound);
Vignesh Venkatasubramanian2bd8b542014-02-20 10:50:35 -0800265}
266
267/* This prevents energy collapse for transients with multiple short MDCTs */
268void anti_collapse(const CELTMode *m, celt_norm *X_, unsigned char *collapse_masks, int LM, int C, int size,
flimc91ee5b2016-01-26 14:33:44 +0100269 int start, int end, const opus_val16 *logE, const opus_val16 *prev1logE,
270 const opus_val16 *prev2logE, const int *pulses, opus_uint32 seed, int arch)
Vignesh Venkatasubramanian2bd8b542014-02-20 10:50:35 -0800271{
272 int c, i, j, k;
273 for (i=start;i<end;i++)
274 {
275 int N0;
276 opus_val16 thresh, sqrt_1;
277 int depth;
278#ifdef FIXED_POINT
279 int shift;
280 opus_val32 thresh32;
281#endif
282
283 N0 = m->eBands[i+1]-m->eBands[i];
284 /* depth in 1/8 bits */
flimc91ee5b2016-01-26 14:33:44 +0100285 celt_assert(pulses[i]>=0);
286 depth = celt_udiv(1+pulses[i], (m->eBands[i+1]-m->eBands[i]))>>LM;
Vignesh Venkatasubramanian2bd8b542014-02-20 10:50:35 -0800287
288#ifdef FIXED_POINT
289 thresh32 = SHR32(celt_exp2(-SHL16(depth, 10-BITRES)),1);
290 thresh = MULT16_32_Q15(QCONST16(0.5f, 15), MIN32(32767,thresh32));
291 {
292 opus_val32 t;
293 t = N0<<LM;
294 shift = celt_ilog2(t)>>1;
295 t = SHL32(t, (7-shift)<<1);
296 sqrt_1 = celt_rsqrt_norm(t);
297 }
298#else
299 thresh = .5f*celt_exp2(-.125f*depth);
300 sqrt_1 = celt_rsqrt(N0<<LM);
301#endif
302
303 c=0; do
304 {
305 celt_norm *X;
306 opus_val16 prev1;
307 opus_val16 prev2;
308 opus_val32 Ediff;
309 opus_val16 r;
310 int renormalize=0;
311 prev1 = prev1logE[c*m->nbEBands+i];
312 prev2 = prev2logE[c*m->nbEBands+i];
313 if (C==1)
314 {
315 prev1 = MAX16(prev1,prev1logE[m->nbEBands+i]);
316 prev2 = MAX16(prev2,prev2logE[m->nbEBands+i]);
317 }
318 Ediff = EXTEND32(logE[c*m->nbEBands+i])-EXTEND32(MIN16(prev1,prev2));
319 Ediff = MAX32(0, Ediff);
320
321#ifdef FIXED_POINT
322 if (Ediff < 16384)
323 {
324 opus_val32 r32 = SHR32(celt_exp2(-EXTRACT16(Ediff)),1);
325 r = 2*MIN16(16383,r32);
326 } else {
327 r = 0;
328 }
329 if (LM==3)
330 r = MULT16_16_Q14(23170, MIN32(23169, r));
331 r = SHR16(MIN16(thresh, r),1);
332 r = SHR32(MULT16_16_Q15(sqrt_1, r),shift);
333#else
334 /* r needs to be multiplied by 2 or 2*sqrt(2) depending on LM because
335 short blocks don't have the same energy as long */
336 r = 2.f*celt_exp2(-Ediff);
337 if (LM==3)
338 r *= 1.41421356f;
339 r = MIN16(thresh, r);
340 r = r*sqrt_1;
341#endif
342 X = X_+c*size+(m->eBands[i]<<LM);
343 for (k=0;k<1<<LM;k++)
344 {
345 /* Detect collapse */
346 if (!(collapse_masks[i*C+c]&1<<k))
347 {
348 /* Fill with noise */
349 for (j=0;j<N0;j++)
350 {
351 seed = celt_lcg_rand(seed);
352 X[(j<<LM)+k] = (seed&0x8000 ? r : -r);
353 }
354 renormalize = 1;
355 }
356 }
357 /* We just added some energy, so we need to renormalise */
358 if (renormalize)
flimc91ee5b2016-01-26 14:33:44 +0100359 renormalise_vector(X, N0<<LM, Q15ONE, arch);
Vignesh Venkatasubramanian2bd8b542014-02-20 10:50:35 -0800360 } while (++c<C);
361 }
362}
363
Felicia Lim0c2090c2017-07-05 17:36:56 -0700364/* Compute the weights to use for optimizing normalized distortion across
365 channels. We use the amplitude to weight square distortion, which means
366 that we use the square root of the value we would have been using if we
367 wanted to minimize the MSE in the non-normalized domain. This roughly
368 corresponds to some quick-and-dirty perceptual experiments I ran to
369 measure inter-aural masking (there doesn't seem to be any published data
370 on the topic). */
371static void compute_channel_weights(celt_ener Ex, celt_ener Ey, opus_val16 w[2])
372{
373 celt_ener minE;
374#if FIXED_POINT
375 int shift;
376#endif
377 minE = MIN32(Ex, Ey);
378 /* Adjustment to make the weights a bit more conservative. */
379 Ex = ADD32(Ex, minE/3);
380 Ey = ADD32(Ey, minE/3);
381#if FIXED_POINT
382 shift = celt_ilog2(EPSILON+MAX32(Ex, Ey))-14;
383#endif
384 w[0] = VSHR32(Ex, shift);
385 w[1] = VSHR32(Ey, shift);
386}
387
flimc91ee5b2016-01-26 14:33:44 +0100388static void intensity_stereo(const CELTMode *m, celt_norm * OPUS_RESTRICT X, const celt_norm * OPUS_RESTRICT Y, const celt_ener *bandE, int bandID, int N)
Vignesh Venkatasubramanian2bd8b542014-02-20 10:50:35 -0800389{
390 int i = bandID;
391 int j;
392 opus_val16 a1, a2;
393 opus_val16 left, right;
394 opus_val16 norm;
395#ifdef FIXED_POINT
396 int shift = celt_zlog2(MAX32(bandE[i], bandE[i+m->nbEBands]))-13;
397#endif
398 left = VSHR32(bandE[i],shift);
399 right = VSHR32(bandE[i+m->nbEBands],shift);
400 norm = EPSILON + celt_sqrt(EPSILON+MULT16_16(left,left)+MULT16_16(right,right));
401 a1 = DIV32_16(SHL32(EXTEND32(left),14),norm);
402 a2 = DIV32_16(SHL32(EXTEND32(right),14),norm);
403 for (j=0;j<N;j++)
404 {
405 celt_norm r, l;
406 l = X[j];
407 r = Y[j];
flimc91ee5b2016-01-26 14:33:44 +0100408 X[j] = EXTRACT16(SHR32(MAC16_16(MULT16_16(a1, l), a2, r), 14));
Vignesh Venkatasubramanian2bd8b542014-02-20 10:50:35 -0800409 /* Side is not encoded, no need to calculate */
410 }
411}
412
flimc91ee5b2016-01-26 14:33:44 +0100413static void stereo_split(celt_norm * OPUS_RESTRICT X, celt_norm * OPUS_RESTRICT Y, int N)
Vignesh Venkatasubramanian2bd8b542014-02-20 10:50:35 -0800414{
415 int j;
416 for (j=0;j<N;j++)
417 {
flimc91ee5b2016-01-26 14:33:44 +0100418 opus_val32 r, l;
419 l = MULT16_16(QCONST16(.70710678f, 15), X[j]);
420 r = MULT16_16(QCONST16(.70710678f, 15), Y[j]);
421 X[j] = EXTRACT16(SHR32(ADD32(l, r), 15));
422 Y[j] = EXTRACT16(SHR32(SUB32(r, l), 15));
Vignesh Venkatasubramanian2bd8b542014-02-20 10:50:35 -0800423 }
424}
425
flimc91ee5b2016-01-26 14:33:44 +0100426static void stereo_merge(celt_norm * OPUS_RESTRICT X, celt_norm * OPUS_RESTRICT Y, opus_val16 mid, int N, int arch)
Vignesh Venkatasubramanian2bd8b542014-02-20 10:50:35 -0800427{
428 int j;
429 opus_val32 xp=0, side=0;
430 opus_val32 El, Er;
431 opus_val16 mid2;
432#ifdef FIXED_POINT
433 int kl, kr;
434#endif
435 opus_val32 t, lgain, rgain;
436
437 /* Compute the norm of X+Y and X-Y as |X|^2 + |Y|^2 +/- sum(xy) */
flimc91ee5b2016-01-26 14:33:44 +0100438 dual_inner_prod(Y, X, Y, N, &xp, &side, arch);
Vignesh Venkatasubramanian2bd8b542014-02-20 10:50:35 -0800439 /* Compensating for the mid normalization */
440 xp = MULT16_32_Q15(mid, xp);
441 /* mid and side are in Q15, not Q14 like X and Y */
Felicia Limd03c3732016-07-25 20:28:37 +0200442 mid2 = SHR16(mid, 1);
Vignesh Venkatasubramanian2bd8b542014-02-20 10:50:35 -0800443 El = MULT16_16(mid2, mid2) + side - 2*xp;
444 Er = MULT16_16(mid2, mid2) + side + 2*xp;
445 if (Er < QCONST32(6e-4f, 28) || El < QCONST32(6e-4f, 28))
446 {
flimc91ee5b2016-01-26 14:33:44 +0100447 OPUS_COPY(Y, X, N);
Vignesh Venkatasubramanian2bd8b542014-02-20 10:50:35 -0800448 return;
449 }
450
451#ifdef FIXED_POINT
452 kl = celt_ilog2(El)>>1;
453 kr = celt_ilog2(Er)>>1;
454#endif
455 t = VSHR32(El, (kl-7)<<1);
456 lgain = celt_rsqrt_norm(t);
457 t = VSHR32(Er, (kr-7)<<1);
458 rgain = celt_rsqrt_norm(t);
459
460#ifdef FIXED_POINT
461 if (kl < 7)
462 kl = 7;
463 if (kr < 7)
464 kr = 7;
465#endif
466
467 for (j=0;j<N;j++)
468 {
469 celt_norm r, l;
470 /* Apply mid scaling (side is already scaled) */
flimc91ee5b2016-01-26 14:33:44 +0100471 l = MULT16_16_P15(mid, X[j]);
Vignesh Venkatasubramanian2bd8b542014-02-20 10:50:35 -0800472 r = Y[j];
473 X[j] = EXTRACT16(PSHR32(MULT16_16(lgain, SUB16(l,r)), kl+1));
474 Y[j] = EXTRACT16(PSHR32(MULT16_16(rgain, ADD16(l,r)), kr+1));
475 }
476}
477
478/* Decide whether we should spread the pulses in the current frame */
flimc91ee5b2016-01-26 14:33:44 +0100479int spreading_decision(const CELTMode *m, const celt_norm *X, int *average,
Vignesh Venkatasubramanian2bd8b542014-02-20 10:50:35 -0800480 int last_decision, int *hf_average, int *tapset_decision, int update_hf,
481 int end, int C, int M)
482{
483 int i, c, N0;
484 int sum = 0, nbBands=0;
485 const opus_int16 * OPUS_RESTRICT eBands = m->eBands;
486 int decision;
487 int hf_sum=0;
488
489 celt_assert(end>0);
490
491 N0 = M*m->shortMdctSize;
492
493 if (M*(eBands[end]-eBands[end-1]) <= 8)
494 return SPREAD_NONE;
495 c=0; do {
496 for (i=0;i<end;i++)
497 {
498 int j, N, tmp=0;
499 int tcount[3] = {0,0,0};
flimc91ee5b2016-01-26 14:33:44 +0100500 const celt_norm * OPUS_RESTRICT x = X+M*eBands[i]+c*N0;
Vignesh Venkatasubramanian2bd8b542014-02-20 10:50:35 -0800501 N = M*(eBands[i+1]-eBands[i]);
502 if (N<=8)
503 continue;
504 /* Compute rough CDF of |x[j]| */
505 for (j=0;j<N;j++)
506 {
507 opus_val32 x2N; /* Q13 */
508
509 x2N = MULT16_16(MULT16_16_Q15(x[j], x[j]), N);
510 if (x2N < QCONST16(0.25f,13))
511 tcount[0]++;
512 if (x2N < QCONST16(0.0625f,13))
513 tcount[1]++;
514 if (x2N < QCONST16(0.015625f,13))
515 tcount[2]++;
516 }
517
518 /* Only include four last bands (8 kHz and up) */
519 if (i>m->nbEBands-4)
flimc91ee5b2016-01-26 14:33:44 +0100520 hf_sum += celt_udiv(32*(tcount[1]+tcount[0]), N);
Vignesh Venkatasubramanian2bd8b542014-02-20 10:50:35 -0800521 tmp = (2*tcount[2] >= N) + (2*tcount[1] >= N) + (2*tcount[0] >= N);
522 sum += tmp*256;
523 nbBands++;
524 }
525 } while (++c<C);
526
527 if (update_hf)
528 {
529 if (hf_sum)
flimc91ee5b2016-01-26 14:33:44 +0100530 hf_sum = celt_udiv(hf_sum, C*(4-m->nbEBands+end));
Vignesh Venkatasubramanian2bd8b542014-02-20 10:50:35 -0800531 *hf_average = (*hf_average+hf_sum)>>1;
532 hf_sum = *hf_average;
533 if (*tapset_decision==2)
534 hf_sum += 4;
535 else if (*tapset_decision==0)
536 hf_sum -= 4;
537 if (hf_sum > 22)
538 *tapset_decision=2;
539 else if (hf_sum > 18)
540 *tapset_decision=1;
541 else
542 *tapset_decision=0;
543 }
544 /*printf("%d %d %d\n", hf_sum, *hf_average, *tapset_decision);*/
545 celt_assert(nbBands>0); /* end has to be non-zero */
flimc91ee5b2016-01-26 14:33:44 +0100546 celt_assert(sum>=0);
547 sum = celt_udiv(sum, nbBands);
Vignesh Venkatasubramanian2bd8b542014-02-20 10:50:35 -0800548 /* Recursive averaging */
549 sum = (sum+*average)>>1;
550 *average = sum;
551 /* Hysteresis */
552 sum = (3*sum + (((3-last_decision)<<7) + 64) + 2)>>2;
553 if (sum < 80)
554 {
555 decision = SPREAD_AGGRESSIVE;
556 } else if (sum < 256)
557 {
558 decision = SPREAD_NORMAL;
559 } else if (sum < 384)
560 {
561 decision = SPREAD_LIGHT;
562 } else {
563 decision = SPREAD_NONE;
564 }
565#ifdef FUZZING
566 decision = rand()&0x3;
567 *tapset_decision=rand()%3;
568#endif
569 return decision;
570}
571
572/* Indexing table for converting from natural Hadamard to ordery Hadamard
573 This is essentially a bit-reversed Gray, on top of which we've added
574 an inversion of the order because we want the DC at the end rather than
575 the beginning. The lines are for N=2, 4, 8, 16 */
576static const int ordery_table[] = {
577 1, 0,
578 3, 0, 2, 1,
579 7, 0, 4, 3, 6, 1, 5, 2,
580 15, 0, 8, 7, 12, 3, 11, 4, 14, 1, 9, 6, 13, 2, 10, 5,
581};
582
583static void deinterleave_hadamard(celt_norm *X, int N0, int stride, int hadamard)
584{
585 int i,j;
586 VARDECL(celt_norm, tmp);
587 int N;
588 SAVE_STACK;
589 N = N0*stride;
590 ALLOC(tmp, N, celt_norm);
591 celt_assert(stride>0);
592 if (hadamard)
593 {
594 const int *ordery = ordery_table+stride-2;
595 for (i=0;i<stride;i++)
596 {
597 for (j=0;j<N0;j++)
598 tmp[ordery[i]*N0+j] = X[j*stride+i];
599 }
600 } else {
601 for (i=0;i<stride;i++)
602 for (j=0;j<N0;j++)
603 tmp[i*N0+j] = X[j*stride+i];
604 }
flimc91ee5b2016-01-26 14:33:44 +0100605 OPUS_COPY(X, tmp, N);
Vignesh Venkatasubramanian2bd8b542014-02-20 10:50:35 -0800606 RESTORE_STACK;
607}
608
609static void interleave_hadamard(celt_norm *X, int N0, int stride, int hadamard)
610{
611 int i,j;
612 VARDECL(celt_norm, tmp);
613 int N;
614 SAVE_STACK;
615 N = N0*stride;
616 ALLOC(tmp, N, celt_norm);
617 if (hadamard)
618 {
619 const int *ordery = ordery_table+stride-2;
620 for (i=0;i<stride;i++)
621 for (j=0;j<N0;j++)
622 tmp[j*stride+i] = X[ordery[i]*N0+j];
623 } else {
624 for (i=0;i<stride;i++)
625 for (j=0;j<N0;j++)
626 tmp[j*stride+i] = X[i*N0+j];
627 }
flimc91ee5b2016-01-26 14:33:44 +0100628 OPUS_COPY(X, tmp, N);
Vignesh Venkatasubramanian2bd8b542014-02-20 10:50:35 -0800629 RESTORE_STACK;
630}
631
632void haar1(celt_norm *X, int N0, int stride)
633{
634 int i, j;
635 N0 >>= 1;
636 for (i=0;i<stride;i++)
637 for (j=0;j<N0;j++)
638 {
flimc91ee5b2016-01-26 14:33:44 +0100639 opus_val32 tmp1, tmp2;
640 tmp1 = MULT16_16(QCONST16(.70710678f,15), X[stride*2*j+i]);
641 tmp2 = MULT16_16(QCONST16(.70710678f,15), X[stride*(2*j+1)+i]);
642 X[stride*2*j+i] = EXTRACT16(PSHR32(ADD32(tmp1, tmp2), 15));
643 X[stride*(2*j+1)+i] = EXTRACT16(PSHR32(SUB32(tmp1, tmp2), 15));
Vignesh Venkatasubramanian2bd8b542014-02-20 10:50:35 -0800644 }
645}
646
647static int compute_qn(int N, int b, int offset, int pulse_cap, int stereo)
648{
649 static const opus_int16 exp2_table8[8] =
650 {16384, 17866, 19483, 21247, 23170, 25267, 27554, 30048};
651 int qn, qb;
652 int N2 = 2*N-1;
653 if (stereo && N==2)
654 N2--;
655 /* The upper limit ensures that in a stereo split with itheta==16384, we'll
656 always have enough bits left over to code at least one pulse in the
657 side; otherwise it would collapse, since it doesn't get folded. */
flimc91ee5b2016-01-26 14:33:44 +0100658 qb = celt_sudiv(b+N2*offset, N2);
659 qb = IMIN(b-pulse_cap-(4<<BITRES), qb);
Vignesh Venkatasubramanian2bd8b542014-02-20 10:50:35 -0800660
661 qb = IMIN(8<<BITRES, qb);
662
663 if (qb<(1<<BITRES>>1)) {
664 qn = 1;
665 } else {
666 qn = exp2_table8[qb&0x7]>>(14-(qb>>BITRES));
667 qn = (qn+1)>>1<<1;
668 }
669 celt_assert(qn <= 256);
670 return qn;
671}
672
673struct band_ctx {
674 int encode;
Felicia Lim0c2090c2017-07-05 17:36:56 -0700675 int resynth;
Vignesh Venkatasubramanian2bd8b542014-02-20 10:50:35 -0800676 const CELTMode *m;
677 int i;
678 int intensity;
679 int spread;
680 int tf_change;
681 ec_ctx *ec;
682 opus_int32 remaining_bits;
683 const celt_ener *bandE;
684 opus_uint32 seed;
flimc91ee5b2016-01-26 14:33:44 +0100685 int arch;
Felicia Lim0c2090c2017-07-05 17:36:56 -0700686 int theta_round;
687 int disable_inv;
688 int avoid_split_noise;
Vignesh Venkatasubramanian2bd8b542014-02-20 10:50:35 -0800689};
690
691struct split_ctx {
692 int inv;
693 int imid;
694 int iside;
695 int delta;
696 int itheta;
697 int qalloc;
698};
699
700static void compute_theta(struct band_ctx *ctx, struct split_ctx *sctx,
701 celt_norm *X, celt_norm *Y, int N, int *b, int B, int B0,
702 int LM,
703 int stereo, int *fill)
704{
705 int qn;
706 int itheta=0;
707 int delta;
708 int imid, iside;
709 int qalloc;
710 int pulse_cap;
711 int offset;
712 opus_int32 tell;
713 int inv=0;
714 int encode;
715 const CELTMode *m;
716 int i;
717 int intensity;
718 ec_ctx *ec;
719 const celt_ener *bandE;
720
721 encode = ctx->encode;
722 m = ctx->m;
723 i = ctx->i;
724 intensity = ctx->intensity;
725 ec = ctx->ec;
726 bandE = ctx->bandE;
727
728 /* Decide on the resolution to give to the split parameter theta */
729 pulse_cap = m->logN[i]+LM*(1<<BITRES);
730 offset = (pulse_cap>>1) - (stereo&&N==2 ? QTHETA_OFFSET_TWOPHASE : QTHETA_OFFSET);
731 qn = compute_qn(N, *b, offset, pulse_cap, stereo);
732 if (stereo && i>=intensity)
733 qn = 1;
734 if (encode)
735 {
736 /* theta is the atan() of the ratio between the (normalized)
737 side and mid. With just that parameter, we can re-scale both
738 mid and side because we know that 1) they have unit norm and
739 2) they are orthogonal. */
flimc91ee5b2016-01-26 14:33:44 +0100740 itheta = stereo_itheta(X, Y, stereo, N, ctx->arch);
Vignesh Venkatasubramanian2bd8b542014-02-20 10:50:35 -0800741 }
742 tell = ec_tell_frac(ec);
743 if (qn!=1)
744 {
745 if (encode)
Felicia Lim0c2090c2017-07-05 17:36:56 -0700746 {
747 if (!stereo || ctx->theta_round == 0)
748 {
749 itheta = (itheta*(opus_int32)qn+8192)>>14;
750 if (!stereo && ctx->avoid_split_noise && itheta > 0 && itheta < qn)
751 {
752 /* Check if the selected value of theta will cause the bit allocation
753 to inject noise on one side. If so, make sure the energy of that side
754 is zero. */
755 int unquantized = celt_udiv((opus_int32)itheta*16384, qn);
756 imid = bitexact_cos((opus_int16)unquantized);
757 iside = bitexact_cos((opus_int16)(16384-unquantized));
758 delta = FRAC_MUL16((N-1)<<7,bitexact_log2tan(iside,imid));
759 if (delta > *b)
760 itheta = qn;
761 else if (delta < -*b)
762 itheta = 0;
763 }
764 } else {
765 int down;
766 /* Bias quantization towards itheta=0 and itheta=16384. */
767 int bias = itheta > 8192 ? 32767/qn : -32767/qn;
768 down = IMIN(qn-1, IMAX(0, (itheta*(opus_int32)qn + bias)>>14));
769 if (ctx->theta_round < 0)
770 itheta = down;
771 else
772 itheta = down+1;
773 }
774 }
Vignesh Venkatasubramanian2bd8b542014-02-20 10:50:35 -0800775 /* Entropy coding of the angle. We use a uniform pdf for the
776 time split, a step for stereo, and a triangular one for the rest. */
777 if (stereo && N>2)
778 {
779 int p0 = 3;
780 int x = itheta;
781 int x0 = qn/2;
782 int ft = p0*(x0+1) + x0;
783 /* Use a probability of p0 up to itheta=8192 and then use 1 after */
784 if (encode)
785 {
786 ec_encode(ec,x<=x0?p0*x:(x-1-x0)+(x0+1)*p0,x<=x0?p0*(x+1):(x-x0)+(x0+1)*p0,ft);
787 } else {
788 int fs;
789 fs=ec_decode(ec,ft);
790 if (fs<(x0+1)*p0)
791 x=fs/p0;
792 else
793 x=x0+1+(fs-(x0+1)*p0);
794 ec_dec_update(ec,x<=x0?p0*x:(x-1-x0)+(x0+1)*p0,x<=x0?p0*(x+1):(x-x0)+(x0+1)*p0,ft);
795 itheta = x;
796 }
797 } else if (B0>1 || stereo) {
798 /* Uniform pdf */
799 if (encode)
800 ec_enc_uint(ec, itheta, qn+1);
801 else
802 itheta = ec_dec_uint(ec, qn+1);
803 } else {
804 int fs=1, ft;
805 ft = ((qn>>1)+1)*((qn>>1)+1);
806 if (encode)
807 {
808 int fl;
809
810 fs = itheta <= (qn>>1) ? itheta + 1 : qn + 1 - itheta;
811 fl = itheta <= (qn>>1) ? itheta*(itheta + 1)>>1 :
812 ft - ((qn + 1 - itheta)*(qn + 2 - itheta)>>1);
813
814 ec_encode(ec, fl, fl+fs, ft);
815 } else {
816 /* Triangular pdf */
817 int fl=0;
818 int fm;
819 fm = ec_decode(ec, ft);
820
821 if (fm < ((qn>>1)*((qn>>1) + 1)>>1))
822 {
823 itheta = (isqrt32(8*(opus_uint32)fm + 1) - 1)>>1;
824 fs = itheta + 1;
825 fl = itheta*(itheta + 1)>>1;
826 }
827 else
828 {
829 itheta = (2*(qn + 1)
830 - isqrt32(8*(opus_uint32)(ft - fm - 1) + 1))>>1;
831 fs = qn + 1 - itheta;
832 fl = ft - ((qn + 1 - itheta)*(qn + 2 - itheta)>>1);
833 }
834
835 ec_dec_update(ec, fl, fl+fs, ft);
836 }
837 }
flimc91ee5b2016-01-26 14:33:44 +0100838 celt_assert(itheta>=0);
839 itheta = celt_udiv((opus_int32)itheta*16384, qn);
Vignesh Venkatasubramanian2bd8b542014-02-20 10:50:35 -0800840 if (encode && stereo)
841 {
842 if (itheta==0)
843 intensity_stereo(m, X, Y, bandE, i, N);
844 else
845 stereo_split(X, Y, N);
846 }
847 /* NOTE: Renormalising X and Y *may* help fixed-point a bit at very high rate.
848 Let's do that at higher complexity */
849 } else if (stereo) {
850 if (encode)
851 {
Felicia Lim0c2090c2017-07-05 17:36:56 -0700852 inv = itheta > 8192 && !ctx->disable_inv;
Vignesh Venkatasubramanian2bd8b542014-02-20 10:50:35 -0800853 if (inv)
854 {
855 int j;
856 for (j=0;j<N;j++)
857 Y[j] = -Y[j];
858 }
859 intensity_stereo(m, X, Y, bandE, i, N);
860 }
861 if (*b>2<<BITRES && ctx->remaining_bits > 2<<BITRES)
862 {
863 if (encode)
864 ec_enc_bit_logp(ec, inv, 2);
865 else
866 inv = ec_dec_bit_logp(ec, 2);
867 } else
868 inv = 0;
Felicia Lim0c2090c2017-07-05 17:36:56 -0700869 /* inv flag override to avoid problems with downmixing. */
870 if (ctx->disable_inv)
871 inv = 0;
Vignesh Venkatasubramanian2bd8b542014-02-20 10:50:35 -0800872 itheta = 0;
873 }
874 qalloc = ec_tell_frac(ec) - tell;
875 *b -= qalloc;
876
877 if (itheta == 0)
878 {
879 imid = 32767;
880 iside = 0;
881 *fill &= (1<<B)-1;
882 delta = -16384;
883 } else if (itheta == 16384)
884 {
885 imid = 0;
886 iside = 32767;
887 *fill &= ((1<<B)-1)<<B;
888 delta = 16384;
889 } else {
890 imid = bitexact_cos((opus_int16)itheta);
891 iside = bitexact_cos((opus_int16)(16384-itheta));
892 /* This is the mid vs side allocation that minimizes squared error
893 in that band. */
894 delta = FRAC_MUL16((N-1)<<7,bitexact_log2tan(iside,imid));
895 }
896
897 sctx->inv = inv;
898 sctx->imid = imid;
899 sctx->iside = iside;
900 sctx->delta = delta;
901 sctx->itheta = itheta;
902 sctx->qalloc = qalloc;
903}
904static unsigned quant_band_n1(struct band_ctx *ctx, celt_norm *X, celt_norm *Y, int b,
905 celt_norm *lowband_out)
906{
Vignesh Venkatasubramanian2bd8b542014-02-20 10:50:35 -0800907 int c;
908 int stereo;
909 celt_norm *x = X;
910 int encode;
911 ec_ctx *ec;
912
913 encode = ctx->encode;
914 ec = ctx->ec;
915
916 stereo = Y != NULL;
917 c=0; do {
918 int sign=0;
919 if (ctx->remaining_bits>=1<<BITRES)
920 {
921 if (encode)
922 {
923 sign = x[0]<0;
924 ec_enc_bits(ec, sign, 1);
925 } else {
926 sign = ec_dec_bits(ec, 1);
927 }
928 ctx->remaining_bits -= 1<<BITRES;
929 b-=1<<BITRES;
930 }
Felicia Lim0c2090c2017-07-05 17:36:56 -0700931 if (ctx->resynth)
Vignesh Venkatasubramanian2bd8b542014-02-20 10:50:35 -0800932 x[0] = sign ? -NORM_SCALING : NORM_SCALING;
933 x = Y;
934 } while (++c<1+stereo);
935 if (lowband_out)
936 lowband_out[0] = SHR16(X[0],4);
937 return 1;
938}
939
940/* This function is responsible for encoding and decoding a mono partition.
941 It can split the band in two and transmit the energy difference with
942 the two half-bands. It can be called recursively so bands can end up being
943 split in 8 parts. */
944static unsigned quant_partition(struct band_ctx *ctx, celt_norm *X,
945 int N, int b, int B, celt_norm *lowband,
946 int LM,
947 opus_val16 gain, int fill)
948{
949 const unsigned char *cache;
950 int q;
951 int curr_bits;
952 int imid=0, iside=0;
953 int B0=B;
954 opus_val16 mid=0, side=0;
955 unsigned cm=0;
Vignesh Venkatasubramanian2bd8b542014-02-20 10:50:35 -0800956 celt_norm *Y=NULL;
957 int encode;
958 const CELTMode *m;
959 int i;
960 int spread;
961 ec_ctx *ec;
962
963 encode = ctx->encode;
964 m = ctx->m;
965 i = ctx->i;
966 spread = ctx->spread;
967 ec = ctx->ec;
968
969 /* If we need 1.5 more bit than we can produce, split the band in two. */
970 cache = m->cache.bits + m->cache.index[(LM+1)*m->nbEBands+i];
971 if (LM != -1 && b > cache[cache[0]]+12 && N>2)
972 {
973 int mbits, sbits, delta;
974 int itheta;
975 int qalloc;
976 struct split_ctx sctx;
977 celt_norm *next_lowband2=NULL;
978 opus_int32 rebalance;
979
980 N >>= 1;
981 Y = X+N;
982 LM -= 1;
983 if (B==1)
984 fill = (fill&1)|(fill<<1);
985 B = (B+1)>>1;
986
Felicia Lim0c2090c2017-07-05 17:36:56 -0700987 compute_theta(ctx, &sctx, X, Y, N, &b, B, B0, LM, 0, &fill);
Vignesh Venkatasubramanian2bd8b542014-02-20 10:50:35 -0800988 imid = sctx.imid;
989 iside = sctx.iside;
990 delta = sctx.delta;
991 itheta = sctx.itheta;
992 qalloc = sctx.qalloc;
993#ifdef FIXED_POINT
994 mid = imid;
995 side = iside;
996#else
997 mid = (1.f/32768)*imid;
998 side = (1.f/32768)*iside;
999#endif
1000
1001 /* Give more bits to low-energy MDCTs than they would otherwise deserve */
1002 if (B0>1 && (itheta&0x3fff))
1003 {
1004 if (itheta > 8192)
1005 /* Rough approximation for pre-echo masking */
1006 delta -= delta>>(4-LM);
1007 else
1008 /* Corresponds to a forward-masking slope of 1.5 dB per 10 ms */
1009 delta = IMIN(0, delta + (N<<BITRES>>(5-LM)));
1010 }
1011 mbits = IMAX(0, IMIN(b, (b-delta)/2));
1012 sbits = b-mbits;
1013 ctx->remaining_bits -= qalloc;
1014
1015 if (lowband)
1016 next_lowband2 = lowband+N; /* >32-bit split case */
1017
1018 rebalance = ctx->remaining_bits;
1019 if (mbits >= sbits)
1020 {
Felicia Lim0c2090c2017-07-05 17:36:56 -07001021 cm = quant_partition(ctx, X, N, mbits, B, lowband, LM,
Vignesh Venkatasubramanian2bd8b542014-02-20 10:50:35 -08001022 MULT16_16_P15(gain,mid), fill);
1023 rebalance = mbits - (rebalance-ctx->remaining_bits);
1024 if (rebalance > 3<<BITRES && itheta!=0)
1025 sbits += rebalance - (3<<BITRES);
Felicia Lim0c2090c2017-07-05 17:36:56 -07001026 cm |= quant_partition(ctx, Y, N, sbits, B, next_lowband2, LM,
Vignesh Venkatasubramanian2bd8b542014-02-20 10:50:35 -08001027 MULT16_16_P15(gain,side), fill>>B)<<(B0>>1);
1028 } else {
Felicia Lim0c2090c2017-07-05 17:36:56 -07001029 cm = quant_partition(ctx, Y, N, sbits, B, next_lowband2, LM,
Vignesh Venkatasubramanian2bd8b542014-02-20 10:50:35 -08001030 MULT16_16_P15(gain,side), fill>>B)<<(B0>>1);
1031 rebalance = sbits - (rebalance-ctx->remaining_bits);
1032 if (rebalance > 3<<BITRES && itheta!=16384)
1033 mbits += rebalance - (3<<BITRES);
Felicia Lim0c2090c2017-07-05 17:36:56 -07001034 cm |= quant_partition(ctx, X, N, mbits, B, lowband, LM,
Vignesh Venkatasubramanian2bd8b542014-02-20 10:50:35 -08001035 MULT16_16_P15(gain,mid), fill);
1036 }
1037 } else {
1038 /* This is the basic no-split case */
1039 q = bits2pulses(m, i, LM, b);
1040 curr_bits = pulses2bits(m, i, LM, q);
1041 ctx->remaining_bits -= curr_bits;
1042
1043 /* Ensures we can never bust the budget */
1044 while (ctx->remaining_bits < 0 && q > 0)
1045 {
1046 ctx->remaining_bits += curr_bits;
1047 q--;
1048 curr_bits = pulses2bits(m, i, LM, q);
1049 ctx->remaining_bits -= curr_bits;
1050 }
1051
1052 if (q!=0)
1053 {
1054 int K = get_pulses(q);
1055
1056 /* Finally do the actual quantization */
1057 if (encode)
1058 {
Felicia Lim0c2090c2017-07-05 17:36:56 -07001059 cm = alg_quant(X, N, K, spread, B, ec, gain, ctx->resynth, ctx->arch);
Vignesh Venkatasubramanian2bd8b542014-02-20 10:50:35 -08001060 } else {
1061 cm = alg_unquant(X, N, K, spread, B, ec, gain);
1062 }
1063 } else {
1064 /* If there's no pulse, fill the band anyway */
1065 int j;
Felicia Lim0c2090c2017-07-05 17:36:56 -07001066 if (ctx->resynth)
Vignesh Venkatasubramanian2bd8b542014-02-20 10:50:35 -08001067 {
1068 unsigned cm_mask;
1069 /* B can be as large as 16, so this shift might overflow an int on a
1070 16-bit platform; use a long to get defined behavior.*/
1071 cm_mask = (unsigned)(1UL<<B)-1;
1072 fill &= cm_mask;
1073 if (!fill)
1074 {
flimc91ee5b2016-01-26 14:33:44 +01001075 OPUS_CLEAR(X, N);
Vignesh Venkatasubramanian2bd8b542014-02-20 10:50:35 -08001076 } else {
1077 if (lowband == NULL)
1078 {
1079 /* Noise */
1080 for (j=0;j<N;j++)
1081 {
1082 ctx->seed = celt_lcg_rand(ctx->seed);
1083 X[j] = (celt_norm)((opus_int32)ctx->seed>>20);
1084 }
1085 cm = cm_mask;
1086 } else {
1087 /* Folded spectrum */
1088 for (j=0;j<N;j++)
1089 {
1090 opus_val16 tmp;
1091 ctx->seed = celt_lcg_rand(ctx->seed);
1092 /* About 48 dB below the "normal" folding level */
1093 tmp = QCONST16(1.0f/256, 10);
1094 tmp = (ctx->seed)&0x8000 ? tmp : -tmp;
1095 X[j] = lowband[j]+tmp;
1096 }
1097 cm = fill;
1098 }
flimc91ee5b2016-01-26 14:33:44 +01001099 renormalise_vector(X, N, gain, ctx->arch);
Vignesh Venkatasubramanian2bd8b542014-02-20 10:50:35 -08001100 }
1101 }
1102 }
1103 }
1104
1105 return cm;
1106}
1107
1108
1109/* This function is responsible for encoding and decoding a band for the mono case. */
1110static unsigned quant_band(struct band_ctx *ctx, celt_norm *X,
1111 int N, int b, int B, celt_norm *lowband,
1112 int LM, celt_norm *lowband_out,
1113 opus_val16 gain, celt_norm *lowband_scratch, int fill)
1114{
1115 int N0=N;
1116 int N_B=N;
1117 int N_B0;
1118 int B0=B;
1119 int time_divide=0;
1120 int recombine=0;
1121 int longBlocks;
1122 unsigned cm=0;
Vignesh Venkatasubramanian2bd8b542014-02-20 10:50:35 -08001123 int k;
1124 int encode;
1125 int tf_change;
1126
1127 encode = ctx->encode;
1128 tf_change = ctx->tf_change;
1129
1130 longBlocks = B0==1;
1131
flimc91ee5b2016-01-26 14:33:44 +01001132 N_B = celt_udiv(N_B, B);
Vignesh Venkatasubramanian2bd8b542014-02-20 10:50:35 -08001133
1134 /* Special case for one sample */
1135 if (N==1)
1136 {
1137 return quant_band_n1(ctx, X, NULL, b, lowband_out);
1138 }
1139
1140 if (tf_change>0)
1141 recombine = tf_change;
1142 /* Band recombining to increase frequency resolution */
1143
1144 if (lowband_scratch && lowband && (recombine || ((N_B&1) == 0 && tf_change<0) || B0>1))
1145 {
flimc91ee5b2016-01-26 14:33:44 +01001146 OPUS_COPY(lowband_scratch, lowband, N);
Vignesh Venkatasubramanian2bd8b542014-02-20 10:50:35 -08001147 lowband = lowband_scratch;
1148 }
1149
1150 for (k=0;k<recombine;k++)
1151 {
1152 static const unsigned char bit_interleave_table[16]={
1153 0,1,1,1,2,3,3,3,2,3,3,3,2,3,3,3
1154 };
1155 if (encode)
1156 haar1(X, N>>k, 1<<k);
1157 if (lowband)
1158 haar1(lowband, N>>k, 1<<k);
1159 fill = bit_interleave_table[fill&0xF]|bit_interleave_table[fill>>4]<<2;
1160 }
1161 B>>=recombine;
1162 N_B<<=recombine;
1163
1164 /* Increasing the time resolution */
1165 while ((N_B&1) == 0 && tf_change<0)
1166 {
1167 if (encode)
1168 haar1(X, N_B, B);
1169 if (lowband)
1170 haar1(lowband, N_B, B);
1171 fill |= fill<<B;
1172 B <<= 1;
1173 N_B >>= 1;
1174 time_divide++;
1175 tf_change++;
1176 }
1177 B0=B;
1178 N_B0 = N_B;
1179
1180 /* Reorganize the samples in time order instead of frequency order */
1181 if (B0>1)
1182 {
1183 if (encode)
1184 deinterleave_hadamard(X, N_B>>recombine, B0<<recombine, longBlocks);
1185 if (lowband)
1186 deinterleave_hadamard(lowband, N_B>>recombine, B0<<recombine, longBlocks);
1187 }
1188
Felicia Lim0c2090c2017-07-05 17:36:56 -07001189 cm = quant_partition(ctx, X, N, b, B, lowband, LM, gain, fill);
Vignesh Venkatasubramanian2bd8b542014-02-20 10:50:35 -08001190
1191 /* This code is used by the decoder and by the resynthesis-enabled encoder */
Felicia Lim0c2090c2017-07-05 17:36:56 -07001192 if (ctx->resynth)
Vignesh Venkatasubramanian2bd8b542014-02-20 10:50:35 -08001193 {
1194 /* Undo the sample reorganization going from time order to frequency order */
1195 if (B0>1)
1196 interleave_hadamard(X, N_B>>recombine, B0<<recombine, longBlocks);
1197
1198 /* Undo time-freq changes that we did earlier */
1199 N_B = N_B0;
1200 B = B0;
1201 for (k=0;k<time_divide;k++)
1202 {
1203 B >>= 1;
1204 N_B <<= 1;
1205 cm |= cm>>B;
1206 haar1(X, N_B, B);
1207 }
1208
1209 for (k=0;k<recombine;k++)
1210 {
1211 static const unsigned char bit_deinterleave_table[16]={
1212 0x00,0x03,0x0C,0x0F,0x30,0x33,0x3C,0x3F,
1213 0xC0,0xC3,0xCC,0xCF,0xF0,0xF3,0xFC,0xFF
1214 };
1215 cm = bit_deinterleave_table[cm];
1216 haar1(X, N0>>k, 1<<k);
1217 }
1218 B<<=recombine;
1219
1220 /* Scale output for later folding */
1221 if (lowband_out)
1222 {
1223 int j;
1224 opus_val16 n;
1225 n = celt_sqrt(SHL32(EXTEND32(N0),22));
1226 for (j=0;j<N0;j++)
1227 lowband_out[j] = MULT16_16_Q15(n,X[j]);
1228 }
1229 cm &= (1<<B)-1;
1230 }
1231 return cm;
1232}
1233
1234
1235/* This function is responsible for encoding and decoding a band for the stereo case. */
1236static unsigned quant_band_stereo(struct band_ctx *ctx, celt_norm *X, celt_norm *Y,
1237 int N, int b, int B, celt_norm *lowband,
1238 int LM, celt_norm *lowband_out,
1239 celt_norm *lowband_scratch, int fill)
1240{
1241 int imid=0, iside=0;
1242 int inv = 0;
1243 opus_val16 mid=0, side=0;
1244 unsigned cm=0;
Vignesh Venkatasubramanian2bd8b542014-02-20 10:50:35 -08001245 int mbits, sbits, delta;
1246 int itheta;
1247 int qalloc;
1248 struct split_ctx sctx;
1249 int orig_fill;
1250 int encode;
1251 ec_ctx *ec;
1252
1253 encode = ctx->encode;
1254 ec = ctx->ec;
1255
1256 /* Special case for one sample */
1257 if (N==1)
1258 {
1259 return quant_band_n1(ctx, X, Y, b, lowband_out);
1260 }
1261
1262 orig_fill = fill;
1263
Felicia Lim0c2090c2017-07-05 17:36:56 -07001264 compute_theta(ctx, &sctx, X, Y, N, &b, B, B, LM, 1, &fill);
Vignesh Venkatasubramanian2bd8b542014-02-20 10:50:35 -08001265 inv = sctx.inv;
1266 imid = sctx.imid;
1267 iside = sctx.iside;
1268 delta = sctx.delta;
1269 itheta = sctx.itheta;
1270 qalloc = sctx.qalloc;
1271#ifdef FIXED_POINT
1272 mid = imid;
1273 side = iside;
1274#else
1275 mid = (1.f/32768)*imid;
1276 side = (1.f/32768)*iside;
1277#endif
1278
1279 /* This is a special case for N=2 that only works for stereo and takes
1280 advantage of the fact that mid and side are orthogonal to encode
1281 the side with just one bit. */
1282 if (N==2)
1283 {
1284 int c;
1285 int sign=0;
1286 celt_norm *x2, *y2;
1287 mbits = b;
1288 sbits = 0;
1289 /* Only need one bit for the side. */
1290 if (itheta != 0 && itheta != 16384)
1291 sbits = 1<<BITRES;
1292 mbits -= sbits;
1293 c = itheta > 8192;
1294 ctx->remaining_bits -= qalloc+sbits;
1295
1296 x2 = c ? Y : X;
1297 y2 = c ? X : Y;
1298 if (sbits)
1299 {
1300 if (encode)
1301 {
1302 /* Here we only need to encode a sign for the side. */
1303 sign = x2[0]*y2[1] - x2[1]*y2[0] < 0;
1304 ec_enc_bits(ec, sign, 1);
1305 } else {
1306 sign = ec_dec_bits(ec, 1);
1307 }
1308 }
1309 sign = 1-2*sign;
1310 /* We use orig_fill here because we want to fold the side, but if
1311 itheta==16384, we'll have cleared the low bits of fill. */
Felicia Lim0c2090c2017-07-05 17:36:56 -07001312 cm = quant_band(ctx, x2, N, mbits, B, lowband, LM, lowband_out, Q15ONE,
1313 lowband_scratch, orig_fill);
Vignesh Venkatasubramanian2bd8b542014-02-20 10:50:35 -08001314 /* We don't split N=2 bands, so cm is either 1 or 0 (for a fold-collapse),
1315 and there's no need to worry about mixing with the other channel. */
1316 y2[0] = -sign*x2[1];
1317 y2[1] = sign*x2[0];
Felicia Lim0c2090c2017-07-05 17:36:56 -07001318 if (ctx->resynth)
Vignesh Venkatasubramanian2bd8b542014-02-20 10:50:35 -08001319 {
1320 celt_norm tmp;
1321 X[0] = MULT16_16_Q15(mid, X[0]);
1322 X[1] = MULT16_16_Q15(mid, X[1]);
1323 Y[0] = MULT16_16_Q15(side, Y[0]);
1324 Y[1] = MULT16_16_Q15(side, Y[1]);
1325 tmp = X[0];
1326 X[0] = SUB16(tmp,Y[0]);
1327 Y[0] = ADD16(tmp,Y[0]);
1328 tmp = X[1];
1329 X[1] = SUB16(tmp,Y[1]);
1330 Y[1] = ADD16(tmp,Y[1]);
1331 }
1332 } else {
1333 /* "Normal" split code */
1334 opus_int32 rebalance;
1335
1336 mbits = IMAX(0, IMIN(b, (b-delta)/2));
1337 sbits = b-mbits;
1338 ctx->remaining_bits -= qalloc;
1339
1340 rebalance = ctx->remaining_bits;
1341 if (mbits >= sbits)
1342 {
1343 /* In stereo mode, we do not apply a scaling to the mid because we need the normalized
1344 mid for folding later. */
Felicia Lim0c2090c2017-07-05 17:36:56 -07001345 cm = quant_band(ctx, X, N, mbits, B, lowband, LM, lowband_out, Q15ONE,
1346 lowband_scratch, fill);
Vignesh Venkatasubramanian2bd8b542014-02-20 10:50:35 -08001347 rebalance = mbits - (rebalance-ctx->remaining_bits);
1348 if (rebalance > 3<<BITRES && itheta!=0)
1349 sbits += rebalance - (3<<BITRES);
1350
1351 /* For a stereo split, the high bits of fill are always zero, so no
1352 folding will be done to the side. */
Felicia Lim0c2090c2017-07-05 17:36:56 -07001353 cm |= quant_band(ctx, Y, N, sbits, B, NULL, LM, NULL, side, NULL, fill>>B);
Vignesh Venkatasubramanian2bd8b542014-02-20 10:50:35 -08001354 } else {
1355 /* For a stereo split, the high bits of fill are always zero, so no
1356 folding will be done to the side. */
Felicia Lim0c2090c2017-07-05 17:36:56 -07001357 cm = quant_band(ctx, Y, N, sbits, B, NULL, LM, NULL, side, NULL, fill>>B);
Vignesh Venkatasubramanian2bd8b542014-02-20 10:50:35 -08001358 rebalance = sbits - (rebalance-ctx->remaining_bits);
1359 if (rebalance > 3<<BITRES && itheta!=16384)
1360 mbits += rebalance - (3<<BITRES);
1361 /* In stereo mode, we do not apply a scaling to the mid because we need the normalized
1362 mid for folding later. */
Felicia Lim0c2090c2017-07-05 17:36:56 -07001363 cm |= quant_band(ctx, X, N, mbits, B, lowband, LM, lowband_out, Q15ONE,
1364 lowband_scratch, fill);
Vignesh Venkatasubramanian2bd8b542014-02-20 10:50:35 -08001365 }
1366 }
1367
1368
1369 /* This code is used by the decoder and by the resynthesis-enabled encoder */
Felicia Lim0c2090c2017-07-05 17:36:56 -07001370 if (ctx->resynth)
Vignesh Venkatasubramanian2bd8b542014-02-20 10:50:35 -08001371 {
1372 if (N!=2)
flimc91ee5b2016-01-26 14:33:44 +01001373 stereo_merge(X, Y, mid, N, ctx->arch);
Vignesh Venkatasubramanian2bd8b542014-02-20 10:50:35 -08001374 if (inv)
1375 {
1376 int j;
1377 for (j=0;j<N;j++)
1378 Y[j] = -Y[j];
1379 }
1380 }
1381 return cm;
1382}
1383
Felicia Lim0c2090c2017-07-05 17:36:56 -07001384static void special_hybrid_folding(const CELTMode *m, celt_norm *norm, celt_norm *norm2, int start, int M, int dual_stereo)
1385{
1386 int n1, n2;
1387 const opus_int16 * OPUS_RESTRICT eBands = m->eBands;
1388 n1 = M*(eBands[start+1]-eBands[start]);
1389 n2 = M*(eBands[start+2]-eBands[start+1]);
1390 /* Duplicate enough of the first band folding data to be able to fold the second band.
1391 Copies no data for CELT-only mode. */
1392 OPUS_COPY(&norm[n1], &norm[2*n1 - n2], n2-n1);
1393 if (dual_stereo)
1394 OPUS_COPY(&norm2[n1], &norm2[2*n1 - n2], n2-n1);
1395}
Vignesh Venkatasubramanian2bd8b542014-02-20 10:50:35 -08001396
1397void quant_all_bands(int encode, const CELTMode *m, int start, int end,
flimc91ee5b2016-01-26 14:33:44 +01001398 celt_norm *X_, celt_norm *Y_, unsigned char *collapse_masks,
1399 const celt_ener *bandE, int *pulses, int shortBlocks, int spread,
1400 int dual_stereo, int intensity, int *tf_res, opus_int32 total_bits,
1401 opus_int32 balance, ec_ctx *ec, int LM, int codedBands,
Felicia Lim0c2090c2017-07-05 17:36:56 -07001402 opus_uint32 *seed, int complexity, int arch, int disable_inv)
Vignesh Venkatasubramanian2bd8b542014-02-20 10:50:35 -08001403{
1404 int i;
1405 opus_int32 remaining_bits;
1406 const opus_int16 * OPUS_RESTRICT eBands = m->eBands;
1407 celt_norm * OPUS_RESTRICT norm, * OPUS_RESTRICT norm2;
1408 VARDECL(celt_norm, _norm);
Felicia Lim0c2090c2017-07-05 17:36:56 -07001409 VARDECL(celt_norm, _lowband_scratch);
1410 VARDECL(celt_norm, X_save);
1411 VARDECL(celt_norm, Y_save);
1412 VARDECL(celt_norm, X_save2);
1413 VARDECL(celt_norm, Y_save2);
1414 VARDECL(celt_norm, norm_save2);
1415 int resynth_alloc;
Vignesh Venkatasubramanian2bd8b542014-02-20 10:50:35 -08001416 celt_norm *lowband_scratch;
1417 int B;
1418 int M;
1419 int lowband_offset;
1420 int update_lowband = 1;
1421 int C = Y_ != NULL ? 2 : 1;
1422 int norm_offset;
Felicia Lim0c2090c2017-07-05 17:36:56 -07001423 int theta_rdo = encode && Y_!=NULL && !dual_stereo && complexity>=8;
Vignesh Venkatasubramanian2bd8b542014-02-20 10:50:35 -08001424#ifdef RESYNTH
1425 int resynth = 1;
1426#else
Felicia Lim0c2090c2017-07-05 17:36:56 -07001427 int resynth = !encode || theta_rdo;
Vignesh Venkatasubramanian2bd8b542014-02-20 10:50:35 -08001428#endif
1429 struct band_ctx ctx;
1430 SAVE_STACK;
1431
1432 M = 1<<LM;
1433 B = shortBlocks ? M : 1;
1434 norm_offset = M*eBands[start];
1435 /* No need to allocate norm for the last band because we don't need an
1436 output in that band. */
1437 ALLOC(_norm, C*(M*eBands[m->nbEBands-1]-norm_offset), celt_norm);
1438 norm = _norm;
1439 norm2 = norm + M*eBands[m->nbEBands-1]-norm_offset;
Felicia Lim0c2090c2017-07-05 17:36:56 -07001440
1441 /* For decoding, we can use the last band as scratch space because we don't need that
1442 scratch space for the last band and we don't care about the data there until we're
1443 decoding the last band. */
1444 if (encode && resynth)
1445 resynth_alloc = M*(eBands[m->nbEBands]-eBands[m->nbEBands-1]);
1446 else
1447 resynth_alloc = ALLOC_NONE;
1448 ALLOC(_lowband_scratch, resynth_alloc, celt_norm);
1449 if (encode && resynth)
1450 lowband_scratch = _lowband_scratch;
1451 else
1452 lowband_scratch = X_+M*eBands[m->nbEBands-1];
1453 ALLOC(X_save, resynth_alloc, celt_norm);
1454 ALLOC(Y_save, resynth_alloc, celt_norm);
1455 ALLOC(X_save2, resynth_alloc, celt_norm);
1456 ALLOC(Y_save2, resynth_alloc, celt_norm);
1457 ALLOC(norm_save2, resynth_alloc, celt_norm);
Vignesh Venkatasubramanian2bd8b542014-02-20 10:50:35 -08001458
1459 lowband_offset = 0;
1460 ctx.bandE = bandE;
1461 ctx.ec = ec;
1462 ctx.encode = encode;
1463 ctx.intensity = intensity;
1464 ctx.m = m;
1465 ctx.seed = *seed;
1466 ctx.spread = spread;
flimc91ee5b2016-01-26 14:33:44 +01001467 ctx.arch = arch;
Felicia Lim0c2090c2017-07-05 17:36:56 -07001468 ctx.disable_inv = disable_inv;
1469 ctx.resynth = resynth;
1470 ctx.theta_round = 0;
1471 /* Avoid injecting noise in the first band on transients. */
1472 ctx.avoid_split_noise = B > 1;
Vignesh Venkatasubramanian2bd8b542014-02-20 10:50:35 -08001473 for (i=start;i<end;i++)
1474 {
1475 opus_int32 tell;
1476 int b;
1477 int N;
1478 opus_int32 curr_balance;
1479 int effective_lowband=-1;
1480 celt_norm * OPUS_RESTRICT X, * OPUS_RESTRICT Y;
1481 int tf_change=0;
1482 unsigned x_cm;
1483 unsigned y_cm;
1484 int last;
1485
1486 ctx.i = i;
1487 last = (i==end-1);
1488
1489 X = X_+M*eBands[i];
1490 if (Y_!=NULL)
1491 Y = Y_+M*eBands[i];
1492 else
1493 Y = NULL;
1494 N = M*eBands[i+1]-M*eBands[i];
1495 tell = ec_tell_frac(ec);
1496
1497 /* Compute how many bits we want to allocate to this band */
1498 if (i != start)
1499 balance -= tell;
1500 remaining_bits = total_bits-tell-1;
1501 ctx.remaining_bits = remaining_bits;
1502 if (i <= codedBands-1)
1503 {
flimc91ee5b2016-01-26 14:33:44 +01001504 curr_balance = celt_sudiv(balance, IMIN(3, codedBands-i));
Vignesh Venkatasubramanian2bd8b542014-02-20 10:50:35 -08001505 b = IMAX(0, IMIN(16383, IMIN(remaining_bits+1,pulses[i]+curr_balance)));
1506 } else {
1507 b = 0;
1508 }
1509
Felicia Lim0c2090c2017-07-05 17:36:56 -07001510#ifdef ENABLE_UPDATE_DRAFT
1511 if (resynth && (M*eBands[i]-N >= M*eBands[start] || i==start+1) && (update_lowband || lowband_offset==0))
1512 lowband_offset = i;
1513 if (i == start+1)
1514 special_hybrid_folding(m, norm, norm2, start, M, dual_stereo);
1515#else
Vignesh Venkatasubramanian2bd8b542014-02-20 10:50:35 -08001516 if (resynth && M*eBands[i]-N >= M*eBands[start] && (update_lowband || lowband_offset==0))
1517 lowband_offset = i;
Felicia Lim0c2090c2017-07-05 17:36:56 -07001518#endif
Vignesh Venkatasubramanian2bd8b542014-02-20 10:50:35 -08001519
1520 tf_change = tf_res[i];
1521 ctx.tf_change = tf_change;
1522 if (i>=m->effEBands)
1523 {
1524 X=norm;
1525 if (Y_!=NULL)
1526 Y = norm;
1527 lowband_scratch = NULL;
1528 }
Felicia Lim0c2090c2017-07-05 17:36:56 -07001529 if (last && !theta_rdo)
Vignesh Venkatasubramanian2bd8b542014-02-20 10:50:35 -08001530 lowband_scratch = NULL;
1531
1532 /* Get a conservative estimate of the collapse_mask's for the bands we're
1533 going to be folding from. */
1534 if (lowband_offset != 0 && (spread!=SPREAD_AGGRESSIVE || B>1 || tf_change<0))
1535 {
1536 int fold_start;
1537 int fold_end;
1538 int fold_i;
1539 /* This ensures we never repeat spectral content within one band */
1540 effective_lowband = IMAX(0, M*eBands[lowband_offset]-norm_offset-N);
1541 fold_start = lowband_offset;
1542 while(M*eBands[--fold_start] > effective_lowband+norm_offset);
1543 fold_end = lowband_offset-1;
Felicia Lim0c2090c2017-07-05 17:36:56 -07001544#ifdef ENABLE_UPDATE_DRAFT
1545 while(++fold_end < i && M*eBands[fold_end] < effective_lowband+norm_offset+N);
1546#else
Vignesh Venkatasubramanian2bd8b542014-02-20 10:50:35 -08001547 while(M*eBands[++fold_end] < effective_lowband+norm_offset+N);
Felicia Lim0c2090c2017-07-05 17:36:56 -07001548#endif
Vignesh Venkatasubramanian2bd8b542014-02-20 10:50:35 -08001549 x_cm = y_cm = 0;
1550 fold_i = fold_start; do {
1551 x_cm |= collapse_masks[fold_i*C+0];
1552 y_cm |= collapse_masks[fold_i*C+C-1];
1553 } while (++fold_i<fold_end);
1554 }
1555 /* Otherwise, we'll be using the LCG to fold, so all blocks will (almost
1556 always) be non-zero. */
1557 else
1558 x_cm = y_cm = (1<<B)-1;
1559
1560 if (dual_stereo && i==intensity)
1561 {
1562 int j;
1563
1564 /* Switch off dual stereo to do intensity. */
1565 dual_stereo = 0;
1566 if (resynth)
1567 for (j=0;j<M*eBands[i]-norm_offset;j++)
1568 norm[j] = HALF32(norm[j]+norm2[j]);
1569 }
1570 if (dual_stereo)
1571 {
1572 x_cm = quant_band(&ctx, X, N, b/2, B,
1573 effective_lowband != -1 ? norm+effective_lowband : NULL, LM,
1574 last?NULL:norm+M*eBands[i]-norm_offset, Q15ONE, lowband_scratch, x_cm);
1575 y_cm = quant_band(&ctx, Y, N, b/2, B,
1576 effective_lowband != -1 ? norm2+effective_lowband : NULL, LM,
1577 last?NULL:norm2+M*eBands[i]-norm_offset, Q15ONE, lowband_scratch, y_cm);
1578 } else {
1579 if (Y!=NULL)
1580 {
Felicia Lim0c2090c2017-07-05 17:36:56 -07001581 if (theta_rdo && i < intensity)
1582 {
1583 ec_ctx ec_save, ec_save2;
1584 struct band_ctx ctx_save, ctx_save2;
1585 opus_val32 dist0, dist1;
1586 unsigned cm, cm2;
1587 int nstart_bytes, nend_bytes, save_bytes;
1588 unsigned char *bytes_buf;
1589 unsigned char bytes_save[1275];
1590 opus_val16 w[2];
1591 compute_channel_weights(bandE[i], bandE[i+m->nbEBands], w);
1592 /* Make a copy. */
1593 cm = x_cm|y_cm;
1594 ec_save = *ec;
1595 ctx_save = ctx;
1596 OPUS_COPY(X_save, X, N);
1597 OPUS_COPY(Y_save, Y, N);
1598 /* Encode and round down. */
1599 ctx.theta_round = -1;
1600 x_cm = quant_band_stereo(&ctx, X, Y, N, b, B,
1601 effective_lowband != -1 ? norm+effective_lowband : NULL, LM,
1602 last?NULL:norm+M*eBands[i]-norm_offset, lowband_scratch, cm);
1603 dist0 = MULT16_32_Q15(w[0], celt_inner_prod(X_save, X, N, arch)) + MULT16_32_Q15(w[1], celt_inner_prod(Y_save, Y, N, arch));
1604
1605 /* Save first result. */
1606 cm2 = x_cm;
1607 ec_save2 = *ec;
1608 ctx_save2 = ctx;
1609 OPUS_COPY(X_save2, X, N);
1610 OPUS_COPY(Y_save2, Y, N);
1611 if (!last)
1612 OPUS_COPY(norm_save2, norm+M*eBands[i]-norm_offset, N);
1613 nstart_bytes = ec_save.offs;
1614 nend_bytes = ec_save.storage;
1615 bytes_buf = ec_save.buf+nstart_bytes;
1616 save_bytes = nend_bytes-nstart_bytes;
1617 OPUS_COPY(bytes_save, bytes_buf, save_bytes);
1618
1619 /* Restore */
1620 *ec = ec_save;
1621 ctx = ctx_save;
1622 OPUS_COPY(X, X_save, N);
1623 OPUS_COPY(Y, Y_save, N);
1624 if (i == start+1)
1625 special_hybrid_folding(m, norm, norm2, start, M, dual_stereo);
1626 /* Encode and round up. */
1627 ctx.theta_round = 1;
1628 x_cm = quant_band_stereo(&ctx, X, Y, N, b, B,
1629 effective_lowband != -1 ? norm+effective_lowband : NULL, LM,
1630 last?NULL:norm+M*eBands[i]-norm_offset, lowband_scratch, cm);
1631 dist1 = MULT16_32_Q15(w[0], celt_inner_prod(X_save, X, N, arch)) + MULT16_32_Q15(w[1], celt_inner_prod(Y_save, Y, N, arch));
1632 if (dist0 >= dist1) {
1633 x_cm = cm2;
1634 *ec = ec_save2;
1635 ctx = ctx_save2;
1636 OPUS_COPY(X, X_save2, N);
1637 OPUS_COPY(Y, Y_save2, N);
1638 if (!last)
1639 OPUS_COPY(norm+M*eBands[i]-norm_offset, norm_save2, N);
1640 OPUS_COPY(bytes_buf, bytes_save, save_bytes);
1641 }
1642 } else {
1643 ctx.theta_round = 0;
1644 x_cm = quant_band_stereo(&ctx, X, Y, N, b, B,
1645 effective_lowband != -1 ? norm+effective_lowband : NULL, LM,
1646 last?NULL:norm+M*eBands[i]-norm_offset, lowband_scratch, x_cm|y_cm);
1647 }
Vignesh Venkatasubramanian2bd8b542014-02-20 10:50:35 -08001648 } else {
1649 x_cm = quant_band(&ctx, X, N, b, B,
1650 effective_lowband != -1 ? norm+effective_lowband : NULL, LM,
Felicia Lim0c2090c2017-07-05 17:36:56 -07001651 last?NULL:norm+M*eBands[i]-norm_offset, Q15ONE, lowband_scratch, x_cm|y_cm);
Vignesh Venkatasubramanian2bd8b542014-02-20 10:50:35 -08001652 }
1653 y_cm = x_cm;
1654 }
1655 collapse_masks[i*C+0] = (unsigned char)x_cm;
1656 collapse_masks[i*C+C-1] = (unsigned char)y_cm;
1657 balance += pulses[i] + tell;
1658
1659 /* Update the folding position only as long as we have 1 bit/sample depth. */
1660 update_lowband = b>(N<<BITRES);
Felicia Lim0c2090c2017-07-05 17:36:56 -07001661 /* We only need to avoid noise on a split for the first band. After that, we
1662 have folding. */
1663 ctx.avoid_split_noise = 0;
Vignesh Venkatasubramanian2bd8b542014-02-20 10:50:35 -08001664 }
1665 *seed = ctx.seed;
1666
1667 RESTORE_STACK;
1668}
1669