Coverage Report

Created: 2025-11-11 06:46

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/opus/celt/bands.c
Line
Count
Source
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
46
int hysteresis_decision(opus_val16 val, const opus_val16 *thresholds, const opus_val16 *hysteresis, int N, int prev)
47
0
{
48
0
   int i;
49
0
   for (i=0;i<N;i++)
50
0
   {
51
0
      if (val < thresholds[i])
52
0
         break;
53
0
   }
54
0
   if (i>prev && val < thresholds[prev]+hysteresis[prev])
55
0
      i=prev;
56
0
   if (i<prev && val > thresholds[prev-1]-hysteresis[prev-1])
57
0
      i=prev;
58
0
   return i;
59
0
}
60
61
opus_uint32 celt_lcg_rand(opus_uint32 seed)
62
0
{
63
0
   return 1664525 * seed + 1013904223;
64
0
}
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 */
68
opus_int16 bitexact_cos(opus_int16 x)
69
0
{
70
0
   opus_int32 tmp;
71
0
   opus_int16 x2;
72
0
   tmp = (4096+((opus_int32)(x)*(x)))>>13;
73
0
   celt_sig_assert(tmp<=32767);
74
0
   x2 = tmp;
75
0
   x2 = (32767-x2) + FRAC_MUL16(x2, (-7651 + FRAC_MUL16(x2, (8277 + FRAC_MUL16(-626, x2)))));
76
0
   celt_sig_assert(x2<=32766);
77
0
   return 1+x2;
78
0
}
79
80
int bitexact_log2tan(int isin,int icos)
81
0
{
82
0
   int lc;
83
0
   int ls;
84
0
   lc=EC_ILOG(icos);
85
0
   ls=EC_ILOG(isin);
86
0
   icos<<=15-lc;
87
0
   isin<<=15-ls;
88
0
   return (ls-lc)*(1<<11)
89
0
         +FRAC_MUL16(isin, FRAC_MUL16(isin, -2597) + 7932)
90
0
         -FRAC_MUL16(icos, FRAC_MUL16(icos, -2597) + 7932);
91
0
}
92
93
#ifdef FIXED_POINT
94
/* Compute the amplitude (sqrt energy) in each of the bands */
95
void compute_band_energies(const CELTMode *m, const celt_sig *X, celt_ener *bandE, int end, int C, int LM, int arch)
96
0
{
97
0
   int i, c, N;
98
0
   const opus_int16 *eBands = m->eBands;
99
0
   (void)arch;
100
0
   N = m->shortMdctSize<<LM;
101
0
   c=0; do {
102
0
      for (i=0;i<end;i++)
103
0
      {
104
0
         int j;
105
0
         opus_val32 maxval=0;
106
0
         opus_val32 sum = 0;
107
108
0
         maxval = celt_maxabs32(&X[c*N+(eBands[i]<<LM)], (eBands[i+1]-eBands[i])<<LM);
109
0
         if (maxval > 0)
110
0
         {
111
0
            int shift = IMAX(0, 30 - celt_ilog2(maxval+(maxval>>14)+1) - ((((m->logN[i]+7)>>BITRES)+LM+1)>>1));
112
0
            j=eBands[i]<<LM; do {
113
0
               opus_val32 x = SHL32(X[j+c*N],shift);
114
0
               sum = ADD32(sum, MULT32_32_Q31(x, x));
115
0
            } while (++j<eBands[i+1]<<LM);
116
0
            bandE[i+c*m->nbEBands] = MAX32(maxval, PSHR32(celt_sqrt32(SHR32(sum,1)), shift));
117
0
         } else {
118
0
            bandE[i+c*m->nbEBands] = EPSILON;
119
0
         }
120
0
      }
121
0
   } while (++c<C);
122
0
}
123
124
/* Normalise each band such that the energy is one. */
125
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)
126
0
{
127
0
   int i, c, N;
128
0
   const opus_int16 *eBands = m->eBands;
129
0
   N = M*m->shortMdctSize;
130
0
   c=0; do {
131
0
      i=0; do {
132
0
         int j,shift;
133
0
         opus_val32 E;
134
0
         opus_val32 g;
135
0
         E = bandE[i+c*m->nbEBands];
136
         /* For very low energies, we need this to make sure not to prevent energy rounding from
137
            blowing up the normalized signal. */
138
0
         if (E < 10) E += EPSILON;
139
0
         shift = 30-celt_zlog2(E);
140
0
         E = SHL32(E, shift);
141
0
         g = celt_rcp_norm32(E);
142
0
         j=M*eBands[i]; do {
143
0
            X[j+c*N] = PSHR32(MULT32_32_Q31(g, SHL32(freq[j+c*N], shift)), 30-NORM_SHIFT);
144
0
         } while (++j<M*eBands[i+1]);
145
0
      } while (++i<end);
146
0
   } while (++c<C);
147
0
}
148
149
#else /* FIXED_POINT */
150
/* Compute the amplitude (sqrt energy) in each of the bands */
151
void compute_band_energies(const CELTMode *m, const celt_sig *X, celt_ener *bandE, int end, int C, int LM, int arch)
152
{
153
   int i, c, N;
154
   const opus_int16 *eBands = m->eBands;
155
   N = m->shortMdctSize<<LM;
156
   c=0; do {
157
      for (i=0;i<end;i++)
158
      {
159
         opus_val32 sum;
160
         sum = 1e-27f + celt_inner_prod(&X[c*N+(eBands[i]<<LM)], &X[c*N+(eBands[i]<<LM)], (eBands[i+1]-eBands[i])<<LM, arch);
161
         bandE[i+c*m->nbEBands] = celt_sqrt(sum);
162
         /*printf ("%f ", bandE[i+c*m->nbEBands]);*/
163
      }
164
   } while (++c<C);
165
   /*printf ("\n");*/
166
}
167
168
/* Normalise each band such that the energy is one. */
169
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)
170
{
171
   int i, c, N;
172
   const opus_int16 *eBands = m->eBands;
173
   N = M*m->shortMdctSize;
174
   c=0; do {
175
      for (i=0;i<end;i++)
176
      {
177
         int j;
178
         opus_val16 g = 1.f/(1e-27f+bandE[i+c*m->nbEBands]);
179
         for (j=M*eBands[i];j<M*eBands[i+1];j++)
180
            X[j+c*N] = freq[j+c*N]*g;
181
      }
182
   } while (++c<C);
183
}
184
185
#endif /* FIXED_POINT */
186
187
/* De-normalise the energy to produce the synthesis from the unit-energy bands */
188
void denormalise_bands(const CELTMode *m, const celt_norm * OPUS_RESTRICT X,
189
      celt_sig * OPUS_RESTRICT freq, const celt_glog *bandLogE, int start,
190
      int end, int M, int downsample, int silence)
191
0
{
192
0
   int i, N;
193
0
   int bound;
194
0
   celt_sig * OPUS_RESTRICT f;
195
0
   const celt_norm * OPUS_RESTRICT x;
196
0
   const opus_int16 *eBands = m->eBands;
197
0
   N = M*m->shortMdctSize;
198
0
   bound = M*eBands[end];
199
0
   if (downsample!=1)
200
0
      bound = IMIN(bound, N/downsample);
201
0
   if (silence)
202
0
   {
203
0
      bound = 0;
204
0
      start = end = 0;
205
0
   }
206
0
   f = freq;
207
0
   x = X+M*eBands[start];
208
0
   if (start != 0)
209
0
   {
210
0
      for (i=0;i<M*eBands[start];i++)
211
0
         *f++ = 0;
212
0
   } else {
213
0
      f += M*eBands[start];
214
0
   }
215
0
   for (i=start;i<end;i++)
216
0
   {
217
0
      int j, band_end;
218
0
      opus_val32 g;
219
0
      celt_glog lg;
220
0
#ifdef FIXED_POINT
221
0
      int shift;
222
0
#endif
223
0
      j=M*eBands[i];
224
0
      band_end = M*eBands[i+1];
225
0
      lg = ADD32(bandLogE[i], SHL32((opus_val32)eMeans[i],DB_SHIFT-4));
226
#ifndef FIXED_POINT
227
      g = celt_exp2_db(MIN32(32.f, lg));
228
#else
229
      /* Handle the integer part of the log energy */
230
0
      shift = 17-(lg>>DB_SHIFT);
231
0
      if (shift>=31)
232
0
      {
233
0
         shift=0;
234
0
         g=0;
235
0
      } else {
236
         /* Handle the fractional part. */
237
0
         g = SHL32(celt_exp2_db_frac((lg&((1<<DB_SHIFT)-1))), 2);
238
0
      }
239
      /* Handle extreme gains with negative shift. */
240
0
      if (shift<0)
241
0
      {
242
         /* To avoid overflow, we're
243
            capping the gain here, which is equivalent to a cap of 18 on lg.
244
            This shouldn't trigger unless the bitstream is already corrupted. */
245
0
         g = 2147483647;
246
0
         shift = 0;
247
0
      }
248
0
#endif
249
0
      do {
250
0
         *f++ = PSHR32(MULT32_32_Q31(SHL32(*x, 30-NORM_SHIFT), g), shift);
251
0
         x++;
252
0
      } while (++j<band_end);
253
0
   }
254
0
   celt_assert(start <= end);
255
0
   OPUS_CLEAR(&freq[bound], N-bound);
256
0
}
257
258
/* This prevents energy collapse for transients with multiple short MDCTs */
259
void anti_collapse(const CELTMode *m, celt_norm *X_, unsigned char *collapse_masks, int LM, int C, int size,
260
      int start, int end, const celt_glog *logE, const celt_glog *prev1logE,
261
      const celt_glog *prev2logE, const int *pulses, opus_uint32 seed, int encode, int arch)
