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