blob: 93bd0bc7220a86ed86f174fe02e5c2698d380df2 [file] [log] [blame]
sergeyu@chromium.org885f2ff2012-10-17 22:31:52 +00001/* 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"
tlegrand@chromium.orge3ea0492013-10-23 09:13:50 +000043#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}
sergeyu@chromium.org885f2ff2012-10-17 22:31:52 +000060
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 */
68static opus_int16 bitexact_cos(opus_int16 x)
69{
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
80static int bitexact_log2tan(int isin,int icos)
81{
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 */
95void compute_band_energies(const CELTMode *m, const celt_sig *X, celt_ener *bandE, int end, int C, int M)
96{
97 int i, c, N;
98 const opus_int16 *eBands = m->eBands;
99 N = M*m->shortMdctSize;
100 c=0; do {
101 for (i=0;i<end;i++)
102 {
103 int j;
104 opus_val32 maxval=0;
105 opus_val32 sum = 0;
106
107 j=M*eBands[i]; do {
108 maxval = MAX32(maxval, X[j+c*N]);
109 maxval = MAX32(maxval, -X[j+c*N]);
110 } while (++j<M*eBands[i+1]);
111
112 if (maxval > 0)
113 {
114 int shift = celt_ilog2(maxval)-10;
115 j=M*eBands[i]; do {
116 sum = MAC16_16(sum, EXTRACT16(VSHR32(X[j+c*N],shift)),
117 EXTRACT16(VSHR32(X[j+c*N],shift)));
118 } while (++j<M*eBands[i+1]);
119 /* We're adding one here to ensure the normalized band isn't larger than unity norm */
120 bandE[i+c*m->nbEBands] = EPSILON+VSHR32(EXTEND32(celt_sqrt(sum)),-shift);
121 } else {
122 bandE[i+c*m->nbEBands] = EPSILON;
123 }
124 /*printf ("%f ", bandE[i+c*m->nbEBands]);*/
125 }
126 } while (++c<C);
127 /*printf ("\n");*/
128}
129
130/* Normalise each band such that the energy is one. */
131void 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)
132{
133 int i, c, N;
134 const opus_int16 *eBands = m->eBands;
135 N = M*m->shortMdctSize;
136 c=0; do {
137 i=0; do {
138 opus_val16 g;
139 int j,shift;
140 opus_val16 E;
141 shift = celt_zlog2(bandE[i+c*m->nbEBands])-13;
142 E = VSHR32(bandE[i+c*m->nbEBands], shift);
143 g = EXTRACT16(celt_rcp(SHL32(E,3)));
144 j=M*eBands[i]; do {
145 X[j+c*N] = MULT16_16_Q15(VSHR32(freq[j+c*N],shift-1),g);
146 } while (++j<M*eBands[i+1]);
147 } while (++i<end);
148 } while (++c<C);
149}
150
151#else /* FIXED_POINT */
152/* Compute the amplitude (sqrt energy) in each of the bands */
153void compute_band_energies(const CELTMode *m, const celt_sig *X, celt_ener *bandE, int end, int C, int M)
154{
155 int i, c, N;
156 const opus_int16 *eBands = m->eBands;
157 N = M*m->shortMdctSize;
158 c=0; do {
159 for (i=0;i<end;i++)
160 {
161 int j;
162 opus_val32 sum = 1e-27f;
163 for (j=M*eBands[i];j<M*eBands[i+1];j++)
164 sum += X[j+c*N]*X[j+c*N];
165 bandE[i+c*m->nbEBands] = celt_sqrt(sum);
166 /*printf ("%f ", bandE[i+c*m->nbEBands]);*/
167 }
168 } while (++c<C);
169 /*printf ("\n");*/
170}
171
172/* Normalise each band such that the energy is one. */
173void 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)
174{
175 int i, c, N;
176 const opus_int16 *eBands = m->eBands;
177 N = M*m->shortMdctSize;
178 c=0; do {
179 for (i=0;i<end;i++)
180 {
181 int j;
182 opus_val16 g = 1.f/(1e-27f+bandE[i+c*m->nbEBands]);
183 for (j=M*eBands[i];j<M*eBands[i+1];j++)
184 X[j+c*N] = freq[j+c*N]*g;
185 }
186 } while (++c<C);
187}
188
189#endif /* FIXED_POINT */
190
191/* De-normalise the energy to produce the synthesis from the unit-energy bands */
tlegrand@chromium.orge3ea0492013-10-23 09:13:50 +0000192void denormalise_bands(const CELTMode *m, const celt_norm * OPUS_RESTRICT X,
193 celt_sig * OPUS_RESTRICT freq, const opus_val16 *bandLogE, int start, int end, int C, int M)
sergeyu@chromium.org885f2ff2012-10-17 22:31:52 +0000194{
195 int i, c, N;
196 const opus_int16 *eBands = m->eBands;
197 N = M*m->shortMdctSize;
198 celt_assert2(C<=2, "denormalise_bands() not implemented for >2 channels");
199 c=0; do {
200 celt_sig * OPUS_RESTRICT f;
201 const celt_norm * OPUS_RESTRICT x;
202 f = freq+c*N;
tlegrand@chromium.orge3ea0492013-10-23 09:13:50 +0000203 x = X+c*N+M*eBands[start];
204 for (i=0;i<M*eBands[start];i++)
205 *f++ = 0;
206 for (i=start;i<end;i++)
sergeyu@chromium.org885f2ff2012-10-17 22:31:52 +0000207 {
208 int j, band_end;
tlegrand@chromium.orge3ea0492013-10-23 09:13:50 +0000209 opus_val16 g;
210 opus_val16 lg;
211#ifdef FIXED_POINT
212 int shift;
213#endif
sergeyu@chromium.org885f2ff2012-10-17 22:31:52 +0000214 j=M*eBands[i];
215 band_end = M*eBands[i+1];
tlegrand@chromium.orge3ea0492013-10-23 09:13:50 +0000216 lg = ADD16(bandLogE[i+c*m->nbEBands], SHL16((opus_val16)eMeans[i],6));
217#ifdef FIXED_POINT
218 /* Handle the integer part of the log energy */
219 shift = 16-(lg>>DB_SHIFT);
220 if (shift>31)
221 {
222 shift=0;
223 g=0;
224 } else {
225 /* Handle the fractional part. */
226 g = celt_exp2_frac(lg&((1<<DB_SHIFT)-1));
227 }
228#else
229 g = celt_exp2(lg);
230#endif
sergeyu@chromium.org885f2ff2012-10-17 22:31:52 +0000231 do {
tlegrand@chromium.orge3ea0492013-10-23 09:13:50 +0000232 *f++ = SHR32(MULT16_16(*x++, g), shift);
sergeyu@chromium.org885f2ff2012-10-17 22:31:52 +0000233 } while (++j<band_end);
234 }
tlegrand@chromium.orge3ea0492013-10-23 09:13:50 +0000235 celt_assert(start <= end);
sergeyu@chromium.org885f2ff2012-10-17 22:31:52 +0000236 for (i=M*eBands[end];i<N;i++)
237 *f++ = 0;
238 } while (++c<C);
239}
240
241/* This prevents energy collapse for transients with multiple short MDCTs */
242void anti_collapse(const CELTMode *m, celt_norm *X_, unsigned char *collapse_masks, int LM, int C, int size,
243 int start, int end, opus_val16 *logE, opus_val16 *prev1logE,
244 opus_val16 *prev2logE, int *pulses, opus_uint32 seed)
245{
246 int c, i, j, k;
247 for (i=start;i<end;i++)
248 {
249 int N0;
250 opus_val16 thresh, sqrt_1;
251 int depth;
252#ifdef FIXED_POINT
253 int shift;
254 opus_val32 thresh32;
255#endif
256
257 N0 = m->eBands[i+1]-m->eBands[i];
258 /* depth in 1/8 bits */
259 depth = (1+pulses[i])/((m->eBands[i+1]-m->eBands[i])<<LM);
260
261#ifdef FIXED_POINT
262 thresh32 = SHR32(celt_exp2(-SHL16(depth, 10-BITRES)),1);
263 thresh = MULT16_32_Q15(QCONST16(0.5f, 15), MIN32(32767,thresh32));
264 {
265 opus_val32 t;
266 t = N0<<LM;
267 shift = celt_ilog2(t)>>1;
268 t = SHL32(t, (7-shift)<<1);
269 sqrt_1 = celt_rsqrt_norm(t);
270 }
271#else
272 thresh = .5f*celt_exp2(-.125f*depth);
273 sqrt_1 = celt_rsqrt(N0<<LM);
274#endif
275
276 c=0; do
277 {
278 celt_norm *X;
279 opus_val16 prev1;
280 opus_val16 prev2;
281 opus_val32 Ediff;
282 opus_val16 r;
283 int renormalize=0;
284 prev1 = prev1logE[c*m->nbEBands+i];
285 prev2 = prev2logE[c*m->nbEBands+i];
286 if (C==1)
287 {
288 prev1 = MAX16(prev1,prev1logE[m->nbEBands+i]);
289 prev2 = MAX16(prev2,prev2logE[m->nbEBands+i]);
290 }
291 Ediff = EXTEND32(logE[c*m->nbEBands+i])-EXTEND32(MIN16(prev1,prev2));
292 Ediff = MAX32(0, Ediff);
293
294#ifdef FIXED_POINT
295 if (Ediff < 16384)
296 {
297 opus_val32 r32 = SHR32(celt_exp2(-EXTRACT16(Ediff)),1);
298 r = 2*MIN16(16383,r32);
299 } else {
300 r = 0;
301 }
302 if (LM==3)
303 r = MULT16_16_Q14(23170, MIN32(23169, r));
304 r = SHR16(MIN16(thresh, r),1);
305 r = SHR32(MULT16_16_Q15(sqrt_1, r),shift);
306#else
307 /* r needs to be multiplied by 2 or 2*sqrt(2) depending on LM because
308 short blocks don't have the same energy as long */
309 r = 2.f*celt_exp2(-Ediff);
310 if (LM==3)
311 r *= 1.41421356f;
312 r = MIN16(thresh, r);
313 r = r*sqrt_1;
314#endif
315 X = X_+c*size+(m->eBands[i]<<LM);
316 for (k=0;k<1<<LM;k++)
317 {
318 /* Detect collapse */
319 if (!(collapse_masks[i*C+c]&1<<k))
320 {
321 /* Fill with noise */
322 for (j=0;j<N0;j++)
323 {
324 seed = celt_lcg_rand(seed);
325 X[(j<<LM)+k] = (seed&0x8000 ? r : -r);
326 }
327 renormalize = 1;
328 }
329 }
330 /* We just added some energy, so we need to renormalise */
331 if (renormalize)
332 renormalise_vector(X, N0<<LM, Q15ONE);
333 } while (++c<C);
334 }
335}
336
337static void intensity_stereo(const CELTMode *m, celt_norm *X, celt_norm *Y, const celt_ener *bandE, int bandID, int N)
338{
339 int i = bandID;
340 int j;
341 opus_val16 a1, a2;
342 opus_val16 left, right;
343 opus_val16 norm;
344#ifdef FIXED_POINT
345 int shift = celt_zlog2(MAX32(bandE[i], bandE[i+m->nbEBands]))-13;
346#endif
347 left = VSHR32(bandE[i],shift);
348 right = VSHR32(bandE[i+m->nbEBands],shift);
349 norm = EPSILON + celt_sqrt(EPSILON+MULT16_16(left,left)+MULT16_16(right,right));
350 a1 = DIV32_16(SHL32(EXTEND32(left),14),norm);
351 a2 = DIV32_16(SHL32(EXTEND32(right),14),norm);
352 for (j=0;j<N;j++)
353 {
354 celt_norm r, l;
355 l = X[j];
356 r = Y[j];
357 X[j] = MULT16_16_Q14(a1,l) + MULT16_16_Q14(a2,r);
358 /* Side is not encoded, no need to calculate */
359 }
360}
361
362static void stereo_split(celt_norm *X, celt_norm *Y, int N)
363{
364 int j;
365 for (j=0;j<N;j++)
366 {
367 celt_norm r, l;
368 l = MULT16_16_Q15(QCONST16(.70710678f,15), X[j]);
369 r = MULT16_16_Q15(QCONST16(.70710678f,15), Y[j]);
370 X[j] = l+r;
371 Y[j] = r-l;
372 }
373}
374
375static void stereo_merge(celt_norm *X, celt_norm *Y, opus_val16 mid, int N)
376{
377 int j;
378 opus_val32 xp=0, side=0;
379 opus_val32 El, Er;
380 opus_val16 mid2;
381#ifdef FIXED_POINT
382 int kl, kr;
383#endif
384 opus_val32 t, lgain, rgain;
385
386 /* Compute the norm of X+Y and X-Y as |X|^2 + |Y|^2 +/- sum(xy) */
tlegrand@chromium.orge3ea0492013-10-23 09:13:50 +0000387 dual_inner_prod(Y, X, Y, N, &xp, &side);
sergeyu@chromium.org885f2ff2012-10-17 22:31:52 +0000388 /* Compensating for the mid normalization */
389 xp = MULT16_32_Q15(mid, xp);
390 /* mid and side are in Q15, not Q14 like X and Y */
391 mid2 = SHR32(mid, 1);
392 El = MULT16_16(mid2, mid2) + side - 2*xp;
393 Er = MULT16_16(mid2, mid2) + side + 2*xp;
394 if (Er < QCONST32(6e-4f, 28) || El < QCONST32(6e-4f, 28))
395 {
396 for (j=0;j<N;j++)
397 Y[j] = X[j];
398 return;
399 }
400
401#ifdef FIXED_POINT
402 kl = celt_ilog2(El)>>1;
403 kr = celt_ilog2(Er)>>1;
404#endif
405 t = VSHR32(El, (kl-7)<<1);
406 lgain = celt_rsqrt_norm(t);
407 t = VSHR32(Er, (kr-7)<<1);
408 rgain = celt_rsqrt_norm(t);
409
410#ifdef FIXED_POINT
411 if (kl < 7)
412 kl = 7;
413 if (kr < 7)
414 kr = 7;
415#endif
416
417 for (j=0;j<N;j++)
418 {
419 celt_norm r, l;
420 /* Apply mid scaling (side is already scaled) */
421 l = MULT16_16_Q15(mid, X[j]);
422 r = Y[j];
423 X[j] = EXTRACT16(PSHR32(MULT16_16(lgain, SUB16(l,r)), kl+1));
424 Y[j] = EXTRACT16(PSHR32(MULT16_16(rgain, ADD16(l,r)), kr+1));
425 }
426}
427
428/* Decide whether we should spread the pulses in the current frame */
429int spreading_decision(const CELTMode *m, celt_norm *X, int *average,
430 int last_decision, int *hf_average, int *tapset_decision, int update_hf,
431 int end, int C, int M)
432{
433 int i, c, N0;
434 int sum = 0, nbBands=0;
435 const opus_int16 * OPUS_RESTRICT eBands = m->eBands;
436 int decision;
437 int hf_sum=0;
438
439 celt_assert(end>0);
440
441 N0 = M*m->shortMdctSize;
442
443 if (M*(eBands[end]-eBands[end-1]) <= 8)
444 return SPREAD_NONE;
445 c=0; do {
446 for (i=0;i<end;i++)
447 {
448 int j, N, tmp=0;
449 int tcount[3] = {0,0,0};
450 celt_norm * OPUS_RESTRICT x = X+M*eBands[i]+c*N0;
451 N = M*(eBands[i+1]-eBands[i]);
452 if (N<=8)
453 continue;
454 /* Compute rough CDF of |x[j]| */
455 for (j=0;j<N;j++)
456 {
457 opus_val32 x2N; /* Q13 */
458
459 x2N = MULT16_16(MULT16_16_Q15(x[j], x[j]), N);
460 if (x2N < QCONST16(0.25f,13))
461 tcount[0]++;
462 if (x2N < QCONST16(0.0625f,13))
463 tcount[1]++;
464 if (x2N < QCONST16(0.015625f,13))
465 tcount[2]++;
466 }
467
468 /* Only include four last bands (8 kHz and up) */
469 if (i>m->nbEBands-4)
470 hf_sum += 32*(tcount[1]+tcount[0])/N;
471 tmp = (2*tcount[2] >= N) + (2*tcount[1] >= N) + (2*tcount[0] >= N);
472 sum += tmp*256;
473 nbBands++;
474 }
475 } while (++c<C);
476
477 if (update_hf)
478 {
479 if (hf_sum)
480 hf_sum /= C*(4-m->nbEBands+end);
481 *hf_average = (*hf_average+hf_sum)>>1;
482 hf_sum = *hf_average;
483 if (*tapset_decision==2)
484 hf_sum += 4;
485 else if (*tapset_decision==0)
486 hf_sum -= 4;
487 if (hf_sum > 22)
488 *tapset_decision=2;
489 else if (hf_sum > 18)
490 *tapset_decision=1;
491 else
492 *tapset_decision=0;
493 }
494 /*printf("%d %d %d\n", hf_sum, *hf_average, *tapset_decision);*/
495 celt_assert(nbBands>0); /*M*(eBands[end]-eBands[end-1]) <= 8 assures this*/
496 sum /= nbBands;
497 /* Recursive averaging */
498 sum = (sum+*average)>>1;
499 *average = sum;
500 /* Hysteresis */
501 sum = (3*sum + (((3-last_decision)<<7) + 64) + 2)>>2;
502 if (sum < 80)
503 {
504 decision = SPREAD_AGGRESSIVE;
505 } else if (sum < 256)
506 {
507 decision = SPREAD_NORMAL;
508 } else if (sum < 384)
509 {
510 decision = SPREAD_LIGHT;
511 } else {
512 decision = SPREAD_NONE;
513 }
514#ifdef FUZZING
515 decision = rand()&0x3;
516 *tapset_decision=rand()%3;
517#endif
518 return decision;
519}
520
sergeyu@chromium.org885f2ff2012-10-17 22:31:52 +0000521/* Indexing table for converting from natural Hadamard to ordery Hadamard
522 This is essentially a bit-reversed Gray, on top of which we've added
523 an inversion of the order because we want the DC at the end rather than
524 the beginning. The lines are for N=2, 4, 8, 16 */
525static const int ordery_table[] = {
526 1, 0,
527 3, 0, 2, 1,
528 7, 0, 4, 3, 6, 1, 5, 2,
529 15, 0, 8, 7, 12, 3, 11, 4, 14, 1, 9, 6, 13, 2, 10, 5,
530};
531
532static void deinterleave_hadamard(celt_norm *X, int N0, int stride, int hadamard)
533{
534 int i,j;
535 VARDECL(celt_norm, tmp);
536 int N;
537 SAVE_STACK;
538 N = N0*stride;
539 ALLOC(tmp, N, celt_norm);
540 celt_assert(stride>0);
541 if (hadamard)
542 {
543 const int *ordery = ordery_table+stride-2;
544 for (i=0;i<stride;i++)
545 {
546 for (j=0;j<N0;j++)
547 tmp[ordery[i]*N0+j] = X[j*stride+i];
548 }
549 } else {
550 for (i=0;i<stride;i++)
551 for (j=0;j<N0;j++)
552 tmp[i*N0+j] = X[j*stride+i];
553 }
554 for (j=0;j<N;j++)
555 X[j] = tmp[j];
556 RESTORE_STACK;
557}
558
559static void interleave_hadamard(celt_norm *X, int N0, int stride, int hadamard)
560{
561 int i,j;
562 VARDECL(celt_norm, tmp);
563 int N;
564 SAVE_STACK;
565 N = N0*stride;
566 ALLOC(tmp, N, celt_norm);
567 if (hadamard)
568 {
569 const int *ordery = ordery_table+stride-2;
570 for (i=0;i<stride;i++)
571 for (j=0;j<N0;j++)
572 tmp[j*stride+i] = X[ordery[i]*N0+j];
573 } else {
574 for (i=0;i<stride;i++)
575 for (j=0;j<N0;j++)
576 tmp[j*stride+i] = X[i*N0+j];
577 }
578 for (j=0;j<N;j++)
579 X[j] = tmp[j];
580 RESTORE_STACK;
581}
582
583void haar1(celt_norm *X, int N0, int stride)
584{
585 int i, j;
586 N0 >>= 1;
587 for (i=0;i<stride;i++)
588 for (j=0;j<N0;j++)
589 {
590 celt_norm tmp1, tmp2;
591 tmp1 = MULT16_16_Q15(QCONST16(.70710678f,15), X[stride*2*j+i]);
592 tmp2 = MULT16_16_Q15(QCONST16(.70710678f,15), X[stride*(2*j+1)+i]);
593 X[stride*2*j+i] = tmp1 + tmp2;
594 X[stride*(2*j+1)+i] = tmp1 - tmp2;
595 }
596}
597
598static int compute_qn(int N, int b, int offset, int pulse_cap, int stereo)
599{
600 static const opus_int16 exp2_table8[8] =
601 {16384, 17866, 19483, 21247, 23170, 25267, 27554, 30048};
602 int qn, qb;
603 int N2 = 2*N-1;
604 if (stereo && N==2)
605 N2--;
606 /* The upper limit ensures that in a stereo split with itheta==16384, we'll
607 always have enough bits left over to code at least one pulse in the
608 side; otherwise it would collapse, since it doesn't get folded. */
609 qb = IMIN(b-pulse_cap-(4<<BITRES), (b+N2*offset)/N2);
610
611 qb = IMIN(8<<BITRES, qb);
612
613 if (qb<(1<<BITRES>>1)) {
614 qn = 1;
615 } else {
616 qn = exp2_table8[qb&0x7]>>(14-(qb>>BITRES));
617 qn = (qn+1)>>1<<1;
618 }
619 celt_assert(qn <= 256);
620 return qn;
621}
622
tlegrand@chromium.orge3ea0492013-10-23 09:13:50 +0000623struct band_ctx {
624 int encode;
625 const CELTMode *m;
626 int i;
627 int intensity;
628 int spread;
629 int tf_change;
630 ec_ctx *ec;
631 opus_int32 remaining_bits;
632 const celt_ener *bandE;
633 opus_uint32 seed;
634};
635
636struct split_ctx {
637 int inv;
638 int imid;
639 int iside;
640 int delta;
641 int itheta;
642 int qalloc;
643};
644
645static void compute_theta(struct band_ctx *ctx, struct split_ctx *sctx,
646 celt_norm *X, celt_norm *Y, int N, int *b, int B, int B0,
647 int LM,
648 int stereo, int *fill)
649{
650 int qn;
651 int itheta=0;
652 int delta;
653 int imid, iside;
654 int qalloc;
655 int pulse_cap;
656 int offset;
657 opus_int32 tell;
658 int inv=0;
659 int encode;
660 const CELTMode *m;
661 int i;
662 int intensity;
663 ec_ctx *ec;
664 const celt_ener *bandE;
665
666 encode = ctx->encode;
667 m = ctx->m;
668 i = ctx->i;
669 intensity = ctx->intensity;
670 ec = ctx->ec;
671 bandE = ctx->bandE;
672
673 /* Decide on the resolution to give to the split parameter theta */
674 pulse_cap = m->logN[i]+LM*(1<<BITRES);
675 offset = (pulse_cap>>1) - (stereo&&N==2 ? QTHETA_OFFSET_TWOPHASE : QTHETA_OFFSET);
676 qn = compute_qn(N, *b, offset, pulse_cap, stereo);
677 if (stereo && i>=intensity)
678 qn = 1;
679 if (encode)
680 {
681 /* theta is the atan() of the ratio between the (normalized)
682 side and mid. With just that parameter, we can re-scale both
683 mid and side because we know that 1) they have unit norm and
684 2) they are orthogonal. */
685 itheta = stereo_itheta(X, Y, stereo, N);
686 }
687 tell = ec_tell_frac(ec);
688 if (qn!=1)
689 {
690 if (encode)
691 itheta = (itheta*qn+8192)>>14;
692
693 /* Entropy coding of the angle. We use a uniform pdf for the
694 time split, a step for stereo, and a triangular one for the rest. */
695 if (stereo && N>2)
696 {
697 int p0 = 3;
698 int x = itheta;
699 int x0 = qn/2;
700 int ft = p0*(x0+1) + x0;
701 /* Use a probability of p0 up to itheta=8192 and then use 1 after */
702 if (encode)
703 {
704 ec_encode(ec,x<=x0?p0*x:(x-1-x0)+(x0+1)*p0,x<=x0?p0*(x+1):(x-x0)+(x0+1)*p0,ft);
705 } else {
706 int fs;
707 fs=ec_decode(ec,ft);
708 if (fs<(x0+1)*p0)
709 x=fs/p0;
710 else
711 x=x0+1+(fs-(x0+1)*p0);
712 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);
713 itheta = x;
714 }
715 } else if (B0>1 || stereo) {
716 /* Uniform pdf */
717 if (encode)
718 ec_enc_uint(ec, itheta, qn+1);
719 else
720 itheta = ec_dec_uint(ec, qn+1);
721 } else {
722 int fs=1, ft;
723 ft = ((qn>>1)+1)*((qn>>1)+1);
724 if (encode)
725 {
726 int fl;
727
728 fs = itheta <= (qn>>1) ? itheta + 1 : qn + 1 - itheta;
729 fl = itheta <= (qn>>1) ? itheta*(itheta + 1)>>1 :
730 ft - ((qn + 1 - itheta)*(qn + 2 - itheta)>>1);
731
732 ec_encode(ec, fl, fl+fs, ft);
733 } else {
734 /* Triangular pdf */
735 int fl=0;
736 int fm;
737 fm = ec_decode(ec, ft);
738
739 if (fm < ((qn>>1)*((qn>>1) + 1)>>1))
740 {
741 itheta = (isqrt32(8*(opus_uint32)fm + 1) - 1)>>1;
742 fs = itheta + 1;
743 fl = itheta*(itheta + 1)>>1;
744 }
745 else
746 {
747 itheta = (2*(qn + 1)
748 - isqrt32(8*(opus_uint32)(ft - fm - 1) + 1))>>1;
749 fs = qn + 1 - itheta;
750 fl = ft - ((qn + 1 - itheta)*(qn + 2 - itheta)>>1);
751 }
752
753 ec_dec_update(ec, fl, fl+fs, ft);
754 }
755 }
756 itheta = (opus_int32)itheta*16384/qn;
757 if (encode && stereo)
758 {
759 if (itheta==0)
760 intensity_stereo(m, X, Y, bandE, i, N);
761 else
762 stereo_split(X, Y, N);
763 }
764 /* NOTE: Renormalising X and Y *may* help fixed-point a bit at very high rate.
765 Let's do that at higher complexity */
766 } else if (stereo) {
767 if (encode)
768 {
769 inv = itheta > 8192;
770 if (inv)
771 {
772 int j;
773 for (j=0;j<N;j++)
774 Y[j] = -Y[j];
775 }
776 intensity_stereo(m, X, Y, bandE, i, N);
777 }
778 if (*b>2<<BITRES && ctx->remaining_bits > 2<<BITRES)
779 {
780 if (encode)
781 ec_enc_bit_logp(ec, inv, 2);
782 else
783 inv = ec_dec_bit_logp(ec, 2);
784 } else
785 inv = 0;
786 itheta = 0;
787 }
788 qalloc = ec_tell_frac(ec) - tell;
789 *b -= qalloc;
790
791 if (itheta == 0)
792 {
793 imid = 32767;
794 iside = 0;
795 *fill &= (1<<B)-1;
796 delta = -16384;
797 } else if (itheta == 16384)
798 {
799 imid = 0;
800 iside = 32767;
801 *fill &= ((1<<B)-1)<<B;
802 delta = 16384;
803 } else {
804 imid = bitexact_cos((opus_int16)itheta);
805 iside = bitexact_cos((opus_int16)(16384-itheta));
806 /* This is the mid vs side allocation that minimizes squared error
807 in that band. */
808 delta = FRAC_MUL16((N-1)<<7,bitexact_log2tan(iside,imid));
809 }
810
811 sctx->inv = inv;
812 sctx->imid = imid;
813 sctx->iside = iside;
814 sctx->delta = delta;
815 sctx->itheta = itheta;
816 sctx->qalloc = qalloc;
817}
818static unsigned quant_band_n1(struct band_ctx *ctx, celt_norm *X, celt_norm *Y, int b,
819 celt_norm *lowband_out)
820{
821#ifdef RESYNTH
822 int resynth = 1;
823#else
824 int resynth = !ctx->encode;
825#endif
826 int c;
827 int stereo;
828 celt_norm *x = X;
829 int encode;
830 ec_ctx *ec;
831
832 encode = ctx->encode;
833 ec = ctx->ec;
834
835 stereo = Y != NULL;
836 c=0; do {
837 int sign=0;
838 if (ctx->remaining_bits>=1<<BITRES)
839 {
840 if (encode)
841 {
842 sign = x[0]<0;
843 ec_enc_bits(ec, sign, 1);
844 } else {
845 sign = ec_dec_bits(ec, 1);
846 }
847 ctx->remaining_bits -= 1<<BITRES;
848 b-=1<<BITRES;
849 }
850 if (resynth)
851 x[0] = sign ? -NORM_SCALING : NORM_SCALING;
852 x = Y;
853 } while (++c<1+stereo);
854 if (lowband_out)
855 lowband_out[0] = SHR16(X[0],4);
856 return 1;
857}
858
859/* This function is responsible for encoding and decoding a mono partition.
860 It can split the band in two and transmit the energy difference with
861 the two half-bands. It can be called recursively so bands can end up being
862 split in 8 parts. */
863static unsigned quant_partition(struct band_ctx *ctx, celt_norm *X,
864 int N, int b, int B, celt_norm *lowband,
865 int LM,
866 opus_val16 gain, int fill)
sergeyu@chromium.org885f2ff2012-10-17 22:31:52 +0000867{
868 const unsigned char *cache;
869 int q;
870 int curr_bits;
sergeyu@chromium.org885f2ff2012-10-17 22:31:52 +0000871 int imid=0, iside=0;
sergeyu@chromium.org885f2ff2012-10-17 22:31:52 +0000872 int N_B=N;
sergeyu@chromium.org885f2ff2012-10-17 22:31:52 +0000873 int B0=B;
sergeyu@chromium.org885f2ff2012-10-17 22:31:52 +0000874 opus_val16 mid=0, side=0;
sergeyu@chromium.org885f2ff2012-10-17 22:31:52 +0000875 unsigned cm=0;
876#ifdef RESYNTH
877 int resynth = 1;
878#else
tlegrand@chromium.orge3ea0492013-10-23 09:13:50 +0000879 int resynth = !ctx->encode;
sergeyu@chromium.org885f2ff2012-10-17 22:31:52 +0000880#endif
tlegrand@chromium.orge3ea0492013-10-23 09:13:50 +0000881 celt_norm *Y=NULL;
882 int encode;
883 const CELTMode *m;
884 int i;
885 int spread;
886 ec_ctx *ec;
sergeyu@chromium.org885f2ff2012-10-17 22:31:52 +0000887
tlegrand@chromium.orge3ea0492013-10-23 09:13:50 +0000888 encode = ctx->encode;
889 m = ctx->m;
890 i = ctx->i;
891 spread = ctx->spread;
892 ec = ctx->ec;
sergeyu@chromium.org885f2ff2012-10-17 22:31:52 +0000893
894 N_B /= B;
sergeyu@chromium.org885f2ff2012-10-17 22:31:52 +0000895
896 /* If we need 1.5 more bit than we can produce, split the band in two. */
897 cache = m->cache.bits + m->cache.index[(LM+1)*m->nbEBands+i];
tlegrand@chromium.orge3ea0492013-10-23 09:13:50 +0000898 if (LM != -1 && b > cache[cache[0]]+12 && N>2)
sergeyu@chromium.org885f2ff2012-10-17 22:31:52 +0000899 {
tlegrand@chromium.orge3ea0492013-10-23 09:13:50 +0000900 int mbits, sbits, delta;
901 int itheta;
902 int qalloc;
903 struct split_ctx sctx;
904 celt_norm *next_lowband2=NULL;
905 opus_int32 rebalance;
906
sergeyu@chromium.org885f2ff2012-10-17 22:31:52 +0000907 N >>= 1;
908 Y = X+N;
sergeyu@chromium.org885f2ff2012-10-17 22:31:52 +0000909 LM -= 1;
910 if (B==1)
911 fill = (fill&1)|(fill<<1);
912 B = (B+1)>>1;
sergeyu@chromium.org885f2ff2012-10-17 22:31:52 +0000913
tlegrand@chromium.orge3ea0492013-10-23 09:13:50 +0000914 compute_theta(ctx, &sctx, X, Y, N, &b, B, B0,
915 LM, 0, &fill);
916 imid = sctx.imid;
917 iside = sctx.iside;
918 delta = sctx.delta;
919 itheta = sctx.itheta;
920 qalloc = sctx.qalloc;
sergeyu@chromium.org885f2ff2012-10-17 22:31:52 +0000921#ifdef FIXED_POINT
922 mid = imid;
923 side = iside;
924#else
925 mid = (1.f/32768)*imid;
926 side = (1.f/32768)*iside;
927#endif
928
tlegrand@chromium.orge3ea0492013-10-23 09:13:50 +0000929 /* Give more bits to low-energy MDCTs than they would otherwise deserve */
930 if (B0>1 && (itheta&0x3fff))
sergeyu@chromium.org885f2ff2012-10-17 22:31:52 +0000931 {
tlegrand@chromium.orge3ea0492013-10-23 09:13:50 +0000932 if (itheta > 8192)
933 /* Rough approximation for pre-echo masking */
934 delta -= delta>>(4-LM);
sergeyu@chromium.org885f2ff2012-10-17 22:31:52 +0000935 else
tlegrand@chromium.orge3ea0492013-10-23 09:13:50 +0000936 /* Corresponds to a forward-masking slope of 1.5 dB per 10 ms */
937 delta = IMIN(0, delta + (N<<BITRES>>(5-LM)));
sergeyu@chromium.org885f2ff2012-10-17 22:31:52 +0000938 }
tlegrand@chromium.orge3ea0492013-10-23 09:13:50 +0000939 mbits = IMAX(0, IMIN(b, (b-delta)/2));
940 sbits = b-mbits;
941 ctx->remaining_bits -= qalloc;
sergeyu@chromium.org885f2ff2012-10-17 22:31:52 +0000942
tlegrand@chromium.orge3ea0492013-10-23 09:13:50 +0000943 if (lowband)
944 next_lowband2 = lowband+N; /* >32-bit split case */
945
946 rebalance = ctx->remaining_bits;
947 if (mbits >= sbits)
948 {
949 cm = quant_partition(ctx, X, N, mbits, B,
950 lowband, LM,
951 MULT16_16_P15(gain,mid), fill);
952 rebalance = mbits - (rebalance-ctx->remaining_bits);
953 if (rebalance > 3<<BITRES && itheta!=0)
954 sbits += rebalance - (3<<BITRES);
955 cm |= quant_partition(ctx, Y, N, sbits, B,
956 next_lowband2, LM,
957 MULT16_16_P15(gain,side), fill>>B)<<(B0>>1);
958 } else {
959 cm = quant_partition(ctx, Y, N, sbits, B,
960 next_lowband2, LM,
961 MULT16_16_P15(gain,side), fill>>B)<<(B0>>1);
962 rebalance = sbits - (rebalance-ctx->remaining_bits);
963 if (rebalance > 3<<BITRES && itheta!=16384)
964 mbits += rebalance - (3<<BITRES);
965 cm |= quant_partition(ctx, X, N, mbits, B,
966 lowband, LM,
967 MULT16_16_P15(gain,mid), fill);
968 }
sergeyu@chromium.org885f2ff2012-10-17 22:31:52 +0000969 } else {
970 /* This is the basic no-split case */
971 q = bits2pulses(m, i, LM, b);
972 curr_bits = pulses2bits(m, i, LM, q);
tlegrand@chromium.orge3ea0492013-10-23 09:13:50 +0000973 ctx->remaining_bits -= curr_bits;
sergeyu@chromium.org885f2ff2012-10-17 22:31:52 +0000974
975 /* Ensures we can never bust the budget */
tlegrand@chromium.orge3ea0492013-10-23 09:13:50 +0000976 while (ctx->remaining_bits < 0 && q > 0)
sergeyu@chromium.org885f2ff2012-10-17 22:31:52 +0000977 {
tlegrand@chromium.orge3ea0492013-10-23 09:13:50 +0000978 ctx->remaining_bits += curr_bits;
sergeyu@chromium.org885f2ff2012-10-17 22:31:52 +0000979 q--;
980 curr_bits = pulses2bits(m, i, LM, q);
tlegrand@chromium.orge3ea0492013-10-23 09:13:50 +0000981 ctx->remaining_bits -= curr_bits;
sergeyu@chromium.org885f2ff2012-10-17 22:31:52 +0000982 }
983
984 if (q!=0)
985 {
986 int K = get_pulses(q);
987
988 /* Finally do the actual quantization */
989 if (encode)
990 {
991 cm = alg_quant(X, N, K, spread, B, ec
992#ifdef RESYNTH
993 , gain
994#endif
995 );
996 } else {
997 cm = alg_unquant(X, N, K, spread, B, ec, gain);
998 }
999 } else {
1000 /* If there's no pulse, fill the band anyway */
1001 int j;
1002 if (resynth)
1003 {
1004 unsigned cm_mask;
tlegrand@chromium.orge3ea0492013-10-23 09:13:50 +00001005 /* B can be as large as 16, so this shift might overflow an int on a
sergeyu@chromium.org885f2ff2012-10-17 22:31:52 +00001006 16-bit platform; use a long to get defined behavior.*/
1007 cm_mask = (unsigned)(1UL<<B)-1;
1008 fill &= cm_mask;
1009 if (!fill)
1010 {
1011 for (j=0;j<N;j++)
1012 X[j] = 0;
1013 } else {
1014 if (lowband == NULL)
1015 {
1016 /* Noise */
1017 for (j=0;j<N;j++)
1018 {
tlegrand@chromium.orge3ea0492013-10-23 09:13:50 +00001019 ctx->seed = celt_lcg_rand(ctx->seed);
1020 X[j] = (celt_norm)((opus_int32)ctx->seed>>20);
sergeyu@chromium.org885f2ff2012-10-17 22:31:52 +00001021 }
1022 cm = cm_mask;
1023 } else {
1024 /* Folded spectrum */
1025 for (j=0;j<N;j++)
1026 {
1027 opus_val16 tmp;
tlegrand@chromium.orge3ea0492013-10-23 09:13:50 +00001028 ctx->seed = celt_lcg_rand(ctx->seed);
sergeyu@chromium.org885f2ff2012-10-17 22:31:52 +00001029 /* About 48 dB below the "normal" folding level */
1030 tmp = QCONST16(1.0f/256, 10);
tlegrand@chromium.orge3ea0492013-10-23 09:13:50 +00001031 tmp = (ctx->seed)&0x8000 ? tmp : -tmp;
sergeyu@chromium.org885f2ff2012-10-17 22:31:52 +00001032 X[j] = lowband[j]+tmp;
1033 }
1034 cm = fill;
1035 }
1036 renormalise_vector(X, N, gain);
1037 }
1038 }
1039 }
1040 }
1041
tlegrand@chromium.orge3ea0492013-10-23 09:13:50 +00001042 return cm;
1043}
1044
1045
1046/* This function is responsible for encoding and decoding a band for the mono case. */
1047static unsigned quant_band(struct band_ctx *ctx, celt_norm *X,
1048 int N, int b, int B, celt_norm *lowband,
1049 int LM, celt_norm *lowband_out,
1050 opus_val16 gain, celt_norm *lowband_scratch, int fill)
1051{
1052 int N0=N;
1053 int N_B=N;
1054 int N_B0;
1055 int B0=B;
1056 int time_divide=0;
1057 int recombine=0;
1058 int longBlocks;
1059 unsigned cm=0;
1060#ifdef RESYNTH
1061 int resynth = 1;
1062#else
1063 int resynth = !ctx->encode;
1064#endif
1065 int k;
1066 int encode;
1067 int tf_change;
1068
1069 encode = ctx->encode;
1070 tf_change = ctx->tf_change;
1071
1072 longBlocks = B0==1;
1073
1074 N_B /= B;
1075 N_B0 = N_B;
1076
1077 /* Special case for one sample */
1078 if (N==1)
1079 {
1080 return quant_band_n1(ctx, X, NULL, b, lowband_out);
1081 }
1082
1083 if (tf_change>0)
1084 recombine = tf_change;
1085 /* Band recombining to increase frequency resolution */
1086
1087 if (lowband_scratch && lowband && (recombine || ((N_B&1) == 0 && tf_change<0) || B0>1))
1088 {
1089 int j;
1090 for (j=0;j<N;j++)
1091 lowband_scratch[j] = lowband[j];
1092 lowband = lowband_scratch;
1093 }
1094
1095 for (k=0;k<recombine;k++)
1096 {
1097 static const unsigned char bit_interleave_table[16]={
1098 0,1,1,1,2,3,3,3,2,3,3,3,2,3,3,3
1099 };
1100 if (encode)
1101 haar1(X, N>>k, 1<<k);
1102 if (lowband)
1103 haar1(lowband, N>>k, 1<<k);
1104 fill = bit_interleave_table[fill&0xF]|bit_interleave_table[fill>>4]<<2;
1105 }
1106 B>>=recombine;
1107 N_B<<=recombine;
1108
1109 /* Increasing the time resolution */
1110 while ((N_B&1) == 0 && tf_change<0)
1111 {
1112 if (encode)
1113 haar1(X, N_B, B);
1114 if (lowband)
1115 haar1(lowband, N_B, B);
1116 fill |= fill<<B;
1117 B <<= 1;
1118 N_B >>= 1;
1119 time_divide++;
1120 tf_change++;
1121 }
1122 B0=B;
1123 N_B0 = N_B;
1124
1125 /* Reorganize the samples in time order instead of frequency order */
1126 if (B0>1)
1127 {
1128 if (encode)
1129 deinterleave_hadamard(X, N_B>>recombine, B0<<recombine, longBlocks);
1130 if (lowband)
1131 deinterleave_hadamard(lowband, N_B>>recombine, B0<<recombine, longBlocks);
1132 }
1133
1134 cm = quant_partition(ctx, X, N, b, B, lowband,
1135 LM, gain, fill);
1136
sergeyu@chromium.org885f2ff2012-10-17 22:31:52 +00001137 /* This code is used by the decoder and by the resynthesis-enabled encoder */
1138 if (resynth)
1139 {
tlegrand@chromium.orge3ea0492013-10-23 09:13:50 +00001140 /* Undo the sample reorganization going from time order to frequency order */
1141 if (B0>1)
1142 interleave_hadamard(X, N_B>>recombine, B0<<recombine, longBlocks);
1143
1144 /* Undo time-freq changes that we did earlier */
1145 N_B = N_B0;
1146 B = B0;
1147 for (k=0;k<time_divide;k++)
sergeyu@chromium.org885f2ff2012-10-17 22:31:52 +00001148 {
tlegrand@chromium.orge3ea0492013-10-23 09:13:50 +00001149 B >>= 1;
1150 N_B <<= 1;
1151 cm |= cm>>B;
1152 haar1(X, N_B, B);
1153 }
1154
1155 for (k=0;k<recombine;k++)
sergeyu@chromium.org885f2ff2012-10-17 22:31:52 +00001156 {
tlegrand@chromium.orge3ea0492013-10-23 09:13:50 +00001157 static const unsigned char bit_deinterleave_table[16]={
1158 0x00,0x03,0x0C,0x0F,0x30,0x33,0x3C,0x3F,
1159 0xC0,0xC3,0xCC,0xCF,0xF0,0xF3,0xFC,0xFF
1160 };
1161 cm = bit_deinterleave_table[cm];
1162 haar1(X, N0>>k, 1<<k);
1163 }
1164 B<<=recombine;
sergeyu@chromium.org885f2ff2012-10-17 22:31:52 +00001165
tlegrand@chromium.orge3ea0492013-10-23 09:13:50 +00001166 /* Scale output for later folding */
1167 if (lowband_out)
1168 {
1169 int j;
1170 opus_val16 n;
1171 n = celt_sqrt(SHL32(EXTEND32(N0),22));
1172 for (j=0;j<N0;j++)
1173 lowband_out[j] = MULT16_16_Q15(n,X[j]);
1174 }
1175 cm &= (1<<B)-1;
1176 }
1177 return cm;
1178}
sergeyu@chromium.org885f2ff2012-10-17 22:31:52 +00001179
tlegrand@chromium.orge3ea0492013-10-23 09:13:50 +00001180
1181/* This function is responsible for encoding and decoding a band for the stereo case. */
1182static unsigned quant_band_stereo(struct band_ctx *ctx, celt_norm *X, celt_norm *Y,
1183 int N, int b, int B, celt_norm *lowband,
1184 int LM, celt_norm *lowband_out,
1185 celt_norm *lowband_scratch, int fill)
1186{
1187 int imid=0, iside=0;
1188 int inv = 0;
1189 opus_val16 mid=0, side=0;
1190 unsigned cm=0;
1191#ifdef RESYNTH
1192 int resynth = 1;
1193#else
1194 int resynth = !ctx->encode;
1195#endif
1196 int mbits, sbits, delta;
1197 int itheta;
1198 int qalloc;
1199 struct split_ctx sctx;
1200 int orig_fill;
1201 int encode;
1202 ec_ctx *ec;
1203
1204 encode = ctx->encode;
1205 ec = ctx->ec;
1206
1207 /* Special case for one sample */
1208 if (N==1)
1209 {
1210 return quant_band_n1(ctx, X, Y, b, lowband_out);
1211 }
1212
1213 orig_fill = fill;
1214
1215 compute_theta(ctx, &sctx, X, Y, N, &b, B, B,
1216 LM, 1, &fill);
1217 inv = sctx.inv;
1218 imid = sctx.imid;
1219 iside = sctx.iside;
1220 delta = sctx.delta;
1221 itheta = sctx.itheta;
1222 qalloc = sctx.qalloc;
1223#ifdef FIXED_POINT
1224 mid = imid;
1225 side = iside;
1226#else
1227 mid = (1.f/32768)*imid;
1228 side = (1.f/32768)*iside;
1229#endif
1230
1231 /* This is a special case for N=2 that only works for stereo and takes
1232 advantage of the fact that mid and side are orthogonal to encode
1233 the side with just one bit. */
1234 if (N==2)
1235 {
1236 int c;
1237 int sign=0;
1238 celt_norm *x2, *y2;
1239 mbits = b;
1240 sbits = 0;
1241 /* Only need one bit for the side. */
1242 if (itheta != 0 && itheta != 16384)
1243 sbits = 1<<BITRES;
1244 mbits -= sbits;
1245 c = itheta > 8192;
1246 ctx->remaining_bits -= qalloc+sbits;
1247
1248 x2 = c ? Y : X;
1249 y2 = c ? X : Y;
1250 if (sbits)
1251 {
1252 if (encode)
sergeyu@chromium.org885f2ff2012-10-17 22:31:52 +00001253 {
tlegrand@chromium.orge3ea0492013-10-23 09:13:50 +00001254 /* Here we only need to encode a sign for the side. */
1255 sign = x2[0]*y2[1] - x2[1]*y2[0] < 0;
1256 ec_enc_bits(ec, sign, 1);
1257 } else {
1258 sign = ec_dec_bits(ec, 1);
sergeyu@chromium.org885f2ff2012-10-17 22:31:52 +00001259 }
tlegrand@chromium.orge3ea0492013-10-23 09:13:50 +00001260 }
1261 sign = 1-2*sign;
1262 /* We use orig_fill here because we want to fold the side, but if
1263 itheta==16384, we'll have cleared the low bits of fill. */
1264 cm = quant_band(ctx, x2, N, mbits, B, lowband,
1265 LM, lowband_out, Q15ONE, lowband_scratch, orig_fill);
1266 /* We don't split N=2 bands, so cm is either 1 or 0 (for a fold-collapse),
1267 and there's no need to worry about mixing with the other channel. */
1268 y2[0] = -sign*x2[1];
1269 y2[1] = sign*x2[0];
1270 if (resynth)
1271 {
1272 celt_norm tmp;
1273 X[0] = MULT16_16_Q15(mid, X[0]);
1274 X[1] = MULT16_16_Q15(mid, X[1]);
1275 Y[0] = MULT16_16_Q15(side, Y[0]);
1276 Y[1] = MULT16_16_Q15(side, Y[1]);
1277 tmp = X[0];
1278 X[0] = SUB16(tmp,Y[0]);
1279 Y[0] = ADD16(tmp,Y[0]);
1280 tmp = X[1];
1281 X[1] = SUB16(tmp,Y[1]);
1282 Y[1] = ADD16(tmp,Y[1]);
1283 }
1284 } else {
1285 /* "Normal" split code */
1286 opus_int32 rebalance;
sergeyu@chromium.org885f2ff2012-10-17 22:31:52 +00001287
tlegrand@chromium.orge3ea0492013-10-23 09:13:50 +00001288 mbits = IMAX(0, IMIN(b, (b-delta)/2));
1289 sbits = b-mbits;
1290 ctx->remaining_bits -= qalloc;
sergeyu@chromium.org885f2ff2012-10-17 22:31:52 +00001291
tlegrand@chromium.orge3ea0492013-10-23 09:13:50 +00001292 rebalance = ctx->remaining_bits;
1293 if (mbits >= sbits)
1294 {
1295 /* In stereo mode, we do not apply a scaling to the mid because we need the normalized
1296 mid for folding later. */
1297 cm = quant_band(ctx, X, N, mbits, B,
1298 lowband, LM, lowband_out,
1299 Q15ONE, lowband_scratch, fill);
1300 rebalance = mbits - (rebalance-ctx->remaining_bits);
1301 if (rebalance > 3<<BITRES && itheta!=0)
1302 sbits += rebalance - (3<<BITRES);
1303
1304 /* For a stereo split, the high bits of fill are always zero, so no
1305 folding will be done to the side. */
1306 cm |= quant_band(ctx, Y, N, sbits, B,
1307 NULL, LM, NULL,
1308 side, NULL, fill>>B);
1309 } else {
1310 /* For a stereo split, the high bits of fill are always zero, so no
1311 folding will be done to the side. */
1312 cm = quant_band(ctx, Y, N, sbits, B,
1313 NULL, LM, NULL,
1314 side, NULL, fill>>B);
1315 rebalance = sbits - (rebalance-ctx->remaining_bits);
1316 if (rebalance > 3<<BITRES && itheta!=16384)
1317 mbits += rebalance - (3<<BITRES);
1318 /* In stereo mode, we do not apply a scaling to the mid because we need the normalized
1319 mid for folding later. */
1320 cm |= quant_band(ctx, X, N, mbits, B,
1321 lowband, LM, lowband_out,
1322 Q15ONE, lowband_scratch, fill);
1323 }
1324 }
1325
1326
1327 /* This code is used by the decoder and by the resynthesis-enabled encoder */
1328 if (resynth)
1329 {
1330 if (N!=2)
1331 stereo_merge(X, Y, mid, N);
1332 if (inv)
1333 {
1334 int j;
1335 for (j=0;j<N;j++)
1336 Y[j] = -Y[j];
sergeyu@chromium.org885f2ff2012-10-17 22:31:52 +00001337 }
1338 }
1339 return cm;
1340}
1341
tlegrand@chromium.orge3ea0492013-10-23 09:13:50 +00001342
sergeyu@chromium.org885f2ff2012-10-17 22:31:52 +00001343void quant_all_bands(int encode, const CELTMode *m, int start, int end,
1344 celt_norm *X_, celt_norm *Y_, unsigned char *collapse_masks, const celt_ener *bandE, int *pulses,
1345 int shortBlocks, int spread, int dual_stereo, int intensity, int *tf_res,
1346 opus_int32 total_bits, opus_int32 balance, ec_ctx *ec, int LM, int codedBands, opus_uint32 *seed)
1347{
1348 int i;
1349 opus_int32 remaining_bits;
1350 const opus_int16 * OPUS_RESTRICT eBands = m->eBands;
1351 celt_norm * OPUS_RESTRICT norm, * OPUS_RESTRICT norm2;
1352 VARDECL(celt_norm, _norm);
tlegrand@chromium.orge3ea0492013-10-23 09:13:50 +00001353 celt_norm *lowband_scratch;
sergeyu@chromium.org885f2ff2012-10-17 22:31:52 +00001354 int B;
1355 int M;
1356 int lowband_offset;
1357 int update_lowband = 1;
1358 int C = Y_ != NULL ? 2 : 1;
tlegrand@chromium.orge3ea0492013-10-23 09:13:50 +00001359 int norm_offset;
sergeyu@chromium.org885f2ff2012-10-17 22:31:52 +00001360#ifdef RESYNTH
1361 int resynth = 1;
1362#else
1363 int resynth = !encode;
1364#endif
tlegrand@chromium.orge3ea0492013-10-23 09:13:50 +00001365 struct band_ctx ctx;
sergeyu@chromium.org885f2ff2012-10-17 22:31:52 +00001366 SAVE_STACK;
1367
1368 M = 1<<LM;
1369 B = shortBlocks ? M : 1;
tlegrand@chromium.orge3ea0492013-10-23 09:13:50 +00001370 norm_offset = M*eBands[start];
1371 /* No need to allocate norm for the last band because we don't need an
1372 output in that band. */
1373 ALLOC(_norm, C*(M*eBands[m->nbEBands-1]-norm_offset), celt_norm);
sergeyu@chromium.org885f2ff2012-10-17 22:31:52 +00001374 norm = _norm;
tlegrand@chromium.orge3ea0492013-10-23 09:13:50 +00001375 norm2 = norm + M*eBands[m->nbEBands-1]-norm_offset;
1376 /* We can use the last band as scratch space because we don't need that
1377 scratch space for the last band. */
1378 lowband_scratch = X_+M*eBands[m->nbEBands-1];
sergeyu@chromium.org885f2ff2012-10-17 22:31:52 +00001379
1380 lowband_offset = 0;
tlegrand@chromium.orge3ea0492013-10-23 09:13:50 +00001381 ctx.bandE = bandE;
1382 ctx.ec = ec;
1383 ctx.encode = encode;
1384 ctx.intensity = intensity;
1385 ctx.m = m;
1386 ctx.seed = *seed;
1387 ctx.spread = spread;
sergeyu@chromium.org885f2ff2012-10-17 22:31:52 +00001388 for (i=start;i<end;i++)
1389 {
1390 opus_int32 tell;
1391 int b;
1392 int N;
1393 opus_int32 curr_balance;
1394 int effective_lowband=-1;
1395 celt_norm * OPUS_RESTRICT X, * OPUS_RESTRICT Y;
1396 int tf_change=0;
1397 unsigned x_cm;
1398 unsigned y_cm;
tlegrand@chromium.orge3ea0492013-10-23 09:13:50 +00001399 int last;
1400
1401 ctx.i = i;
1402 last = (i==end-1);
sergeyu@chromium.org885f2ff2012-10-17 22:31:52 +00001403
1404 X = X_+M*eBands[i];
1405 if (Y_!=NULL)
1406 Y = Y_+M*eBands[i];
1407 else
1408 Y = NULL;
1409 N = M*eBands[i+1]-M*eBands[i];
1410 tell = ec_tell_frac(ec);
1411
1412 /* Compute how many bits we want to allocate to this band */
1413 if (i != start)
1414 balance -= tell;
1415 remaining_bits = total_bits-tell-1;
tlegrand@chromium.orge3ea0492013-10-23 09:13:50 +00001416 ctx.remaining_bits = remaining_bits;
sergeyu@chromium.org885f2ff2012-10-17 22:31:52 +00001417 if (i <= codedBands-1)
1418 {
1419 curr_balance = balance / IMIN(3, codedBands-i);
1420 b = IMAX(0, IMIN(16383, IMIN(remaining_bits+1,pulses[i]+curr_balance)));
1421 } else {
1422 b = 0;
1423 }
1424
1425 if (resynth && M*eBands[i]-N >= M*eBands[start] && (update_lowband || lowband_offset==0))
1426 lowband_offset = i;
1427
1428 tf_change = tf_res[i];
tlegrand@chromium.orge3ea0492013-10-23 09:13:50 +00001429 ctx.tf_change = tf_change;
sergeyu@chromium.org885f2ff2012-10-17 22:31:52 +00001430 if (i>=m->effEBands)
1431 {
1432 X=norm;
1433 if (Y_!=NULL)
1434 Y = norm;
tlegrand@chromium.orge3ea0492013-10-23 09:13:50 +00001435 lowband_scratch = NULL;
sergeyu@chromium.org885f2ff2012-10-17 22:31:52 +00001436 }
tlegrand@chromium.orge3ea0492013-10-23 09:13:50 +00001437 if (i==end-1)
1438 lowband_scratch = NULL;
sergeyu@chromium.org885f2ff2012-10-17 22:31:52 +00001439
1440 /* Get a conservative estimate of the collapse_mask's for the bands we're
tlegrand@chromium.orge3ea0492013-10-23 09:13:50 +00001441 going to be folding from. */
sergeyu@chromium.org885f2ff2012-10-17 22:31:52 +00001442 if (lowband_offset != 0 && (spread!=SPREAD_AGGRESSIVE || B>1 || tf_change<0))
1443 {
1444 int fold_start;
1445 int fold_end;
1446 int fold_i;
1447 /* This ensures we never repeat spectral content within one band */
tlegrand@chromium.orge3ea0492013-10-23 09:13:50 +00001448 effective_lowband = IMAX(0, M*eBands[lowband_offset]-norm_offset-N);
sergeyu@chromium.org885f2ff2012-10-17 22:31:52 +00001449 fold_start = lowband_offset;
tlegrand@chromium.orge3ea0492013-10-23 09:13:50 +00001450 while(M*eBands[--fold_start] > effective_lowband+norm_offset);
sergeyu@chromium.org885f2ff2012-10-17 22:31:52 +00001451 fold_end = lowband_offset-1;
tlegrand@chromium.orge3ea0492013-10-23 09:13:50 +00001452 while(M*eBands[++fold_end] < effective_lowband+norm_offset+N);
sergeyu@chromium.org885f2ff2012-10-17 22:31:52 +00001453 x_cm = y_cm = 0;
1454 fold_i = fold_start; do {
1455 x_cm |= collapse_masks[fold_i*C+0];
1456 y_cm |= collapse_masks[fold_i*C+C-1];
1457 } while (++fold_i<fold_end);
1458 }
1459 /* Otherwise, we'll be using the LCG to fold, so all blocks will (almost
tlegrand@chromium.orge3ea0492013-10-23 09:13:50 +00001460 always) be non-zero. */
sergeyu@chromium.org885f2ff2012-10-17 22:31:52 +00001461 else
1462 x_cm = y_cm = (1<<B)-1;
1463
1464 if (dual_stereo && i==intensity)
1465 {
1466 int j;
1467
tlegrand@chromium.orge3ea0492013-10-23 09:13:50 +00001468 /* Switch off dual stereo to do intensity. */
sergeyu@chromium.org885f2ff2012-10-17 22:31:52 +00001469 dual_stereo = 0;
1470 if (resynth)
tlegrand@chromium.orge3ea0492013-10-23 09:13:50 +00001471 for (j=0;j<M*eBands[i]-norm_offset;j++)
sergeyu@chromium.org885f2ff2012-10-17 22:31:52 +00001472 norm[j] = HALF32(norm[j]+norm2[j]);
1473 }
1474 if (dual_stereo)
1475 {
tlegrand@chromium.orge3ea0492013-10-23 09:13:50 +00001476 x_cm = quant_band(&ctx, X, N, b/2, B,
1477 effective_lowband != -1 ? norm+effective_lowband : NULL, LM,
1478 last?NULL:norm+M*eBands[i]-norm_offset, Q15ONE, lowband_scratch, x_cm);
1479 y_cm = quant_band(&ctx, Y, N, b/2, B,
1480 effective_lowband != -1 ? norm2+effective_lowband : NULL, LM,
1481 last?NULL:norm2+M*eBands[i]-norm_offset, Q15ONE, lowband_scratch, y_cm);
sergeyu@chromium.org885f2ff2012-10-17 22:31:52 +00001482 } else {
tlegrand@chromium.orge3ea0492013-10-23 09:13:50 +00001483 if (Y!=NULL)
1484 {
1485 x_cm = quant_band_stereo(&ctx, X, Y, N, b, B,
1486 effective_lowband != -1 ? norm+effective_lowband : NULL, LM,
1487 last?NULL:norm+M*eBands[i]-norm_offset, lowband_scratch, x_cm|y_cm);
1488 } else {
1489 x_cm = quant_band(&ctx, X, N, b, B,
1490 effective_lowband != -1 ? norm+effective_lowband : NULL, LM,
1491 last?NULL:norm+M*eBands[i]-norm_offset, Q15ONE, lowband_scratch, x_cm|y_cm);
1492 }
sergeyu@chromium.org885f2ff2012-10-17 22:31:52 +00001493 y_cm = x_cm;
1494 }
1495 collapse_masks[i*C+0] = (unsigned char)x_cm;
1496 collapse_masks[i*C+C-1] = (unsigned char)y_cm;
1497 balance += pulses[i] + tell;
1498
tlegrand@chromium.orge3ea0492013-10-23 09:13:50 +00001499 /* Update the folding position only as long as we have 1 bit/sample depth. */
sergeyu@chromium.org885f2ff2012-10-17 22:31:52 +00001500 update_lowband = b>(N<<BITRES);
1501 }
tlegrand@chromium.orge3ea0492013-10-23 09:13:50 +00001502 *seed = ctx.seed;
1503
sergeyu@chromium.org885f2ff2012-10-17 22:31:52 +00001504 RESTORE_STACK;
1505}
1506