262
0
{
263
0
   int c, i, j, k;
264
0
   for (i=start;i<end;i++)
265
0
   {
266
0
      int N0;
267
0
      opus_val16 thresh, sqrt_1;
268
0
      int depth;
269
0
#ifdef FIXED_POINT
270
0
      int shift;
271
0
      opus_val32 thresh32;
272
0
#endif
273
274
0
      N0 = m->eBands[i+1]-m->eBands[i];
275
      /* depth in 1/8 bits */
276
0
      celt_sig_assert(pulses[i]>=0);
277
0
      depth = celt_udiv(1+pulses[i], (m->eBands[i+1]-m->eBands[i]))>>LM;
278
279
0
#ifdef FIXED_POINT
280
0
      thresh32 = SHR32(celt_exp2(-SHL16(depth, 10-BITRES)),1);
281
0
      thresh = MULT16_32_Q15(QCONST16(0.5f, 15), MIN32(32767,thresh32));
282
0
      {
283
0
         opus_val32 t;
284
0
         t = N0<<LM;
285
0
         shift = celt_ilog2(t)>>1;
286
0
         t = SHL32(t, (7-shift)<<1);
287
0
         sqrt_1 = celt_rsqrt_norm(t);
288
0
      }
289
#else
290
      thresh = .5f*celt_exp2(-.125f*depth);
291
      sqrt_1 = celt_rsqrt(N0<<LM);
292
#endif
293
294
0
      c=0; do
295
0
      {
296
0
         celt_norm *X;
297
0
         celt_glog prev1;
298
0
         celt_glog prev2;
299
0
         opus_val32 Ediff;
300
0
         celt_norm r;
301
0
         int renormalize=0;
302
0
         prev1 = prev1logE[c*m->nbEBands+i];
303
0
         prev2 = prev2logE[c*m->nbEBands+i];
304
0
         if (!encode && C==1)
305
0
         {
306
0
            prev1 = MAXG(prev1,prev1logE[m->nbEBands+i]);
307
0
            prev2 = MAXG(prev2,prev2logE[m->nbEBands+i]);
308
0
         }
309
0
         Ediff = logE[c*m->nbEBands+i]-MING(prev1,prev2);
310
0
         Ediff = MAX32(0, Ediff);
311
312
0
#ifdef FIXED_POINT
313
0
         if (Ediff < GCONST(16.f))
314
0
         {
315
0
            opus_val32 r32 = SHR32(celt_exp2_db(-Ediff),1);
316
0
            r = 2*MIN16(16383,r32);
317
0
         } else {
318
0
            r = 0;
319
0
         }
320
0
         if (LM==3)
321
0
            r = MULT16_16_Q14(23170, MIN32(23169, r));
322
0
         r = SHR16(MIN16(thresh, r),1);
323
0
         r = VSHR32(MULT16_16_Q15(sqrt_1, r),shift+14-NORM_SHIFT);
324
#else
325
         /* r needs to be multiplied by 2 or 2*sqrt(2) depending on LM because
326
            short blocks don't have the same energy as long */
327
         r = 2.f*celt_exp2_db(-Ediff);
328
         if (LM==3)
329
            r *= 1.41421356f;
330
         r = MIN16(thresh, r);
331
         r = r*sqrt_1;
332
#endif
333
0
         X = X_+c*size+(m->eBands[i]<<LM);
334
0
         for (k=0;k<1<<LM;k++)
335
0
         {
336
            /* Detect collapse */
337
0
            if (!(collapse_masks[i*C+c]&1<<k))
338
0
            {
339
               /* Fill with noise */
340
0
               for (j=0;j<N0;j++)
341
0
               {
342
0
                  seed = celt_lcg_rand(seed);
343
0
                  X[(j<<LM)+k] = (seed&0x8000 ? r : -r);
344
0
               }
345
0
               renormalize = 1;
346
0
            }
347
0
         }
348
         /* We just added some energy, so we need to renormalise */
349
0
         if (renormalize)
350
0
            renormalise_vector(X, N0<<LM, Q31ONE, arch);
351
0
      } while (++c<C);
352
0
   }
353
0
}
354
355
/* Compute the weights to use for optimizing normalized distortion across
356
   channels. We use the amplitude to weight square distortion, which means
357
   that we use the square root of the value we would have been using if we
358
   wanted to minimize the MSE in the non-normalized domain. This roughly
359
   corresponds to some quick-and-dirty perceptual experiments I ran to
360
   measure inter-aural masking (there doesn't seem to be any published data
361
   on the topic). */
362
static void compute_channel_weights(celt_ener Ex, celt_ener Ey, opus_val16 w[2])
363
0
{
364
0
   celt_ener minE;
365
0
#ifdef FIXED_POINT
366
0
   int shift;
367
0
#endif
368
0
   minE = MIN32(Ex, Ey);
369
   /* Adjustment to make the weights a bit more conservative. */
370
0
   Ex = ADD32(Ex, minE/3);
371
0
   Ey = ADD32(Ey, minE/3);
372
0
#ifdef FIXED_POINT
373
0
   shift = celt_ilog2(EPSILON+MAX32(Ex, Ey))-14;
374
0
#endif
375
0
   w[0] = VSHR32(Ex, shift);
376
0
   w[1] = VSHR32(Ey, shift);
377
0
}
378
379
static void intensity_stereo(const CELTMode *m, celt_norm * OPUS_RESTRICT X, const celt_norm * OPUS_RESTRICT Y, const celt_ener *bandE, int bandID, int N)
380
0
{
381
0
   int i = bandID;
382
0
   int j;
383
0
   opus_val16 a1, a2;
384
0
   opus_val16 left, right;
385
0
   opus_val16 norm;
386
0
#ifdef FIXED_POINT
387
0
   int shift = celt_zlog2(MAX32(bandE[i], bandE[i+m->nbEBands]))-13;
388
0
#endif
389
0
   left = VSHR32(bandE[i],shift);
390
0
   right = VSHR32(bandE[i+m->nbEBands],shift);
391
0
   norm = EPSILON + celt_sqrt(EPSILON+MULT16_16(left,left)+MULT16_16(right,right));
392
0
#ifdef FIXED_POINT
393
0
   left = MIN32(left, norm-1);
394
0
   right = MIN32(right, norm-1);
395
0
#endif
396
0
   a1 = DIV32_16(SHL32(EXTEND32(left),15),norm);
397
0
   a2 = DIV32_16(SHL32(EXTEND32(right),15),norm);
398
0
   for (j=0;j<N;j++)
399
0
   {
400
0
      X[j] = ADD32(MULT16_32_Q15(a1, X[j]), MULT16_32_Q15(a2, Y[j]));
401
      /* Side is not encoded, no need to calculate */
402
0
   }
403
0
}
404
405
static void stereo_split(celt_norm * OPUS_RESTRICT X, celt_norm * OPUS_RESTRICT Y, int N)
406
0
{
407
0
   int j;
408
0
   for (j=0;j<N;j++)
409
0
   {
410
0
      opus_val32 r, l;
411
0
      l = MULT32_32_Q31(QCONST32(.70710678f,31), X[j]);
412
0
      r = MULT32_32_Q31(QCONST32(.70710678f,31), Y[j]);
413
0
      X[j] = ADD32(l, r);
414
0
      Y[j] = SUB32(r, l);
415
0
   }
416
0
}
417
418
static void stereo_merge(celt_norm * OPUS_RESTRICT X, celt_norm * OPUS_RESTRICT Y, opus_val32 mid, int N, int arch)
419
0
{
420
0
   int j;
421
0
   opus_val32 xp=0, side=0;
422
0
   opus_val32 El, Er;
423
0
#ifdef FIXED_POINT
424
0
   int kl, kr;
425
0
#endif
426
0
   opus_val32 t, lgain, rgain;
427
428
   /* Compute the norm of X+Y and X-Y as |X|^2 + |Y|^2 +/- sum(xy) */
429
0
   xp = celt_inner_prod_norm_shift(Y, X, N, arch);
430
0
   side = celt_inner_prod_norm_shift(Y, Y, N, arch);
431
   /* Compensating for the mid normalization */
432
0
   xp = MULT32_32_Q31(mid, xp);
433
   /* mid and side are in Q15, not Q14 like X and Y */
434
0
   El = SHR32(MULT32_32_Q31(mid, mid),3) + side - 2*xp;
435
0
   Er = SHR32(MULT32_32_Q31(mid, mid),3) + side + 2*xp;
436
0
   if (Er < QCONST32(6e-4f, 28) || El < QCONST32(6e-4f, 28))
437
0
   {
438
0
      OPUS_COPY(Y, X, N);
439
0
      return;
440
0
   }
441
442
0
#ifdef FIXED_POINT
443
0
   kl = celt_ilog2(El)>>1;
444
0
   kr = celt_ilog2(Er)>>1;
445
0
#endif
446
0
   t = VSHR32(El, (kl<<1)-29);
447
0
   lgain = celt_rsqrt_norm32(t);
448
0
   t = VSHR32(Er, (kr<<1)-29);
449
0
   rgain = celt_rsqrt_norm32(t);
450
451
0
#ifdef FIXED_POINT
452
0
   if (kl < 7)
453
0
      kl = 7;
454
0
   if (kr < 7)
455
0
      kr = 7;
456
0
#endif
457
458
0
   for (j=0;j<N;j++)
459
0
   {
460
0
      celt_norm r, l;
461
      /* Apply mid scaling (side is already scaled) */
462
0
      l = MULT32_32_Q31(mid, X[j]);
463
0
      r = Y[j];
464
0
      X[j] = VSHR32(MULT32_32_Q31(lgain, SUB32(l,r)), kl-15);
465
0
      Y[j] = VSHR32(MULT32_32_Q31(rgain, ADD32(l,r)), kr-15);
466
0
   }
467
0
}
468
469
/* Decide whether we should spread the pulses in the current frame */
470
int spreading_decision(const CELTMode *m, const celt_norm *X, int *average,
471
      int last_decision, int *hf_average, int *tapset_decision, int update_hf,
472
      int end, int C, int M, const int *spread_weight)
473
0
{
474
0
   int i, c, N0;
475
0
   int sum = 0, nbBands=0;
476
0
   const opus_int16 * OPUS_RESTRICT eBands = m->eBands;
477
0
   int decision;
478
0
   int hf_sum=0;
479
480
0
   celt_assert(end>0);
481
482
0
   N0 = M*m->shortMdctSize;
483
484
0
   if (M*(eBands[end]-eBands[end-1]) <= 8)
485
0
      return SPREAD_NONE;
486
0
   c=0; do {
487
0
      for (i=0;i<end;i++)
488
0
      {
489
0
         int j, N, tmp=0;
490
0
         int tcount[3] = {0,0,0};
491
0
         const celt_norm * OPUS_RESTRICT x = X+M*eBands[i]+c*N0;
492
0
         N = M*(eBands[i+1]-eBands[i]);
493
0
         if (N<=8)
494
0
            continue;
495
         /* Compute rough CDF of |x[j]| */
496
0
         for (j=0;j<N;j++)
497
0
         {
498
0
            opus_val32 x2N; /* Q13 */
499
500
0
            x2N = MULT16_16(MULT16_16_Q15(SHR32(x[j], NORM_SHIFT-14), SHR32(x[j], NORM_SHIFT-14)), N);
501
0
            if (x2N < QCONST16(0.25f,13))
502
0
               tcount[0]++;
503
0
            if (x2N < QCONST16(0.0625f,13))
504
0
               tcount[1]++;
505
0
            if (x2N < QCONST16(0.015625f,13))
506
0
               tcount[2]++;
507
0
         }
508
509
         /* Only include four last bands (8 kHz and up) */
510
0
         if (i>m->nbEBands-4)
511
0
            hf_sum += celt_udiv(32*(tcount[1]+tcount[0]), N);
512
0
         tmp = (2*tcount[2] >= N) + (2*tcount[1] >= N) + (2*tcount[0] >= N);
513
0
         sum += tmp*spread_weight[i];
514
0
         nbBands+=spread_weight[i];
515
0
      }
516
0
   } while (++c<C);
517
518
0
   if (update_hf)
519
0
   {
520
0
      if (hf_sum)
521
0
         hf_sum = celt_udiv(hf_sum, C*(4-m->nbEBands+end));
522
0
      *hf_average = (*hf_average+hf_sum)>>1;
523
0
      hf_sum = *hf_average;
524
0
      if (*tapset_decision==2)
525
0
         hf_sum += 4;
526
0
      else if (*tapset_decision==0)
527
0
         hf_sum -= 4;
528
0
      if (hf_sum > 22)
529
0
         *tapset_decision=2;
530
0
      else if (hf_sum > 18)
531
0
         *tapset_decision=1;
532
0
      else
533
0
         *tapset_decision=0;
534
0
   }
535
   /*printf("%d %d %d\n", hf_sum, *hf_average, *tapset_decision);*/
536
0
   celt_assert(nbBands>0); /* end has to be non-zero */
537
0
   celt_assert(sum>=0);
538
0
   sum = celt_udiv((opus_int32)sum<<8, nbBands);
539
   /* Recursive averaging */
540
0
   sum = (sum+*average)>>1;
541
0
   *average = sum;
542
   /* Hysteresis */
543
0
   sum = (3*sum + (((3-last_decision)<<7) + 64) + 2)>>2;
544
0
   if (sum < 80)
545
0
   {
546
0
      decision = SPREAD_AGGRESSIVE;
547
0
   } else if (sum < 256)
548
0
   {
549
0
      decision = SPREAD_NORMAL;
550
0
   } else if (sum < 384)
551
0
   {
552
0
      decision = SPREAD_LIGHT;
553
0
   } else {
554
0
      decision = SPREAD_NONE;
555
0
   }
556
#ifdef FUZZING
557
   decision = rand()&0x3;
558
   *tapset_decision=rand()%3;
559
#endif
560
0
   return decision;
561
0
}
562
563
/* Indexing table for converting from natural Hadamard to ordery Hadamard
564
   This is essentially a bit-reversed Gray, on top of which we've added
565
   an inversion of the order because we want the DC at the end rather than
566
   the beginning. The lines are for N=2, 4, 8, 16 */
567
static const int ordery_table[] = {
568
       1,  0,
569
       3,  0,  2,  1,
570
       7,  0,  4,  3,  6,  1,  5,  2,
571
      15,  0,  8,  7, 12,  3, 11,  4, 14,  1,  9,  6, 13,  2, 10,  5,
572
};
573
574
static void deinterleave_hadamard(celt_norm *X, int N0, int stride, int hadamard)
575
0
{
576
0
   int i,j;
577
0
   VARDECL(celt_norm, tmp);
578
0
   int N;
579
0
   SAVE_STACK;
580
0
   N = N0*stride;
581
0
   ALLOC(tmp, N, celt_norm);
582
0
   celt_assert(stride>0);
583
0
   if (hadamard)
584
0
   {
585
0
      const int *ordery = ordery_table+stride-2;
586
0
      for (i=0;i<stride;i++)
587
0
      {
588
0
         for (j=0;j<N0;j++)
589
0
            tmp[ordery[i]*N0+j] = X[j*stride+i];
590
0
      }
591
0
   } else {
592
0
      for (i=0;i<stride;i++)
593
0
         for (j=0;j<N0;j++)
594
0
            tmp[i*N0+j] = X[j*stride+i];
595
0
   }
596
0
   OPUS_COPY(X, tmp, N);
597
0
   RESTORE_STACK;
598
0
}
599
600
static void interleave_hadamard(celt_norm *X, int N0, int stride, int hadamard)
601
0
{
602
0
   int i,j;
603
0
   VARDECL(celt_norm, tmp);
604
0
   int N;
605
0
   SAVE_STACK;
606
0
   N = N0*stride;
607
0
   ALLOC(tmp, N, celt_norm);
608
0
   if (hadamard)
609
0
   {
610
0
      const int *ordery = ordery_table+stride-2;
611
0
      for (i=0;i<stride;i++)
612
0
         for (j=0;j<N0;j++)
613
0
            tmp[j*stride+i] = X[ordery[i]*N0+j];
614
0
   } else {
615
0
      for (i=0;i<stride;i++)
616
0
         for (j=0;j<N0;j++)
617
0
            tmp[j*stride+i] = X[i*N0+j];
618
0
   }
619
0
   OPUS_COPY(X, tmp, N);
620
0
   RESTORE_STACK;
621
0
}
622
623
void haar1(celt_norm *X, int N0, int stride)
624
0
{
625
0
   int i, j;
626
0
   N0 >>= 1;
627
0
   for (i=0;i<stride;i++)
628
0
      for (j=0;j<N0;j++)
629
0
      {
630
0
         opus_val32 tmp1, tmp2;
631
0
         tmp1 = MULT32_32_Q31(QCONST32(.70710678f,31), X[stride*2*j+i]);
632
0
         tmp2 = MULT32_32_Q31(QCONST32(.70710678f,31), X[stride*(2*j+1)+i]);
633
0
         X[stride*2*j+i] = ADD32(tmp1, tmp2);
634
0
         X[stride*(2*j+1)+i] = SUB32(tmp1, tmp2);
635
0
      }
636
0
}
637
638
static int compute_qn(int N, int b, int offset, int pulse_cap, int stereo)
639
0
{
640
0
   static const opus_int16 exp2_table8[8] =
641
0
      {16384, 17866, 19483, 21247, 23170, 25267, 27554, 30048};
642
0
   int qn, qb;
643
0
   int N2 = 2*N-1;
644
0
   if (stereo && N==2)
645
0
      N2--;
646
   /* The upper limit ensures that in a stereo split with itheta==16384, we'll
647
       always have enough bits left over to code at least one pulse in the
648
       side; otherwise it would collapse, since it doesn't get folded. */
649
0
   qb = celt_sudiv(b+N2*offset, N2);
650
0
   qb = IMIN(b-pulse_cap-(4<<BITRES), qb);
651
652
0
   qb = IMIN(8<<BITRES, qb);
653
654
0
   if (qb<(1<<BITRES>>1)) {
655
0
      qn = 1;
656
0
   } else {
657
0
      qn = exp2_table8[qb&0x7]>>(14-(qb>>BITRES));
658
0
      qn = (qn+1)>>1<<1;
659
0
   }
660
0
   celt_assert(qn <= 256);
661
0
   return qn;
662
0
}
663
664
struct band_ctx {
665
   int encode;
666
   int resynth;
667
   const CELTMode *m;
668
   int i;
669
   int intensity;
670
   int spread;
671
   int tf_change;
672
   ec_ctx *ec;
673
   opus_int32 remaining_bits;
674
   const celt_ener *bandE;
675
   opus_uint32 seed;
676
   int arch;
677
   int theta_round;
678
   int disable_inv;
679
   int avoid_split_noise;
680
#ifdef ENABLE_QEXT
681
   ec_ctx *ext_ec;
682
   int extra_bits;
683
   opus_int32 ext_total_bits;
684
   int extra_bands;
685
#endif
686
};
687
688
struct split_ctx {
689
   int inv;
690
   int imid;
691
   int iside;
692
   int delta;
693
   int itheta;
694
#ifdef ENABLE_QEXT
695
   int itheta_q30;
696
#endif
697
   int qalloc;
698
};
699
700
static void compute_theta(struct band_ctx *ctx, struct split_ctx *sctx,
701
      celt_norm *X, celt_norm *Y, int N, int *b, int B, int B0,
702
      int LM,
703
      int stereo, int *fill ARG_QEXT(int *ext_b))
704
0
{
705
0
   int qn;
706
0
   int itheta=0;
707
0
   int itheta_q30=0;
708
0
   int delta;
709
0
   int imid, iside;
710
0
   int qalloc;
711
0
   int pulse_cap;
712
0
   int offset;
713
0
   opus_int32 tell;
714
0
   int inv=0;
715
0
   int encode;
716
0
   const CELTMode *m;
717
0
   int i;
718
0
   int intensity;
719
0
   ec_ctx *ec;
720
0
   const celt_ener *bandE;
721
722
0
   encode = ctx->encode;
723
0
   m = ctx->m;
724
0
   i = ctx->i;
725
0
   intensity = ctx->intensity;
726
0
   ec = ctx->ec;
727
0
   bandE = ctx->bandE;
728
729
   /* Decide on the resolution to give to the split parameter theta */
730
0
   pulse_cap = m->logN[i]+LM*(1<<BITRES);
731
0
   offset = (pulse_cap>>1) - (stereo&&N==2 ? QTHETA_OFFSET_TWOPHASE : QTHETA_OFFSET);
732
0
   qn = compute_qn(N, *b, offset, pulse_cap, stereo);
733
0
   if (stereo && i>=intensity)
734
0
      qn = 1;
735
0
   if (encode)
736
0
   {
737
      /* theta is the atan() of the ratio between the (normalized)
738
         side and mid. With just that parameter, we can re-scale both
739
         mid and side because we know that 1) they have unit norm and
740
         2) they are orthogonal. */
741
0
      itheta_q30 = stereo_itheta(X, Y, stereo, N, ctx->arch);
742
0
      itheta = itheta_q30>>16;
743
0
   }
744
0
   tell = ec_tell_frac(ec);
745
0
   if (qn!=1)
746
0
   {
747
0
      if (encode)
748
0
      {
749
0
         if (!stereo || ctx->theta_round == 0)
750
0
         {
751
0
            itheta = (itheta*(opus_int32)qn+8192)>>14;
752
0
            if (!stereo && ctx->avoid_split_noise && itheta > 0 && itheta < qn)
753
0
            {
754
               /* Check if the selected value of theta will cause the bit allocation
755
                  to inject noise on one side. If so, make sure the energy of that side
756
                  is zero. */
757
0
               int unquantized = celt_udiv((opus_int32)itheta*16384, qn);
758
0
               imid = bitexact_cos((opus_int16)unquantized);
759
0
               iside = bitexact_cos((opus_int16)(16384-unquantized));
760
0
               delta = FRAC_MUL16((N-1)<<7,bitexact_log2tan(iside,imid));
761
0
               if (delta > *b)
762
0
                  itheta = qn;
763
0
               else if (delta < -*b)
764
0
                  itheta = 0;
765
0
            }
766
0
         } else {
767
0
            int down;
768
            /* Bias quantization towards itheta=0 and itheta=16384. */
769
0
            int bias = itheta > 8192 ? 32767/qn : -32767/qn;
770
0
            down = IMIN(qn-1, IMAX(0, (itheta*(opus_int32)qn + bias)>>14));
771
0
            if (ctx->theta_round < 0)
772
0
               itheta = down;
773
0
            else
774
0
               itheta = down+1;
775
0
         }
776
0
      }
777
      /* Entropy coding of the angle. We use a uniform pdf for the
778
         time split, a step for stereo, and a triangular one for the rest. */
779
0
      if (stereo && N>2)
780
0
      {
781
0
         int p0 = 3;
782
0
         int x = itheta;
783
0
         int x0 = qn/2;
784
0
         int ft = p0*(x0+1) + x0;
785
         /* Use a probability of p0 up to itheta=8192 and then use 1 after */
786
0
         if (encode)
787
0
         {
788
0
            ec_encode(ec,x<=x0?p0*x:(x-1-x0)+(x0+1)*p0,x<=x0?p0*(x+1):(x-x0)+(x0+1)*p0,ft);
789
0
         } else {
790
0
            int fs;
791
0
            fs=ec_decode(ec,ft);
792
0
            if (fs<(x0+1)*p0)
793
0
               x=fs/p0;
794
0
            else
795
0
               x=x0+1+(fs-(x0+1)*p0);
796
0
            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);
797
0
            itheta = x;
798
0
         }
799
0
      } else if (B0>1 || stereo) {
800
         /* Uniform pdf */
801
0
         if (encode)
802
0
            ec_enc_uint(ec, itheta, qn+1);
803
0
         else
804
0
            itheta = ec_dec_uint(ec, qn+1);
805
0
      } else {
806
0
         int fs=1, ft;
807
0
         ft = ((qn>>1)+1)*((qn>>1)+1);
808
0
         if (encode)
809
0
         {
810
0
            int fl;
811
812
0
            fs = itheta <= (qn>>1) ? itheta + 1 : qn + 1 - itheta;
813
0
            fl = itheta <= (qn>>1) ? itheta*(itheta + 1)>>1 :
814
0
             ft - ((qn + 1 - itheta)*(qn + 2 - itheta)>>1);
815
816
0
            ec_encode(ec, fl, fl+fs, ft);
817
0
         } else {
818
            /* Triangular pdf */
819
0
            int fl=0;
820
0
            int fm;
821
0
            fm = ec_decode(ec, ft);
822
823
0
            if (fm < ((qn>>1)*((qn>>1) + 1)>>1))
824
0
            {
825
0
               itheta = (isqrt32(8*(opus_uint32)fm + 1) - 1)>>1;
826
0
               fs = itheta + 1;
827
0
               fl = itheta*(itheta + 1)>>1;
828
0
            }
829
0
            else
830
0
            {
831
0
               itheta = (2*(qn + 1)
832
0
                - isqrt32(8*(opus_uint32)(ft - fm - 1) + 1))>>1;
833
0
               fs = qn + 1 - itheta;
834
0
               fl = ft - ((qn + 1 - itheta)*(qn + 2 - itheta)>>1);
835
0
            }
836
837
0
            ec_dec_update(ec, fl, fl+fs, ft);
838
0
         }
839
0
      }
840
0
      celt_assert(itheta>=0);
841
0
      itheta = celt_udiv((opus_int32)itheta*16384, qn);
842
#ifdef ENABLE_QEXT
843
      *ext_b = IMIN(*ext_b, ctx->ext_total_bits - (opus_int32)ec_tell_frac(ctx->ext_ec));
844
      if (*ext_b >= 2*N<<BITRES && ctx->ext_total_bits-ec_tell_frac(ctx->ext_ec)-1 > 2<<BITRES) {
845
         int extra_bits;
846
         int ext_tell = ec_tell_frac(ctx->ext_ec);
847
         extra_bits = IMIN(12, IMAX(2, celt_sudiv(*ext_b, (2*N-1)<<BITRES)));
848
         if (encode) {
849
            itheta_q30 = itheta_q30 - (itheta<<16);
850
            itheta_q30 = (itheta_q30*(opus_int64)qn*((1<<extra_bits)-1)+(1<<29))>>30;
851
            itheta_q30 += (1<<(extra_bits-1))-1;
852
            itheta_q30 = IMAX(0, IMIN((1<<extra_bits)-2, itheta_q30));
853
            ec_enc_uint(ctx->ext_ec, itheta_q30, (1<<extra_bits)-1);
854
         } else {
855
            itheta_q30 = ec_dec_uint(ctx->ext_ec, (1<<extra_bits)-1);
856
         }
857
         itheta_q30 -= (1<<(extra_bits-1))-1;
858
         itheta_q30 = (itheta<<16) + itheta_q30*(opus_int64)(1<<30)/(qn*((1<<extra_bits)-1));
859
         /* Hard bounds on itheta (can only trigger on corrupted bitstreams). */
860
         itheta_q30 = IMAX(0, IMIN(itheta_q30, 1073741824));
861
         *ext_b -= ec_tell_frac(ctx->ext_ec) - ext_tell;
862
      } else {
863
         itheta_q30 = (opus_int32)itheta<<16;
864
      }
865
#endif
866
0
      if (encode && stereo)
867
0
      {
868
0
         if (itheta==0)
869
0
            intensity_stereo(m, X, Y, bandE, i, N);
870
0
         else
871
0
            stereo_split(X, Y, N);
872
0
      }
873
      /* NOTE: Renormalising X and Y *may* help fixed-point a bit at very high rate.
874
               Let's do that at higher complexity */
875
0
   } else if (stereo) {
876
0
      if (encode)
877
0
      {
878
0
         inv = itheta > 8192 && !ctx->disable_inv;
879
0
         if (inv)
880
0
         {
881
0
            int j;
882
0
            for (j=0;j<N;j++)
883
0
               Y[j] = -Y[j];
884
0
         }
885
0
         intensity_stereo(m, X, Y, bandE, i, N);
886
0
      }
887
0
      if (*b>2<<BITRES && ctx->remaining_bits > 2<<BITRES)
888
0
      {
889
0
         if (encode)
890
0
            ec_enc_bit_logp(ec, inv, 2);
891
0
         else
892
0
            inv = ec_dec_bit_logp(ec, 2);
893
0
      } else
894
0
         inv = 0;
895
      /* inv flag override to avoid problems with downmixing. */
896
0
      if (ctx->disable_inv)
897
0
         inv = 0;
898
0
      itheta = 0;
899
0
      itheta_q30 = 0;
900
0
   }
901
0
   qalloc = ec_tell_frac(ec) - tell;
902
0
   *b -= qalloc;
903
904
0
   if (itheta == 0)
905
0
   {
906
0
      imid = 32767;
907
0
      iside = 0;
908
0
      *fill &= (1<<B)-1;
909
0
      delta = -16384;
910
0
   } else if (itheta == 16384)
911
0
   {
912
0
      imid = 0;
913
0
      iside = 32767;
914
0
      *fill &= ((1<<B)-1)<<B;
915
0
      delta = 16384;
916
0
   } else {
917
0
      imid = bitexact_cos((opus_int16)itheta);
918
0
      iside = bitexact_cos((opus_int16)(16384-itheta));
919
      /* This is the mid vs side allocation that minimizes squared error
920
         in that band. */
921
0
      delta = FRAC_MUL16((N-1)<<7,bitexact_log2tan(iside,imid));
922
0
   }
923
924
0
   sctx->inv = inv;
925
0
   sctx->imid = imid;
926
0
   sctx->iside = iside;
927
0
   sctx->delta = delta;
928
0
   sctx->itheta = itheta;
929
#ifdef ENABLE_QEXT
930
   sctx->itheta_q30 = itheta_q30;
931
#endif
932
0
   sctx->qalloc = qalloc;
933
0
}
934
static unsigned quant_band_n1(struct band_ctx *ctx, celt_norm *X, celt_norm *Y,
935
      celt_norm *lowband_out)
936
0
{
937
0
   int c;
938
0
   int stereo;
939
0
   celt_norm *x = X;
940
0
   int encode;
941
0
   ec_ctx *ec;
942
943
0
   encode = ctx->encode;
944
0
   ec = ctx->ec;
945
946
0
   stereo = Y != NULL;
947
0
   c=0; do {
948
0
      int sign=0;
949
0
      if (ctx->remaining_bits>=1<<BITRES)
950
0
      {
951
0
         if (encode)
952
0
         {
953
0
            sign = x[0]<0;
954
0
            ec_enc_bits(ec, sign, 1);
955
0
         } else {
956
0
            sign = ec_dec_bits(ec, 1);
957
0
         }
958
0
         ctx->remaining_bits -= 1<<BITRES;
959
0
      }
960
0
      if (ctx->resynth)
961
0
         x[0] = sign ? -NORM_SCALING : NORM_SCALING;
962
0
      x = Y;
963
0
   } while (++c<1+stereo);
964
0
   if (lowband_out)
965
0
      lowband_out[0] = SHR32(X[0],4);
966
0
   return 1;
967
0
}
968
969
/* This function is responsible for encoding and decoding a mono partition.
970
   It can split the band in two and transmit the energy difference with
971
   the two half-bands. It can be called recursively so bands can end up being
972
   split in 8 parts. */
973
static unsigned quant_partition(struct band_ctx *ctx, celt_norm *X,
974
      int N, int b, int B, celt_norm *lowband,
975
      int LM,
976
      opus_val32 gain, int fill
977
      ARG_QEXT(int ext_b))
978
0
{
979
0
   const unsigned char *cache;
980
0
   int q;
981
0
   int curr_bits;
982
0
   int imid=0, iside=0;
983
0
   int B0=B;
984
0
   opus_val32 mid=0, side=0;
985
0
   unsigned cm=0;
986
0
   celt_norm *Y=NULL;
987
0
   int encode;
988
0
   const CELTMode *m;
989
0
   int i;
990
0
   int spread;
991
0
   ec_ctx *ec;
992
993
0
   encode = ctx->encode;
994
0
   m = ctx->m;
995
0
   i = ctx->i;
996
0
   spread = ctx->spread;
997
0
   ec = ctx->ec;
998
999
   /* If we need 1.5 more bit than we can produce, split the band in two. */
1000
0
   cache = m->cache.bits + m->cache.index[(LM+1)*m->nbEBands+i];
1001
0
   if (LM != -1 && b > cache[cache[0]]+12 && N>2)
1002
0
   {
1003
0
      int mbits, sbits, delta;
1004
0
      int itheta;
1005
0
      int qalloc;
1006
0
      struct split_ctx sctx;
1007
0
      celt_norm *next_lowband2=NULL;
1008
0
      opus_int32 rebalance;
1009
1010
0
      N >>= 1;
1011
0
      Y = X+N;
1012
0
      LM -= 1;
1013
0
      if (B==1)
1014
0
         fill = (fill&1)|(fill<<1);
1015
0
      B = (B+1)>>1;
1016
1017
0
      compute_theta(ctx, &sctx, X, Y, N, &b, B, B0, LM, 0, &fill ARG_QEXT(&ext_b));
1018
0
      imid = sctx.imid;
1019
0
      iside = sctx.iside;
1020
0
      delta = sctx.delta;
1021
0
      itheta = sctx.itheta;
1022
0
      qalloc = sctx.qalloc;
1023
0
#ifdef FIXED_POINT
1024
# ifdef ENABLE_QEXT
1025
      (void)imid;
1026
      (void)iside;
1027
      mid = celt_cos_norm32(sctx.itheta_q30);
1028
      side = celt_cos_norm32((1<<30)-sctx.itheta_q30);
1029
# else
1030
0
      mid = SHL32(EXTEND32(imid), 16);
1031
0
      side = SHL32(EXTEND32(iside), 16);
1032
0
# endif
1033
#else
1034
# ifdef ENABLE_QEXT
1035
      (void)imid;
1036
      (void)iside;
1037
      mid = celt_cos_norm2(sctx.itheta_q30*(1.f/(1<<30)));
1038
      side = celt_cos_norm2(1.f-sctx.itheta_q30*(1.f/(1<<30)));
1039
# else
1040
      mid = (1.f/32768)*imid;
1041
      side = (1.f/32768)*iside;
1042
# endif
1043
#endif
1044
1045
      /* Give more bits to low-energy MDCTs than they would otherwise deserve */
1046
0
      if (B0>1 && (itheta&0x3fff))
1047
0
      {
1048
0
         if (itheta > 8192)
1049
            /* Rough approximation for pre-echo masking */
1050
0
            delta -= delta>>(4-LM);
1051
0
         else
1052
            /* Corresponds to a forward-masking slope of 1.5 dB per 10 ms */
1053
0
            delta = IMIN(0, delta + (N<<BITRES>>(5-LM)));
1054
0
      }
1055
0
      mbits = IMAX(0, IMIN(b, (b-delta)/2));
1056
0
      sbits = b-mbits;
1057
0
      ctx->remaining_bits -= qalloc;
1058
1059
0
      if (lowband)
1060
0
         next_lowband2 = lowband+N; /* >32-bit split case */
1061
1062
0
      rebalance = ctx->remaining_bits;
1063
0
      if (mbits >= sbits)
1064
0
      {
1065
0
         cm = quant_partition(ctx, X, N, mbits, B, lowband, LM,
1066
0
               MULT32_32_Q31(gain,mid), fill ARG_QEXT(ext_b/2));
1067
0
         rebalance = mbits - (rebalance-ctx->remaining_bits);
1068
0
         if (rebalance > 3<<BITRES && itheta!=0)
1069
0
            sbits += rebalance - (3<<BITRES);
1070
0
         cm |= quant_partition(ctx, Y, N, sbits, B, next_lowband2, LM,
1071
0
               MULT32_32_Q31(gain,side), fill>>B ARG_QEXT(ext_b/2))<<(B0>>1);
1072
0
      } else {
1073
0
         cm = quant_partition(ctx, Y, N, sbits, B, next_lowband2, LM,
1074
0
               MULT32_32_Q31(gain,side), fill>>B ARG_QEXT(ext_b/2))<<(B0>>1);
1075
0
         rebalance = sbits - (rebalance-ctx->remaining_bits);
1076
0
         if (rebalance > 3<<BITRES && itheta!=16384)
1077
0
            mbits += rebalance - (3<<BITRES);
1078
0
         cm |= quant_partition(ctx, X, N, mbits, B, lowband, LM,
1079
0
               MULT32_32_Q31(gain,mid), fill ARG_QEXT(ext_b/2));
1080
0
      }
1081
0
   } else {
1082
#ifdef ENABLE_QEXT
1083
      int extra_bits;
1084
      int ext_remaining_bits;
1085
      extra_bits = ext_b/(N-1)>>BITRES;
1086
      ext_remaining_bits = ctx->ext_total_bits-(opus_int32)ec_tell_frac(ctx->ext_ec);
1087
      if (ext_remaining_bits < ((extra_bits+1)*(N-1)+N)<<BITRES) {
1088
         extra_bits = (ext_remaining_bits-(N<<BITRES))/(N-1)>>BITRES;
1089
         extra_bits = IMAX(extra_bits-1, 0);
1090
      }
1091
      extra_bits = IMIN(12, extra_bits);
1092
#endif
1093
      /* This is the basic no-split case */
1094
0
      q = bits2pulses(m, i, LM, b);
1095
0
      curr_bits = pulses2bits(m, i, LM, q);
1096
0
      ctx->remaining_bits -= curr_bits;
1097
1098
      /* Ensures we can never bust the budget */
1099
0
      while (ctx->remaining_bits < 0 && q > 0)
1100
0
      {
1101
0
         ctx->remaining_bits += curr_bits;
1102
0
         q--;
1103
0
         curr_bits = pulses2bits(m, i, LM, q);
1104
0
         ctx->remaining_bits -= curr_bits;
1105
0
      }
1106
1107
0
      if (q!=0)
1108
0
      {
1109
0
         int K = get_pulses(q);
1110
1111
         /* Finally do the actual quantization */
1112
0
         if (encode)
1113
0
         {
1114
0
            cm = alg_quant(X, N, K, spread, B, ec, gain, ctx->resynth
1115
0
                           ARG_QEXT(ctx->ext_ec) ARG_QEXT(extra_bits),
1116
0
                           ctx->arch);
1117
0
         } else {
1118
0
            cm = alg_unquant(X, N, K, spread, B, ec, gain
1119
0
                             ARG_QEXT(ctx->ext_ec) ARG_QEXT(extra_bits));
1120
0
         }
1121
#ifdef ENABLE_QEXT
1122
      } else if (ext_b > 2*N<<BITRES)
1123
      {
1124
         extra_bits = ext_b/(N-1)>>BITRES;
1125
         ext_remaining_bits = ctx->ext_total_bits-ec_tell_frac(ctx->ext_ec);
1126
         if (ext_remaining_bits < ((extra_bits+1)*(N-1)+N)<<BITRES) {
1127
            extra_bits = (ext_remaining_bits-(N<<BITRES))/(N-1)>>BITRES;
1128
            extra_bits = IMAX(extra_bits-1, 0);
1129
         }
1130
         extra_bits = IMIN(14, extra_bits);
1131
         if (encode) cm = cubic_quant(X, N, extra_bits, B, ctx->ext_ec, gain, ctx->resynth);
1132
         else cm = cubic_unquant(X, N, extra_bits, B, ctx->ext_ec, gain);
1133
#endif
1134
0
      } else {
1135
         /* If there's no pulse, fill the band anyway */
1136
0
         int j;
1137
0
         if (ctx->resynth)
1138
0
         {
1139
0
            unsigned cm_mask;
1140
            /* B can be as large as 16, so this shift might overflow an int on a
1141
               16-bit platform; use a long to get defined behavior.*/
1142
0
            cm_mask = (unsigned)(1UL<<B)-1;
1143
0
            fill &= cm_mask;
1144
0
            if (!fill)
1145
0
            {
1146
0
               OPUS_CLEAR(X, N);
1147
0
            } else {
1148
0
               if (lowband == NULL)
1149
0
               {
1150
                  /* Noise */
1151
0
                  for (j=0;j<N;j++)
1152
0
                  {
1153
0
                     ctx->seed = celt_lcg_rand(ctx->seed);
1154
0
                     X[j] = SHL32((celt_norm)((opus_int32)ctx->seed>>20), NORM_SHIFT-14);
1155
0
                  }
1156
0
                  cm = cm_mask;
1157
0
               } else {
1158
                  /* Folded spectrum */
1159
0
                  for (j=0;j<N;j++)
1160
0
                  {
1161
0
                     opus_val16 tmp;
1162
0
                     ctx->seed = celt_lcg_rand(ctx->seed);
1163
                     /* About 48 dB below the "normal" folding level */
1164
0
                     tmp = QCONST16(1.0f/256, NORM_SHIFT-4);
1165
0
                     tmp = (ctx->seed)&0x8000 ? tmp : -tmp;
1166
0
                     X[j] = lowband[j]+tmp;
1167
0
                  }
1168
0
                  cm = fill;
1169
0
               }
1170
0
               renormalise_vector(X, N, gain, ctx->arch);
1171
0
            }
1172
0
         }
1173
0
      }
1174
0
   }
1175
1176
0
   return cm;
1177
0
}
1178
1179
#ifdef ENABLE_QEXT
1180
static unsigned cubic_quant_partition(struct band_ctx *ctx, celt_norm *X, int N, int b, int B, ec_ctx *ec, int LM, opus_val32 gain, int resynth, int encode)
1181
{
1182
   celt_assert(LM>=0);
1183
   ctx->remaining_bits = ctx->ec->storage*8*8 - ec_tell_frac(ctx->ec);
1184
   b = IMIN(b, ctx->remaining_bits);
1185
   /* As long as we have at least two bits of depth, split all the way to LM=0 (not -1 like PVQ). */
1186
   if (LM==0 || b<=2*N<<BITRES) {
1187
      int res, ret;
1188
      b = IMIN(b + ((N-1)<<BITRES)/2, ctx->remaining_bits);
1189
      /* Resolution left after taking into account coding the cube face. */
1190
      res = (b-(1<<BITRES)-ctx->m->logN[ctx->i]-(LM<<BITRES)-1)/(N-1)>>BITRES;
1191
      res = IMIN(14, IMAX(0, res));
1192
      if (encode) ret = cubic_quant(X, N, res, B, ec, gain, resynth);
1193
      else ret = cubic_unquant(X, N, res, B, ec, gain);
1194
      ctx->remaining_bits = ctx->ec->storage*8*8 - ec_tell_frac(ctx->ec);
1195
      return ret;
1196
   } else {
1197
      celt_norm *Y;
1198
      opus_int32 itheta_q30;
1199
      opus_val32 g1, g2;
1200
      opus_int32 theta_res;
1201
      opus_int32 qtheta;
1202
      int delta;
1203
      int b1, b2;
1204
      int cm;
1205
      int N0;
1206
      N0 = N;
1207
      N >>= 1;
1208
      Y = X+N;
1209
      LM -= 1;
1210
      B = (B+1)>>1;
1211
      theta_res = IMIN(16, (b>>BITRES)/(N0-1) + 1);
1212
      if (encode) {
1213
         itheta_q30 = stereo_itheta(X, Y, 0, N, ctx->arch);
1214
         qtheta = (itheta_q30+(1<<(29-theta_res)))>>(30-theta_res);
1215
         ec_enc_uint(ec, qtheta, (1<<theta_res)+1);
1216
      } else {
1217
         qtheta = ec_dec_uint(ec, (1<<theta_res)+1);
1218
      }
1219
      itheta_q30 = qtheta<<(30-theta_res);
1220
      b -= theta_res<<BITRES;
1221
      delta = (N0-1) * 23 * ((itheta_q30>>16)-8192) >> (17-BITRES);
1222
1223
#ifdef FIXED_POINT
1224
      g1 = celt_cos_norm32(itheta_q30);
1225
      g2 = celt_cos_norm32((1<<30)-itheta_q30);
1226
#else
1227
      g1 = celt_cos_norm2(itheta_q30*(1.f/(1<<30)));
1228
      g2 = celt_cos_norm2(1.f-itheta_q30*(1.f/(1<<30)));
1229
#endif
1230
      if (itheta_q30 == 0) {
1231
         b1=b;
1232
         b2=0;
1233
      } else if (itheta_q30==1073741824) {
1234
         b1=0;
1235
         b2=b;
1236
      } else {
1237
         b1 = IMIN(b, IMAX(0, (b-delta)/2));
1238
         b2 = b-b1;
1239
      }
1240
      cm  = cubic_quant_partition(ctx, X, N, b1, B, ec, LM, MULT32_32_Q31(gain, g1), resynth, encode);
1241
      cm |= cubic_quant_partition(ctx, Y, N, b2, B, ec, LM, MULT32_32_Q31(gain, g2), resynth, encode);
1242
      return cm;
1243
   }
1244
}
1245
#endif
1246
1247
/* This function is responsible for encoding and decoding a band for the mono case. */
1248
static unsigned quant_band(struct band_ctx *ctx, celt_norm *X,
1249
      int N, int b, int B, celt_norm *lowband,
1250
      int LM, celt_norm *lowband_out,
1251
      opus_val32 gain, celt_norm *lowband_scratch, int fill
1252
      ARG_QEXT(int ext_b))
1253
0
{
1254
0
   int N0=N;
1255
0
   int N_B=N;
1256
0
   int N_B0;
1257
0
   int B0=B;
1258
0
   int time_divide=0;
1259
0
   int recombine=0;
1260
0
   int longBlocks;
1261
0
   unsigned cm=0;
1262
0
   int k;
1263
0
   int encode;
1264
0
   int tf_change;
1265
1266
0
   encode = ctx->encode;
1267
0
   tf_change = ctx->tf_change;
1268
1269
0
   longBlocks = B0==1;
1270
1271
0
   N_B = celt_udiv(N_B, B);
1272
1273
   /* Special case for one sample */
1274
0
   if (N==1)
1275
0
   {
1276
0
      return quant_band_n1(ctx, X, NULL, lowband_out);
1277
0
   }
1278
1279
0
   if (tf_change>0)
1280
0
      recombine = tf_change;
1281
   /* Band recombining to increase frequency resolution */
1282
1283
0
   if (lowband_scratch && lowband && (recombine || ((N_B&1) == 0 && tf_change<0) || B0>1))
1284
0
   {
1285
0
      OPUS_COPY(lowband_scratch, lowband, N);
1286
0
      lowband = lowband_scratch;
1287
0
   }
1288
1289
0
   for (k=0;k<recombine;k++)
1290
0
   {
1291
0
      static const unsigned char bit_interleave_table[16]={
1292
0
            0,1,1,1,2,3,3,3,2,3,3,3,2,3,3,3
1293
0
      };
1294
0
      if (encode)
1295
0
         haar1(X, N>>k, 1<<k);
1296
0
      if (lowband)
1297
0
         haar1(lowband, N>>k, 1<<k);
1298
0
      fill = bit_interleave_table[fill&0xF]|bit_interleave_table[fill>>4]<<2;
1299
0
   }
1300
0
   B>>=recombine;
1301
0
   N_B<<=recombine;
1302
1303
   /* Increasing the time resolution */
1304
0
   while ((N_B&1) == 0 && tf_change<0)
1305
0
   {
1306
0
      if (encode)
1307
0
         haar1(X, N_B, B);
1308
0
      if (lowband)
1309
0
         haar1(lowband, N_B, B);
1310
0
      fill |= fill<<B;
1311
0
      B <<= 1;
1312
0
      N_B >>= 1;
1313
0
      time_divide++;
1314
0
      tf_change++;
1315
0
   }
1316
0
   B0=B;
1317
0
   N_B0 = N_B;
1318
1319
   /* Reorganize the samples in time order instead of frequency order */
1320
0
   if (B0>1)
1321
0
   {
1322
0
      if (encode)
1323
0
         deinterleave_hadamard(X, N_B>>recombine, B0<<recombine, longBlocks);
1324
0
      if (lowband)
1325
0
         deinterleave_hadamard(lowband, N_B>>recombine, B0<<recombine, longBlocks);
1326
0
   }
1327
1328
#ifdef ENABLE_QEXT
1329
   if (ctx->extra_bands && b > (3*N<<BITRES)+(ctx->m->logN[ctx->i]+8+8*LM)) {
1330
      cm = cubic_quant_partition(ctx, X, N, b, B, ctx->ec, LM, gain, ctx->resynth, encode);
1331
   } else
1332
#endif
1333
0
   {
1334
0
      cm = quant_partition(ctx, X, N, b, B, lowband, LM, gain, fill ARG_QEXT(ext_b));
1335
0
   }
1336
1337
   /* This code is used by the decoder and by the resynthesis-enabled encoder */
1338
0
   if (ctx->resynth)
1339
0
   {
1340
      /* Undo the sample reorganization going from time order to frequency order */
1341
0
      if (B0>1)
1342
0
         interleave_hadamard(X, N_B>>recombine, B0<<recombine, longBlocks);
1343
1344
      /* Undo time-freq changes that we did earlier */
1345
0
      N_B = N_B0;
1346
0
      B = B0;
1347
0
      for (k=0;k<time_divide;k++)
1348
0
      {
1349
0
         B >>= 1;
1350
0
         N_B <<= 1;
1351
0
         cm |= cm>>B;
1352
0
         haar1(X, N_B, B);
1353
0
      }
1354
1355
0
      for (k=0;k<recombine;k++)
1356
0
      {
1357
0
         static const unsigned char bit_deinterleave_table[16]={
1358
0
               0x00,0x03,0x0C,0x0F,0x30,0x33,0x3C,0x3F,
1359
0
               0xC0,0xC3,0xCC,0xCF,0xF0,0xF3,0xFC,0xFF
1360
0
         };
1361
0
         cm = bit_deinterleave_table[cm];
1362
0
         haar1(X, N0>>k, 1<<k);
1363
0
      }
1364
0
      B<<=recombine;
1365
1366
      /* Scale output for later folding */
1367
0
      if (lowband_out)
1368
0
      {
1369
0
         int j;
1370
0
         opus_val16 n;
1371
0
         n = celt_sqrt(SHL32(EXTEND32(N0),22));
1372
0
         for (j=0;j<N0;j++)
1373
0
            lowband_out[j] = MULT16_32_Q15(n,X[j]);
1374
0
      }
1375
0
      cm &= (1<<B)-1;
1376
0
   }
1377
0
   return cm;
1378
0
}
1379
1380
#ifdef FIXED_POINT
1381
0
#define MIN_STEREO_ENERGY 2
1382
#else
1383
#define MIN_STEREO_ENERGY 1e-10f
1384
#endif
1385
1386
/* This function is responsible for encoding and decoding a band for the stereo case. */
1387
static unsigned quant_band_stereo(struct band_ctx *ctx, celt_norm *X, celt_norm *Y,
1388
      int N, int b, int B, celt_norm *lowband,
1389
      int LM, celt_norm *lowband_out,
1390
      celt_norm *lowband_scratch, int fill
1391
      ARG_QEXT(int ext_b) ARG_QEXT(const int *cap))
1392
0
{
1393
0
   int imid=0, iside=0;
1394
0
   int inv = 0;
1395
0
   opus_val32 mid=0, side=0;
1396
0
   unsigned cm=0;
1397
0
   int mbits, sbits, delta;
1398
0
   int itheta;
1399
0
   int qalloc;
1400
0
   struct split_ctx sctx;
1401
0
   int orig_fill;
1402
0
   int encode;
1403
0
   ec_ctx *ec;
1404
1405
0
   encode = ctx->encode;
1406
0
   ec = ctx->ec;
1407
1408
   /* Special case for one sample */
1409
0
   if (N==1)
1410
0
   {
1411
0
      return quant_band_n1(ctx, X, Y, lowband_out);
1412
0
   }
1413
1414
0
   orig_fill = fill;
1415
1416
0
   if (encode) {
1417
0
      if (ctx->bandE[ctx->i] < MIN_STEREO_ENERGY || ctx->bandE[ctx->m->nbEBands+ctx->i] < MIN_STEREO_ENERGY) {
1418
0
         if (ctx->bandE[ctx->i] > ctx->bandE[ctx->m->nbEBands+ctx->i]) OPUS_COPY(Y, X, N);
1419
0
         else OPUS_COPY(X, Y, N);
1420
0
      }
1421
0
   }
1422
0
   compute_theta(ctx, &sctx, X, Y, N, &b, B, B, LM, 1, &fill ARG_QEXT(&ext_b));
1423
0
   inv = sctx.inv;
1424
0
   imid = sctx.imid;
1425
0
   iside = sctx.iside;
1426
0
   delta = sctx.delta;
1427
0
   itheta = sctx.itheta;
1428
0
   qalloc = sctx.qalloc;
1429
0
#ifdef FIXED_POINT
1430
# ifdef ENABLE_QEXT
1431
   (void)imid;
1432
   (void)iside;
1433
   mid = celt_cos_norm32(sctx.itheta_q30);
1434
   side = celt_cos_norm32((1<<30)-sctx.itheta_q30);
1435
# else
1436
0
   mid = SHL32(EXTEND32(imid), 16);
1437
0
   side = SHL32(EXTEND32(iside), 16);
1438
0
# endif
1439
#else
1440
# ifdef ENABLE_QEXT
1441
   (void)imid;
1442
   (void)iside;
1443
   mid = celt_cos_norm2(sctx.itheta_q30*(1.f/(1<<30)));
1444
   side = celt_cos_norm2(1.f-sctx.itheta_q30*(1.f/(1<<30)));
1445
# else
1446
   mid = (1.f/32768)*imid;
1447
   side = (1.f/32768)*iside;
1448
# endif
1449
#endif
1450
1451
   /* This is a special case for N=2 that only works for stereo and takes
1452
      advantage of the fact that mid and side are orthogonal to encode
1453
      the side with just one bit. */
1454
0
   if (N==2)
1455
0
   {
1456
0
      int c;
1457
0
      int sign=0;
1458
0
      celt_norm *x2, *y2;
1459
0
      mbits = b;
1460
0
      sbits = 0;
1461
      /* Only need one bit for the side. */
1462
0
      if (itheta != 0 && itheta != 16384)
1463
0
         sbits = 1<<BITRES;
1464
0
      mbits -= sbits;
1465
0
      c = itheta > 8192;
1466
0
      ctx->remaining_bits -= qalloc+sbits;
1467
1468
0
      x2 = c ? Y : X;
1469
0
      y2 = c ? X : Y;
1470
0
      if (sbits)
1471
0
      {
1472
0
         if (encode)
1473
0
         {
1474
            /* Here we only need to encode a sign for the side. */
1475
            /* FIXME: Need to increase fixed-point precision? */
1476
0
            sign = MULT32_32_Q31(x2[0],y2[1]) - MULT32_32_Q31(x2[1],y2[0]) < 0;
1477
0
            ec_enc_bits(ec, sign, 1);
1478
0
         } else {
1479
0
            sign = ec_dec_bits(ec, 1);
1480
0
         }
1481
0
      }
1482
0
      sign = 1-2*sign;
1483
      /* We use orig_fill here because we want to fold the side, but if
1484
         itheta==16384, we'll have cleared the low bits of fill. */
1485
0
      cm = quant_band(ctx, x2, N, mbits, B, lowband, LM, lowband_out, Q31ONE,
1486
0
            lowband_scratch, orig_fill ARG_QEXT(ext_b));
1487
      /* We don't split N=2 bands, so cm is either 1 or 0 (for a fold-collapse),
1488
         and there's no need to worry about mixing with the other channel. */
1489
0
      y2[0] = -sign*x2[1];
1490
0
      y2[1] = sign*x2[0];
1491
0
      if (ctx->resynth)
1492
0
      {
1493
0
         celt_norm tmp;
1494
0
         X[0] = MULT32_32_Q31(mid, X[0]);
1495
0
         X[1] = MULT32_32_Q31(mid, X[1]);
1496
0
         Y[0] = MULT32_32_Q31(side, Y[0]);
1497
0
         Y[1] = MULT32_32_Q31(side, Y[1]);
1498
0
         tmp = X[0];
1499
0
         X[0] = SUB32(tmp,Y[0]);
1500
0
         Y[0] = ADD32(tmp,Y[0]);
1501
0
         tmp = X[1];
1502
0
         X[1] = SUB32(tmp,Y[1]);
1503
0
         Y[1] = ADD32(tmp,Y[1]);
1504
0
      }
1505
0
   } else {
1506
      /* "Normal" split code */
1507
0
      opus_int32 rebalance;
1508
1509
0
      mbits = IMAX(0, IMIN(b, (b-delta)/2));
1510
0
      sbits = b-mbits;
1511
0
      ctx->remaining_bits -= qalloc;
1512
1513
0
      rebalance = ctx->remaining_bits;
1514
0
      if (mbits >= sbits)
1515
0
      {
1516
#ifdef ENABLE_QEXT
1517
         int qext_extra = 0;
1518
         /* Reallocate any mid bits that cannot be used to extra mid bits. */
1519
         if (cap != NULL && ext_b != 0) qext_extra = IMAX(0, IMIN(ext_b/2, mbits - cap[ctx->i]/2));
1520
#endif
1521
         /* In stereo mode, we do not apply a scaling to the mid because we need the normalized
1522
            mid for folding later. */
1523
0
         cm = quant_band(ctx, X, N, mbits, B, lowband, LM, lowband_out, Q31ONE,
1524
0
               lowband_scratch, fill ARG_QEXT(ext_b/2+qext_extra));
1525
0
         rebalance = mbits - (rebalance-ctx->remaining_bits);
1526
0
         if (rebalance > 3<<BITRES && itheta!=0)
1527
0
            sbits += rebalance - (3<<BITRES);
1528
#ifdef ENABLE_QEXT
1529
         /* Guard against overflowing the EC with the angle if the cubic quant used too many bits for the mid. */
1530
         if (ctx->extra_bands) sbits = IMIN(sbits, ctx->remaining_bits);
1531
#endif
1532
         /* For a stereo split, the high bits of fill are always zero, so no
1533
            folding will be done to the side. */
1534
0
         cm |= quant_band(ctx, Y, N, sbits, B, NULL, LM, NULL, side, NULL, fill>>B ARG_QEXT(ext_b/2-qext_extra));
1535
0
      } else {
1536
#ifdef ENABLE_QEXT
1537
         int qext_extra = 0;
1538
         /* Reallocate any side bits that cannot be used to extra side bits. */
1539
         if (cap != NULL && ext_b != 0) qext_extra = IMAX(0, IMIN(ext_b/2, sbits - cap[ctx->i]/2));
1540
#endif
1541
         /* For a stereo split, the high bits of fill are always zero, so no
1542
            folding will be done to the side. */
1543
0
         cm = quant_band(ctx, Y, N, sbits, B, NULL, LM, NULL, side, NULL, fill>>B ARG_QEXT(ext_b/2+qext_extra));
1544
0
         rebalance = sbits - (rebalance-ctx->remaining_bits);
1545
0
         if (rebalance > 3<<BITRES && itheta!=16384)
1546
0
            mbits += rebalance - (3<<BITRES);
1547
#ifdef ENABLE_QEXT
1548
         /* Guard against overflowing the EC with the angle if the cubic quant used too many bits for the side. */
1549
         if (ctx->extra_bands) mbits = IMIN(mbits, ctx->remaining_bits);
1550
#endif
1551
         /* In stereo mode, we do not apply a scaling to the mid because we need the normalized
1552
            mid for folding later. */
1553
0
         cm |= quant_band(ctx, X, N, mbits, B, lowband, LM, lowband_out, Q31ONE,
1554
0
               lowband_scratch, fill ARG_QEXT(ext_b/2-qext_extra));
1555
0
      }
1556
0
   }
1557
1558
1559
   /* This code is used by the decoder and by the resynthesis-enabled encoder */
1560
0
   if (ctx->resynth)
1561
0
   {
1562
0
      if (N!=2)
1563
0
         stereo_merge(X, Y, mid, N, ctx->arch);
1564
0
      if (inv)
1565
0
      {
1566
0
         int j;
1567
0
         for (j=0;j<N;j++)
1568
0
            Y[j] = -Y[j];
1569
0
      }
1570
0
   }
1571
0
   return cm;
1572
0
}
1573
1574
#ifndef DISABLE_UPDATE_DRAFT
1575
static void special_hybrid_folding(const CELTMode *m, celt_norm *norm, celt_norm *norm2, int start, int M, int dual_stereo)
1576
0
{
1577
0
   int n1, n2;
1578
0
   const opus_int16 * OPUS_RESTRICT eBands = m->eBands;
1579
0
   n1 = M*(eBands[start+1]-eBands[start]);
1580
0
   n2 = M*(eBands[start+2]-eBands[start+1]);
1581
   /* Duplicate enough of the first band folding data to be able to fold the second band.
1582
      Copies no data for CELT-only mode. */
1583
0
   OPUS_COPY(&norm[n1], &norm[2*n1 - n2], n2-n1);
1584
0
   if (dual_stereo)
1585
0
      OPUS_COPY(&norm2[n1], &norm2[2*n1 - n2], n2-n1);
1586
0
}
1587
#endif
1588
1589
void quant_all_bands(int encode, const CELTMode *m, int start, int end,
1590
      celt_norm *X_, celt_norm *Y_, unsigned char *collapse_masks,
1591
      const celt_ener *bandE, int *pulses, int shortBlocks, int spread,
1592
      int dual_stereo, int intensity, int *tf_res, opus_int32 total_bits,
1593
      opus_int32 balance, ec_ctx *ec, int LM, int codedBands,
1594
      opus_uint32 *seed, int complexity, int arch, int disable_inv
1595
      ARG_QEXT(ec_ctx *ext_ec) ARG_QEXT(int *extra_pulses)
1596
      ARG_QEXT(opus_int32 ext_total_bits) ARG_QEXT(const int *cap))
1597
0
{
1598
0
   int i;
1599
0
   opus_int32 remaining_bits;
1600
0
   const opus_int16 * OPUS_RESTRICT eBands = m->eBands;
1601
0
   celt_norm * OPUS_RESTRICT norm, * OPUS_RESTRICT norm2;
1602
0
   VARDECL(celt_norm, _norm);
1603
0
   VARDECL(celt_norm, _lowband_scratch);
1604
0
   VARDECL(celt_norm, X_save);
1605
0
   VARDECL(celt_norm, Y_save);
1606
0
   VARDECL(celt_norm, X_save2);
1607
0
   VARDECL(celt_norm, Y_save2);
1608
0
   VARDECL(celt_norm, norm_save2);
1609
0
   int resynth_alloc;
1610
0
   celt_norm *lowband_scratch;
1611
0
   int B;
1612
0
   int M;
1613
0
   int lowband_offset;
1614
0
   int update_lowband = 1;
1615
0
   int C = Y_ != NULL ? 2 : 1;
1616
0
   int norm_offset;
1617
0
   int theta_rdo = encode && Y_!=NULL && !dual_stereo && complexity>=8;
1618
#ifdef RESYNTH
1619
   int resynth = 1;
1620
#else
1621
0
   int resynth = !encode || theta_rdo;
1622
0
#endif
1623
0
   struct band_ctx ctx;
1624
#ifdef ENABLE_QEXT
1625
   int ext_b;
1626
   opus_int32 ext_balance=0;
1627
   opus_int32 ext_tell=0;
1628
#endif
1629
0
   SAVE_STACK;
1630
1631
0
   M = 1<<LM;
1632
0
   B = shortBlocks ? M : 1;
1633
0
   norm_offset = M*eBands[start];
1634
   /* No need to allocate norm for the last band because we don't need an
1635
      output in that band. */
1636
0
   ALLOC(_norm, C*(M*eBands[m->nbEBands-1]-norm_offset), celt_norm);
1637
0
   norm = _norm;
1638
0
   norm2 = norm + M*eBands[m->nbEBands-1]-norm_offset;
1639
1640
   /* For decoding, we can use the last band as scratch space because we don't need that
1641
      scratch space for the last band and we don't care about the data there until we're
1642
      decoding the last band. */
1643
0
   if (encode && resynth)
1644
0
      resynth_alloc = M*(eBands[m->nbEBands]-eBands[m->nbEBands-1]);
1645
0
   else
1646
0
      resynth_alloc = ALLOC_NONE;
1647
0
   ALLOC(_lowband_scratch, resynth_alloc, celt_norm);
1648
0
   if (encode && resynth)
1649
0
      lowband_scratch = _lowband_scratch;
1650
0
   else
1651
0
      lowband_scratch = X_+M*eBands[m->effEBands-1];
1652
0
   ALLOC(X_save, resynth_alloc, celt_norm);
1653
0
   ALLOC(Y_save, resynth_alloc, celt_norm);
1654
0
   ALLOC(X_save2, resynth_alloc, celt_norm);
1655
0
   ALLOC(Y_save2, resynth_alloc, celt_norm);
1656
0
   ALLOC(norm_save2, resynth_alloc, celt_norm);
1657
1658
0
   lowband_offset = 0;
1659
0
   ctx.bandE = bandE;
1660
0
   ctx.ec = ec;
1661
0
   ctx.encode = encode;
1662
0
   ctx.intensity = intensity;
1663
0
   ctx.m = m;
1664
0
   ctx.seed = *seed;
1665
0
   ctx.spread = spread;
1666
0
   ctx.arch = arch;
1667
0
   ctx.disable_inv = disable_inv;
1668
0
   ctx.resynth = resynth;
1669
0
   ctx.theta_round = 0;
1670
#ifdef ENABLE_QEXT
1671
   ctx.ext_ec = ext_ec;
1672
   ctx.ext_total_bits = ext_total_bits;
1673
   ctx.extra_bands = end == NB_QEXT_BANDS || end == 2;
1674
   if (ctx.extra_bands) theta_rdo = 0;
1675
#endif
1676
   /* Avoid injecting noise in the first band on transients. */
1677
0
   ctx.avoid_split_noise = B > 1;
1678
0
   for (i=start;i<end;i++)
1679
0
   {
1680
0
      opus_int32 tell;
1681
0
      int b;
1682
0
      int N;
1683
0
      opus_int32 curr_balance;
1684
0
      int effective_lowband=-1;
1685
0
      celt_norm * OPUS_RESTRICT X, * OPUS_RESTRICT Y;
1686
0
      int tf_change=0;
1687
0
      unsigned x_cm;
1688
0
      unsigned y_cm;
1689
0
      int last;
1690
1691
0
      ctx.i = i;
1692
0
      last = (i==end-1);
1693
1694
0
      X = X_+M*eBands[i];
1695
0
      if (Y_!=NULL)
1696
0
         Y = Y_+M*eBands[i];
1697
0
      else
1698
0
         Y = NULL;
1699
0
      N = M*eBands[i+1]-M*eBands[i];
1700
0
      celt_assert(N > 0);
1701
0
      tell = ec_tell_frac(ec);
1702
1703
      /* Compute how many bits we want to allocate to this band */
1704
0
      if (i != start)
1705
0
         balance -= tell;
1706
0
      remaining_bits = total_bits-tell-1;
1707
0
      ctx.remaining_bits = remaining_bits;
1708
#ifdef ENABLE_QEXT
1709
      if (i != start) {
1710
         ext_balance += extra_pulses[i-1] + ext_tell;
1711
      }
1712
      ext_tell = ec_tell_frac(ext_ec);
1713
      ctx.extra_bits = extra_pulses[i];
1714
      if (i != start)
1715
         ext_balance -= ext_tell;
1716
      if (i <= codedBands-1)
1717
      {
1718
         opus_int32 ext_curr_balance = celt_sudiv(ext_balance, IMIN(3, codedBands-i));
1719
         ext_b = IMAX(0, IMIN(16383, IMIN(ext_total_bits-ext_tell,extra_pulses[i]+ext_curr_balance)));
1720
      } else {
1721
         ext_b = 0;
1722
      }
1723
#endif
1724
0
      if (i <= codedBands-1)
1725
0
      {
1726
0
         curr_balance = celt_sudiv(balance, IMIN(3, codedBands-i));
1727
0
         b = IMAX(0, IMIN(16383, IMIN(remaining_bits+1,pulses[i]+curr_balance)));
1728
0
      } else {
1729
0
         b = 0;
1730
0
      }
1731
1732
0
#ifndef DISABLE_UPDATE_DRAFT
1733
0
      if (resynth && (M*eBands[i]-N >= M*eBands[start] || i==start+1) && (update_lowband || lowband_offset==0))
1734
0
            lowband_offset = i;
1735
0
      if (i == start+1)
1736
0
         special_hybrid_folding(m, norm, norm2, start, M, dual_stereo);
1737
#else
1738
      if (resynth && M*eBands[i]-N >= M*eBands[start] && (update_lowband || lowband_offset==0))
1739
            lowband_offset = i;
1740
#endif
1741
1742
0
      tf_change = tf_res[i];
1743
0
      ctx.tf_change = tf_change;
1744
0
      if (i>=m->effEBands)
1745
0
      {
1746
0
         X=norm;
1747
0
         if (Y_!=NULL)
1748
0
            Y = norm;
1749
0
         lowband_scratch = NULL;
1750
0
      }
1751
0
      if (last && !theta_rdo)
1752
0
         lowband_scratch = NULL;
1753
1754
      /* Get a conservative estimate of the collapse_mask's for the bands we're
1755
         going to be folding from. */
1756
0
      if (lowband_offset != 0 && (spread!=SPREAD_AGGRESSIVE || B>1 || tf_change<0))
1757
0
      {
1758
0
         int fold_start;
1759
0
         int fold_end;
1760
0
         int fold_i;
1761
         /* This ensures we never repeat spectral content within one band */
1762
0
         effective_lowband = IMAX(0, M*eBands[lowband_offset]-norm_offset-N);
1763
0
         fold_start = lowband_offset;
1764
0
         while(M*eBands[--fold_start] > effective_lowband+norm_offset);
1765
0
         fold_end = lowband_offset-1;
1766
0
#ifndef DISABLE_UPDATE_DRAFT
1767
0
         while(++fold_end < i && M*eBands[fold_end] < effective_lowband+norm_offset+N);
1768
#else
1769
         while(M*eBands[++fold_end] < effective_lowband+norm_offset+N);
1770
#endif
1771
0
         x_cm = y_cm = 0;
1772
0
         fold_i = fold_start; do {
1773
0
           x_cm |= collapse_masks[fold_i*C+0];
1774
0
           y_cm |= collapse_masks[fold_i*C+C-1];
1775
0
         } while (++fold_i<fold_end);
1776
0
      }
1777
      /* Otherwise, we'll be using the LCG to fold, so all blocks will (almost
1778
         always) be non-zero. */
1779
0
      else
1780
0
         x_cm = y_cm = (1<<B)-1;
1781
1782
0
      if (dual_stereo && i==intensity)
1783
0
      {
1784
0
         int j;
1785
1786
         /* Switch off dual stereo to do intensity. */
1787
0
         dual_stereo = 0;
1788
0
         if (resynth)
1789
0
            for (j=0;j<M*eBands[i]-norm_offset;j++)
1790
0
               norm[j] = HALF32(norm[j]+norm2[j]);
1791
0
      }
1792
0
      if (dual_stereo)
1793
0
      {
1794
0
         x_cm = quant_band(&ctx, X, N, b/2, B,
1795
0
               effective_lowband != -1 ? norm+effective_lowband : NULL, LM,
1796
0
               last?NULL:norm+M*eBands[i]-norm_offset, Q31ONE, lowband_scratch, x_cm ARG_QEXT(ext_b/2));
1797
0
         y_cm = quant_band(&ctx, Y, N, b/2, B,
1798
0
               effective_lowband != -1 ? norm2+effective_lowband : NULL, LM,
1799
0
               last?NULL:norm2+M*eBands[i]-norm_offset, Q31ONE, lowband_scratch, y_cm ARG_QEXT(ext_b/2));
1800
0
      } else {
1801
0
         if (Y!=NULL)
1802
0
         {
1803
0
            if (theta_rdo && i < intensity)
1804
0
            {
1805
0
               ec_ctx ec_save, ec_save2;
1806
0
               struct band_ctx ctx_save, ctx_save2;
1807
0
               opus_val32 dist0, dist1;
1808
0
               unsigned cm, cm2;
1809
0
               int nstart_bytes, nend_bytes, save_bytes;
1810
0
               unsigned char *bytes_buf;
1811
0
               unsigned char bytes_save[1275];
1812
#ifdef ENABLE_QEXT
1813
               ec_ctx ext_ec_save, ext_ec_save2;
1814
               unsigned char *ext_bytes_buf;
1815
               int ext_nstart_bytes, ext_nend_bytes, ext_save_bytes;
1816
               unsigned char ext_bytes_save[QEXT_PACKET_SIZE_CAP];
1817
#endif
1818
0
               opus_val16 w[2];
1819
0
               compute_channel_weights(bandE[i], bandE[i+m->nbEBands], w);
1820
               /* Make a copy. */
1821
0
               cm = x_cm|y_cm;
1822
0
               ec_save = *ec;
1823
#ifdef ENABLE_QEXT
1824
               ext_ec_save = *ext_ec;
1825
#endif
1826
0
               ctx_save = ctx;
1827
0
               OPUS_COPY(X_save, X, N);
1828
0
               OPUS_COPY(Y_save, Y, N);
1829
               /* Encode and round down. */
1830
0
               ctx.theta_round = -1;
1831
0
               x_cm = quant_band_stereo(&ctx, X, Y, N, b, B,
1832
0
                     effective_lowband != -1 ? norm+effective_lowband : NULL, LM,
1833
0
                     last?NULL:norm+M*eBands[i]-norm_offset, lowband_scratch, cm ARG_QEXT(ext_b) ARG_QEXT(cap));
1834
0
               dist0 = MULT16_32_Q15(w[0], celt_inner_prod_norm_shift(X_save, X, N, arch)) + MULT16_32_Q15(w[1], celt_inner_prod_norm_shift(Y_save, Y, N, arch));
1835
1836
               /* Save first result. */
1837
0
               cm2 = x_cm;
1838
0
               ec_save2 = *ec;
1839
#ifdef ENABLE_QEXT
1840
               ext_ec_save2 = *ext_ec;
1841
#endif
1842
0
               ctx_save2 = ctx;
1843
0
               OPUS_COPY(X_save2, X, N);
1844
0
               OPUS_COPY(Y_save2, Y, N);
1845
0
               if (!last)
1846
0
                  OPUS_COPY(norm_save2, norm+M*eBands[i]-norm_offset, N);
1847
0
               nstart_bytes = ec_save.offs;
1848
0
               nend_bytes = ec_save.storage;
1849
0
               bytes_buf = ec_save.buf+nstart_bytes;
1850
0
               save_bytes = nend_bytes-nstart_bytes;
1851
0
               OPUS_COPY(bytes_save, bytes_buf, save_bytes);
1852
#ifdef ENABLE_QEXT
1853
               ext_nstart_bytes = ext_ec_save.offs;
1854
               ext_nend_bytes = ext_ec_save.storage;
1855
               ext_bytes_buf = ext_ec_save.buf!=NULL ? ext_ec_save.buf+ext_nstart_bytes : NULL;
1856
               ext_save_bytes = ext_nend_bytes-ext_nstart_bytes;
1857
               if (ext_save_bytes) OPUS_COPY(ext_bytes_save, ext_bytes_buf, ext_save_bytes);
1858
#endif
1859
               /* Restore */
1860
0
               *ec = ec_save;
1861
#ifdef ENABLE_QEXT
1862
               *ext_ec = ext_ec_save;
1863
#endif
1864
0
               ctx = ctx_save;
1865
0
               OPUS_COPY(X, X_save, N);
1866
0
               OPUS_COPY(Y, Y_save, N);
1867
0
#ifndef DISABLE_UPDATE_DRAFT
1868
0
               if (i == start+1)
1869
0
                  special_hybrid_folding(m, norm, norm2, start, M, dual_stereo);
1870
0
#endif
1871
               /* Encode and round up. */
1872
0
               ctx.theta_round = 1;
1873
0
               x_cm = quant_band_stereo(&ctx, X, Y, N, b, B,
1874
0
                     effective_lowband != -1 ? norm+effective_lowband : NULL, LM,
1875
0
                     last?NULL:norm+M*eBands[i]-norm_offset, lowband_scratch, cm ARG_QEXT(ext_b) ARG_QEXT(cap));
1876
0
               dist1 = MULT16_32_Q15(w[0], celt_inner_prod_norm_shift(X_save, X, N, arch)) + MULT16_32_Q15(w[1], celt_inner_prod_norm_shift(Y_save, Y, N, arch));
1877
0
               if (dist0 >= dist1) {
1878
0
                  x_cm = cm2;
1879
0
                  *ec = ec_save2;
1880
#ifdef ENABLE_QEXT
1881
                  *ext_ec = ext_ec_save2;
1882
#endif
1883
0
                  ctx = ctx_save2;
1884
0
                  OPUS_COPY(X, X_save2, N);
1885
0
                  OPUS_COPY(Y, Y_save2, N);
1886
0
                  if (!last)
1887
0
                     OPUS_COPY(norm+M*eBands[i]-norm_offset, norm_save2, N);
1888
0
                  OPUS_COPY(bytes_buf, bytes_save, save_bytes);
1889
#ifdef ENABLE_QEXT
1890
                  if (ext_save_bytes) OPUS_COPY(ext_bytes_buf, ext_bytes_save, ext_save_bytes);
1891
#endif
1892
0
               }
1893
0
            } else {
1894
0
               ctx.theta_round = 0;
1895
0
               x_cm = quant_band_stereo(&ctx, X, Y, N, b, B,
1896
0
                     effective_lowband != -1 ? norm+effective_lowband : NULL, LM,
1897
0
                     last?NULL:norm+M*eBands[i]-norm_offset, lowband_scratch, x_cm|y_cm ARG_QEXT(ext_b) ARG_QEXT(cap));
1898
0
            }
1899
0
         } else {
1900
0
            x_cm = quant_band(&ctx, X, N, b, B,
1901
0
                  effective_lowband != -1 ? norm+effective_lowband : NULL, LM,
1902
0
                  last?NULL:norm+M*eBands[i]-norm_offset, Q31ONE, lowband_scratch, x_cm|y_cm ARG_QEXT(ext_b));
1903
0
         }
1904
0
         y_cm = x_cm;
1905
0
      }
1906
0
      collapse_masks[i*C+0] = (unsigned char)x_cm;
1907
0
      collapse_masks[i*C+C-1] = (unsigned char)y_cm;
1908
0
      balance += pulses[i] + tell;
1909
1910
      /* Update the folding position only as long as we have 1 bit/sample depth. */
1911
0
      update_lowband = b>(N<<BITRES);
1912
      /* We only need to avoid noise on a split for the first band. After that, we
1913
         have folding. */
1914
0
      ctx.avoid_split_noise = 0;
1915
0
   }
1916
0
   *seed = ctx.seed;
1917
1918
0
   RESTORE_STACK;
1919
0
}