Coverage Report

Created: 2025-07-01 07:04

/src/opus/celt/rate.c
Line
Count
Source (jump to first uncovered line)
1
/* Copyright (c) 2007-2008 CSIRO
2
   Copyright (c) 2007-2009 Xiph.Org Foundation
3
   Written by Jean-Marc Valin */
4
/*
5
   Redistribution and use in source and binary forms, with or without
6
   modification, are permitted provided that the following conditions
7
   are met:
8
9
   - Redistributions of source code must retain the above copyright
10
   notice, this list of conditions and the following disclaimer.
11
12
   - Redistributions in binary form must reproduce the above copyright
13
   notice, this list of conditions and the following disclaimer in the
14
   documentation and/or other materials provided with the distribution.
15
16
   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17
   ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18
   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19
   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
20
   OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
21
   EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
22
   PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
23
   PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
24
   LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
25
   NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
26
   SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27
*/
28
29
#ifdef HAVE_CONFIG_H
30
#include "config.h"
31
#endif
32
33
#include <math.h>
34
#include "modes.h"
35
#include "cwrs.h"
36
#include "arch.h"
37
#include "os_support.h"
38
39
#include "entcode.h"
40
#include "rate.h"
41
#include "quant_bands.h"
42
43
static const unsigned char LOG2_FRAC_TABLE[24]={
44
   0,
45
   8,13,
46
  16,19,21,23,
47
  24,26,27,28,29,30,31,32,
48
  32,33,34,34,35,36,36,37,37
49
};
50
51
#if defined(CUSTOM_MODES)
52
53
/*Determines if V(N,K) fits in a 32-bit unsigned integer.
54
  N and K are themselves limited to 15 bits.*/
55
static int fits_in32(int _n, int _k)
56
{
57
   static const opus_int16 maxN[15] = {
58
      32767, 32767, 32767, 1476, 283, 109,  60,  40,
59
       29,  24,  20,  18,  16,  14,  13};
60
   static const opus_int16 maxK[15] = {
61
      32767, 32767, 32767, 32767, 1172, 238,  95,  53,
62
       36,  27,  22,  18,  16,  15,  13};
63
   if (_n>=14)
64
   {
65
      if (_k>=14)
66
         return 0;
67
      else
68
         return _n <= maxN[_k];
69
   } else {
70
      return _k <= maxK[_n];
71
   }
72
}
73
74
void compute_pulse_cache(CELTMode *m, int LM)
75
{
76
   int C;
77
   int i;
78
   int j;
79
   int curr=0;
80
   int nbEntries=0;
81
   int entryN[100], entryK[100], entryI[100];
82
   const opus_int16 *eBands = m->eBands;
83
   PulseCache *cache = &m->cache;
84
   opus_int16 *cindex;
85
   unsigned char *bits;
86
   unsigned char *cap;
87
88
   cindex = (opus_int16 *)opus_alloc(sizeof(cache->index[0])*m->nbEBands*(LM+2));
89
   cache->index = cindex;
90
91
   /* Scan for all unique band sizes */
92
   for (i=0;i<=LM+1;i++)
93
   {
94
      for (j=0;j<m->nbEBands;j++)
95
      {
96
         int k;
97
         int N = (eBands[j+1]-eBands[j])<<i>>1;
98
         cindex[i*m->nbEBands+j] = -1;
99
         /* Find other bands that have the same size */
100
         for (k=0;k<=i;k++)
101
         {
102
            int n;
103
            for (n=0;n<m->nbEBands && (k!=i || n<j);n++)
104
            {
105
               if (N == (eBands[n+1]-eBands[n])<<k>>1)
106
               {
107
                  cindex[i*m->nbEBands+j] = cindex[k*m->nbEBands+n];
108
                  break;
109
               }
110
            }
111
         }
112
         if (cache->index[i*m->nbEBands+j] == -1 && N!=0)
113
         {
114
            int K;
115
            entryN[nbEntries] = N;
116
            K = 0;
117
            while (fits_in32(N,get_pulses(K+1)) && K<MAX_PSEUDO)
118
               K++;
119
            entryK[nbEntries] = K;
120
            cindex[i*m->nbEBands+j] = curr;
121
            entryI[nbEntries] = curr;
122
123
            curr += K+1;
124
            nbEntries++;
125
         }
126
      }
127
   }
128
   bits = (unsigned char *)opus_alloc(sizeof(unsigned char)*curr);
129
   cache->bits = bits;
130
   cache->size = curr;
131
   /* Compute the cache for all unique sizes */
132
   for (i=0;i<nbEntries;i++)
133
   {
134
      unsigned char *ptr = bits+entryI[i];
135
      opus_int16 tmp[CELT_MAX_PULSES+1];
136
      get_required_bits(tmp, entryN[i], get_pulses(entryK[i]), BITRES);
137
      for (j=1;j<=entryK[i];j++)
138
         ptr[j] = tmp[get_pulses(j)]-1;
139
      ptr[0] = entryK[i];
140
   }
141
142
   /* Compute the maximum rate for each band at which we'll reliably use as
143
       many bits as we ask for. */
144
   cache->caps = cap = (unsigned char *)opus_alloc(sizeof(cache->caps[0])*(LM+1)*2*m->nbEBands);
145
   for (i=0;i<=LM;i++)
146
   {
147
      for (C=1;C<=2;C++)
148
      {
149
         for (j=0;j<m->nbEBands;j++)
150
         {
151
            int N0;
152
            int max_bits;
153
            N0 = m->eBands[j+1]-m->eBands[j];
154
            /* N=1 bands only have a sign bit and fine bits. */
155
            if (N0<<i == 1)
156
               max_bits = C*(1+MAX_FINE_BITS)<<BITRES;
157
            else
158
            {
159
               const unsigned char *pcache;
160
               opus_int32           num;
161
               opus_int32           den;
162
               int                  LM0;
163
               int                  N;
164
               int                  offset;
165
               int                  ndof;
166
               int                  qb;
167
               int                  k;
168
               LM0 = 0;
169
               /* Even-sized bands bigger than N=2 can be split one more time.
170
                  As of commit 44203907 all bands >1 are even, including custom modes.*/
171
               if (N0 > 2)
172
               {
173
                  N0>>=1;
174
                  LM0--;
175
               }
176
               /* N0=1 bands can't be split down to N<2. */
177
               else if (N0 <= 1)
178
               {
179
                  LM0=IMIN(i,1);
180
                  N0<<=LM0;
181
               }
182
               /* Compute the cost for the lowest-level PVQ of a fully split
183
                   band. */
184
               pcache = bits + cindex[(LM0+1)*m->nbEBands+j];
185
               max_bits = pcache[pcache[0]]+1;
186
               /* Add in the cost of coding regular splits. */
187
               N = N0;
188
               for(k=0;k<i-LM0;k++){
189
                  max_bits <<= 1;
190
                  /* Offset the number of qtheta bits by log2(N)/2
191
                      + QTHETA_OFFSET compared to their "fair share" of
192
                      total/N */
193
                  offset = ((m->logN[j]+(opus_int32)((opus_uint32)(LM0+k)<<BITRES))>>1)-QTHETA_OFFSET;
194
                  /* The number of qtheta bits we'll allocate if the remainder
195
                      is to be max_bits.
196
                     The average measured cost for theta is 0.89701 times qb,
197
                      approximated here as 459/512. */
198
                  num=459*(opus_int32)((2*N-1)*offset+max_bits);
199
                  den=((opus_int32)(2*N-1)<<9)-459;
200
                  qb = IMIN((num+(den>>1))/den, 57);
201
                  celt_assert(qb >= 0);
202
                  max_bits += qb;
203
                  N <<= 1;
204
               }
205
               /* Add in the cost of a stereo split, if necessary. */
206
               if (C==2)
207
               {
208
                  max_bits <<= 1;
209
                  offset = ((m->logN[j]+(i<<BITRES))>>1)-(N==2?QTHETA_OFFSET_TWOPHASE:QTHETA_OFFSET);
210
                  ndof = 2*N-1-(N==2);
211
                  /* The average measured cost for theta with the step PDF is
212
                      0.95164 times qb, approximated here as 487/512. */
213
                  num = (N==2?512:487)*(opus_int32)(max_bits+ndof*offset);
214
                  den = ((opus_int32)ndof<<9)-(N==2?512:487);
215
                  qb = IMIN((num+(den>>1))/den, (N==2?64:61));
216
                  celt_assert(qb >= 0);
217
                  max_bits += qb;
218
               }
219
               /* Add the fine bits we'll use. */
220
               /* Compensate for the extra DoF in stereo */
221
               ndof = C*N + ((C==2 && N>2) ? 1 : 0);
222
               /* Offset the number of fine bits by log2(N)/2 + FINE_OFFSET
223
                   compared to their "fair share" of total/N */
224
               offset = ((m->logN[j] + (i<<BITRES))>>1)-FINE_OFFSET;
225
               /* N=2 is the only point that doesn't match the curve */
226
               if (N==2)
227
                  offset += 1<<BITRES>>2;
228
               /* The number of fine bits we'll allocate if the remainder is
229
                   to be max_bits. */
230
               num = max_bits+ndof*offset;
231
               den = (ndof-1)<<BITRES;
232
               qb = IMIN((num+(den>>1))/den, MAX_FINE_BITS);
233
               celt_assert(qb >= 0);
234
               max_bits += C*qb<<BITRES;
235
            }
236
            max_bits = (4*max_bits/(C*((m->eBands[j+1]-m->eBands[j])<<i)))-64;
237
            celt_assert(max_bits >= 0);
238
            celt_assert(max_bits < 256);
239
            *cap++ = (unsigned char)max_bits;
240
         }
241
      }
242
   }
243
}
244
245
#endif /* CUSTOM_MODES */
246
247
0
#define ALLOC_STEPS 6
248
249
static OPUS_INLINE int interp_bits2pulses(const CELTMode *m, int start, int end, int skip_start,
250
      const int *bits1, const int *bits2, const int *thresh, const int *cap, opus_int32 total, opus_int32 *_balance,
251
      int skip_rsv, int *intensity, int intensity_rsv, int *dual_stereo, int dual_stereo_rsv, int *bits,
252
      int *ebits, int *fine_priority, int C, int LM, ec_ctx *ec, int encode, int prev, int signalBandwidth)
253
0
{
254
0
   opus_int32 psum;
255
0
   int lo, hi;
256
0
   int i, j;
257
0
   int logM;
258
0
   int stereo;
259
0
   int codedBands=-1;
260
0
   int alloc_floor;
261
0
   opus_int32 left, percoeff;
262
0
   int done;
263
0
   opus_int32 balance;
264
0
   SAVE_STACK;
265
266
0
   alloc_floor = C<<BITRES;
267
0
   stereo = C>1;
268
269
0
   logM = LM<<BITRES;
270
0
   lo = 0;
271
0
   hi = 1<<ALLOC_STEPS;
272
0
   for (i=0;i<ALLOC_STEPS;i++)
273
0
   {
274
0
      int mid = (lo+hi)>>1;
275
0
      psum = 0;
276
0
      done = 0;
277
0
      for (j=end;j-->start;)
278
0
      {
279
0
         int tmp = bits1[j] + (mid*(opus_int32)bits2[j]>>ALLOC_STEPS);
280
0
         if (tmp >= thresh[j] || done)
281
0
         {
282
0
            done = 1;
283
            /* Don't allocate more than we can actually use */
284
0
            psum += IMIN(tmp, cap[j]);
285
0
         } else {
286
0
            if (tmp >= alloc_floor)
287
0
               psum += alloc_floor;
288
0
         }
289
0
      }
290
0
      if (psum > total)
291
0
         hi = mid;
292
0
      else
293
0
         lo = mid;
294
0
   }
295
0
   psum = 0;
296
   /*printf ("interp bisection gave %d\n", lo);*/
297
0
   done = 0;
298
0
   for (j=end;j-->start;)
299
0
   {
300
0
      int tmp = bits1[j] + ((opus_int32)lo*bits2[j]>>ALLOC_STEPS);
301
0
      if (tmp < thresh[j] && !done)
302
0
      {
303
0
         if (tmp >= alloc_floor)
304
0
            tmp = alloc_floor;
305
0
         else
306
0
            tmp = 0;
307
0
      } else
308
0
         done = 1;
309
      /* Don't allocate more than we can actually use */
310
0
      tmp = IMIN(tmp, cap[j]);
311
0
      bits[j] = tmp;
312
0
      psum += tmp;
313
0
   }
314
315
   /* Decide which bands to skip, working backwards from the end. */
316
0
   for (codedBands=end;;codedBands--)
317
0
   {
318
0
      int band_width;
319
0
      int band_bits;
320
0
      int rem;
321
0
      j = codedBands-1;
322
      /* Never skip the first band, nor a band that has been boosted by
323
          dynalloc.
324
         In the first case, we'd be coding a bit to signal we're going to waste
325
          all the other bits.
326
         In the second case, we'd be coding a bit to redistribute all the bits
327
          we just signaled should be cocentrated in this band. */
328
0
      if (j<=skip_start)
329
0
      {
330
         /* Give the bit we reserved to end skipping back. */
331
0
         total += skip_rsv;
332
0
         break;
333
0
      }
334
      /*Figure out how many left-over bits we would be adding to this band.
335
        This can include bits we've stolen back from higher, skipped bands.*/
336
0
      left = total-psum;
337
0
      percoeff = celt_udiv(left, m->eBands[codedBands]-m->eBands[start]);
338
0
      left -= (m->eBands[codedBands]-m->eBands[start])*percoeff;
339
0
      rem = IMAX(left-(m->eBands[j]-m->eBands[start]),0);
340
0
      band_width = m->eBands[codedBands]-m->eBands[j];
341
0
      band_bits = (int)(bits[j] + percoeff*band_width + rem);
342
      /*Only code a skip decision if we're above the threshold for this band.
343
        Otherwise it is force-skipped.
344
        This ensures that we have enough bits to code the skip flag.*/
345
0
      if (band_bits >= IMAX(thresh[j], alloc_floor+(1<<BITRES)))
346
0
      {
347
0
         if (encode)
348
0
         {
349
            /*This if() block is the only part of the allocation function that
350
               is not a mandatory part of the bitstream: any bands we choose to
351
               skip here must be explicitly signaled.*/
352
0
            int depth_threshold;
353
            /*We choose a threshold with some hysteresis to keep bands from
354
               fluctuating in and out, but we try not to fold below a certain point. */
355
0
            if (codedBands > 17)
356
0
               depth_threshold = j<prev ? 7 : 9;
357
0
            else
358
0
               depth_threshold = 0;
359
#ifdef FUZZING
360
            (void)signalBandwidth;
361
            (void)depth_threshold;
362
            if ((rand()&0x1) == 0)
363
#else
364
0
            if (codedBands<=start+2 || (band_bits > (depth_threshold*band_width<<LM<<BITRES)>>4 && j<=signalBandwidth))
365
0
#endif
366
0
            {
367
0
               ec_enc_bit_logp(ec, 1, 1);
368
0
               break;
369
0
            }
370
0
            ec_enc_bit_logp(ec, 0, 1);
371
0
         } else if (ec_dec_bit_logp(ec, 1)) {
372
0
            break;
373
0
         }
374
         /*We used a bit to skip this band.*/
375
0
         psum += 1<<BITRES;
376
0
         band_bits -= 1<<BITRES;
377
0
      }
378
      /*Reclaim the bits originally allocated to this band.*/
379
0
      psum -= bits[j]+intensity_rsv;
380
0
      if (intensity_rsv > 0)
381
0
         intensity_rsv = LOG2_FRAC_TABLE[j-start];
382
0
      psum += intensity_rsv;
383
0
      if (band_bits >= alloc_floor)
384
0
      {
385
         /*If we have enough for a fine energy bit per channel, use it.*/
386
0
         psum += alloc_floor;
387
0
         bits[j] = alloc_floor;
388
0
      } else {
389
         /*Otherwise this band gets nothing at all.*/
390
0
         bits[j] = 0;
391
0
      }
392
0
   }
393
394
0
   celt_assert(codedBands > start);
395
   /* Code the intensity and dual stereo parameters. */
396
0
   if (intensity_rsv > 0)
397
0
   {
398
0
      if (encode)
399
0
      {
400
0
         *intensity = IMIN(*intensity, codedBands);
401
0
         ec_enc_uint(ec, *intensity-start, codedBands+1-start);
402
0
      }
403
0
      else
404
0
         *intensity = start+ec_dec_uint(ec, codedBands+1-start);
405
0
   }
406
0
   else
407
0
      *intensity = 0;
408
0
   if (*intensity <= start)
409
0
   {
410
0
      total += dual_stereo_rsv;
411
0
      dual_stereo_rsv = 0;
412
0
   }
413
0
   if (dual_stereo_rsv > 0)
414
0
   {
415
0
      if (encode)
416
0
         ec_enc_bit_logp(ec, *dual_stereo, 1);
417
0
      else
418
0
         *dual_stereo = ec_dec_bit_logp(ec, 1);
419
0
   }
420
0
   else
421
0
      *dual_stereo = 0;
422
423
   /* Allocate the remaining bits */
424
0
   left = total-psum;
425
0
   percoeff = celt_udiv(left, m->eBands[codedBands]-m->eBands[start]);
426
0
   left -= (m->eBands[codedBands]-m->eBands[start])*percoeff;
427
0
   for (j=start;j<codedBands;j++)
428
0
      bits[j] += ((int)percoeff*(m->eBands[j+1]-m->eBands[j]));
429
0
   for (j=start;j<codedBands;j++)
430
0
   {
431
0
      int tmp = (int)IMIN(left, m->eBands[j+1]-m->eBands[j]);
432
0
      bits[j] += tmp;
433
0
      left -= tmp;
434
0
   }
435
   /*for (j=0;j<end;j++)printf("%d ", bits[j]);printf("\n");*/
436
437
0
   balance = 0;
438
0
   for (j=start;j<codedBands;j++)
439
0
   {
440
0
      int N0, N, den;
441
0
      int offset;
442
0
      int NClogN;
443
0
      opus_int32 excess, bit;
444
445
0
      celt_assert(bits[j] >= 0);
446
0
      N0 = m->eBands[j+1]-m->eBands[j];
447
0
      N=N0<<LM;
448
0
      bit = (opus_int32)bits[j]+balance;
449
450
0
      if (N>1)
451
0
      {
452
0
         excess = MAX32(bit-cap[j],0);
453
0
         bits[j] = bit-excess;
454
455
         /* Compensate for the extra DoF in stereo */
456
0
         den=(C*N+ ((C==2 && N>2 && !*dual_stereo && j<*intensity) ? 1 : 0));
457
458
0
         NClogN = den*(m->logN[j] + logM);
459
460
         /* Offset for the number of fine bits by log2(N)/2 + FINE_OFFSET
461
            compared to their "fair share" of total/N */
462
0
         offset = (NClogN>>1)-den*FINE_OFFSET;
463
464
         /* N=2 is the only point that doesn't match the curve */
465
0
         if (N==2)
466
0
            offset += den<<BITRES>>2;
467
468
         /* Changing the offset for allocating the second and third
469
             fine energy bit */
470
0
         if (bits[j] + offset < den*2<<BITRES)
471
0
            offset += NClogN>>2;
472
0
         else if (bits[j] + offset < den*3<<BITRES)
473
0
            offset += NClogN>>3;
474
475
         /* Divide with rounding */
476
0
         ebits[j] = IMAX(0, (bits[j] + offset + (den<<(BITRES-1))));
477
0
         ebits[j] = celt_udiv(ebits[j], den)>>BITRES;
478
479
         /* Make sure not to bust */
480
0
         if (C*ebits[j] > (bits[j]>>BITRES))
481
0
            ebits[j] = bits[j] >> stereo >> BITRES;
482
483
         /* More than that is useless because that's about as far as PVQ can go */
484
0
         ebits[j] = IMIN(ebits[j], MAX_FINE_BITS);
485
486
         /* If we rounded down or capped this band, make it a candidate for the
487
             final fine energy pass */
488
0
         fine_priority[j] = ebits[j]*(den<<BITRES) >= bits[j]+offset;
489
490
         /* Remove the allocated fine bits; the rest are assigned to PVQ */
491
0
         bits[j] -= C*ebits[j]<<BITRES;
492
493
0
      } else {
494
         /* For N=1, all bits go to fine energy except for a single sign bit */
495
0
         excess = MAX32(0,bit-(C<<BITRES));
496
0
         bits[j] = bit-excess;
497
0
         ebits[j] = 0;
498
0
         fine_priority[j] = 1;
499
0
      }
500
501
      /* Fine energy can't take advantage of the re-balancing in
502
          quant_all_bands().
503
         Instead, do the re-balancing here.*/
504
0
      if(excess > 0)
505
0
      {
506
0
         int extra_fine;
507
0
         int extra_bits;
508
0
         extra_fine = IMIN(excess>>(stereo+BITRES),MAX_FINE_BITS-ebits[j]);
509
0
         ebits[j] += extra_fine;
510
0
         extra_bits = extra_fine*C<<BITRES;
511
0
         fine_priority[j] = extra_bits >= excess-balance;
512
0
         excess -= extra_bits;
513
0
      }
514
0
      balance = excess;
515
516
0
      celt_assert(bits[j] >= 0);
517
0
      celt_assert(ebits[j] >= 0);
518
0
   }
519
   /* Save any remaining bits over the cap for the rebalancing in
520
       quant_all_bands(). */
521
0
   *_balance = balance;
522
523
   /* The skipped bands use all their bits for fine energy. */
524
0
   for (;j<end;j++)
525
0
   {
526
0
      ebits[j] = bits[j] >> stereo >> BITRES;
527
0
      celt_assert(C*ebits[j]<<BITRES == bits[j]);
528
0
      bits[j] = 0;
529
0
      fine_priority[j] = ebits[j]<1;
530
0
   }
531
0
   RESTORE_STACK;
532
0
   return codedBands;
533
0
}
534
535
int clt_compute_allocation(const CELTMode *m, int start, int end, const int *offsets, const int *cap, int alloc_trim, int *intensity, int *dual_stereo,
536
      opus_int32 total, opus_int32 *balance, int *pulses, int *ebits, int *fine_priority, int C, int LM, ec_ctx *ec, int encode, int prev, int signalBandwidth)
537
0
{
538
0
   int lo, hi, len, j;
539
0
   int codedBands;
540
0
   int skip_start;
541
0
   int skip_rsv;
542
0
   int intensity_rsv;
543
0
   int dual_stereo_rsv;
544
0
   VARDECL(int, bits1);
545
0
   VARDECL(int, bits2);
546
0
   VARDECL(int, thresh);
547
0
   VARDECL(int, trim_offset);
548
0
   SAVE_STACK;
549
550
0
   total = IMAX(total, 0);
551
0
   len = m->nbEBands;
552
0
   skip_start = start;
553
   /* Reserve a bit to signal the end of manually skipped bands. */
554
0
   skip_rsv = total >= 1<<BITRES ? 1<<BITRES : 0;
555
0
   total -= skip_rsv;
556
   /* Reserve bits for the intensity and dual stereo parameters. */
557
0
   intensity_rsv = dual_stereo_rsv = 0;
558
0
   if (C==2)
559
0
   {
560
0
      intensity_rsv = LOG2_FRAC_TABLE[end-start];
561
0
      if (intensity_rsv>total)
562
0
         intensity_rsv = 0;
563
0
      else
564
0
      {
565
0
         total -= intensity_rsv;
566
0
         dual_stereo_rsv = total>=1<<BITRES ? 1<<BITRES : 0;
567
0
         total -= dual_stereo_rsv;
568
0
      }
569
0
   }
570
0
   ALLOC(bits1, len, int);
571
0
   ALLOC(bits2, len, int);
572
0
   ALLOC(thresh, len, int);
573
0
   ALLOC(trim_offset, len, int);
574
575
0
   for (j=start;j<end;j++)
576
0
   {
577
      /* Below this threshold, we're sure not to allocate any PVQ bits */
578
0
      thresh[j] = IMAX((C)<<BITRES, (3*(m->eBands[j+1]-m->eBands[j])<<LM<<BITRES)>>4);
579
      /* Tilt of the allocation curve */
580
0
      trim_offset[j] = C*(m->eBands[j+1]-m->eBands[j])*(alloc_trim-5-LM)*(end-j-1)
581
0
            *(1<<(LM+BITRES))>>6;
582
      /* Giving less resolution to single-coefficient bands because they get
583
         more benefit from having one coarse value per coefficient*/
584
0
      if ((m->eBands[j+1]-m->eBands[j])<<LM==1)
585
0
         trim_offset[j] -= C<<BITRES;
586
0
   }
587
0
   lo = 1;
588
0
   hi = m->nbAllocVectors - 1;
589
0
   do
590
0
   {
591
0
      int done = 0;
592
0
      int psum = 0;
593
0
      int mid = (lo+hi) >> 1;
594
0
      for (j=end;j-->start;)
595
0
      {
596
0
         int bitsj;
597
0
         int N = m->eBands[j+1]-m->eBands[j];
598
0
         bitsj = C*N*m->allocVectors[mid*len+j]<<LM>>2;
599
0
         if (bitsj > 0)
600
0
            bitsj = IMAX(0, bitsj + trim_offset[j]);
601
0
         bitsj += offsets[j];
602
0
         if (bitsj >= thresh[j] || done)
603
0
         {
604
0
            done = 1;
605
            /* Don't allocate more than we can actually use */
606
0
            psum += IMIN(bitsj, cap[j]);
607
0
         } else {
608
0
            if (bitsj >= C<<BITRES)
609
0
               psum += C<<BITRES;
610
0
         }
611
0
      }
612
0
      if (psum > total)
613
0
         hi = mid - 1;
614
0
      else
615
0
         lo = mid + 1;
616
      /*printf ("lo = %d, hi = %d\n", lo, hi);*/
617
0
   }
618
0
   while (lo <= hi);
619
0
   hi = lo--;
620
   /*printf ("interp between %d and %d\n", lo, hi);*/
621
0
   for (j=start;j<end;j++)
622
0
   {
623
0
      int bits1j, bits2j;
624
0
      int N = m->eBands[j+1]-m->eBands[j];
625
0
      bits1j = C*N*m->allocVectors[lo*len+j]<<LM>>2;
626
0
      bits2j = hi>=m->nbAllocVectors ?
627
0
            cap[j] : C*N*m->allocVectors[hi*len+j]<<LM>>2;
628
0
      if (bits1j > 0)
629
0
         bits1j = IMAX(0, bits1j + trim_offset[j]);
630
0
      if (bits2j > 0)
631
0
         bits2j = IMAX(0, bits2j + trim_offset[j]);
632
0
      if (lo > 0)
633
0
         bits1j += offsets[j];
634
0
      bits2j += offsets[j];
635
0
      if (offsets[j]>0)
636
0
         skip_start = j;
637
0
      bits2j = IMAX(0,bits2j-bits1j);
638
0
      bits1[j] = bits1j;
639
0
      bits2[j] = bits2j;
640
0
   }
641
0
   codedBands = interp_bits2pulses(m, start, end, skip_start, bits1, bits2, thresh, cap,
642
0
         total, balance, skip_rsv, intensity, intensity_rsv, dual_stereo, dual_stereo_rsv,
643
0
         pulses, ebits, fine_priority, C, LM, ec, encode, prev, signalBandwidth);
644
0
   RESTORE_STACK;
645
0
   return codedBands;
646
0
}
647
648
#ifdef ENABLE_QEXT
649
650
static const unsigned char last_zero[3] = {64, 50, 0};
651
static const unsigned char last_cap[3] = {110, 60, 0};
652
static const unsigned char last_other[4] = {120, 112, 70, 0};
653
654
static void ec_enc_depth(ec_enc *enc, opus_int32 depth, opus_int32 cap, opus_int32 *last) {
655
   int sym = 3;
656
   if (depth==*last) sym = 2;
657
   if (depth==cap) sym = 1;
658
   if (depth==0) sym = 0;
659
   if (*last == 0) {
660
      ec_enc_icdf(enc, IMIN(sym, 2), last_zero, 7);
661
   } else if (*last == cap) {
662
      ec_enc_icdf(enc, IMIN(sym, 2), last_cap, 7);
663
   } else {
664
      ec_enc_icdf(enc, sym, last_other, 7);
665
   }
666
   /* We accept some redundancy if depth==last (for last different from 0 and cap). */
667
   if (sym == 3) ec_enc_uint(enc, depth-1, cap);
668
   *last = depth;
669
}
670
671
static int ec_dec_depth(ec_dec *dec, opus_int32 cap, opus_int32 *last) {
672
   int depth, sym;
673
   if (*last == 0) {
674
      sym = ec_dec_icdf(dec, last_zero, 7);
675
      if (sym==2) sym=3;
676
   } else if (*last == cap) {
677
      sym = ec_dec_icdf(dec, last_cap, 7);
678
      if (sym==2) sym=3;
679
   } else {
680
      sym = ec_dec_icdf(dec, last_other, 7);
681
   }
682
   if (sym==0) depth=0;
683
   else if (sym==1) depth=cap;
684
   else if (sym==2) depth=*last;
685
   else depth = 1 + ec_dec_uint(dec, cap);
686
   *last = depth;
687
   return depth;
688
}
689
690
#define MSWAP16(a,b) do {opus_val16 tmp = a;a=b;b=tmp;} while(0)
691
static opus_val16 median_of_5_val16(const opus_val16 *x)
692
{
693
   opus_val16 t0, t1, t2, t3, t4;
694
   t2 = x[2];
695
   if (x[0] > x[1])
696
   {
697
      t0 = x[1];
698
      t1 = x[0];
699
   } else {
700
      t0 = x[0];
701
      t1 = x[1];
702
   }
703
   if (x[3] > x[4])
704
   {
705
      t3 = x[4];
706
      t4 = x[3];
707
   } else {
708
      t3 = x[3];
709
      t4 = x[4];
710
   }
711
   if (t0 > t3)
712
   {
713
      MSWAP16(t0, t3);
714
      MSWAP16(t1, t4);
715
   }
716
   if (t2 > t1)
717
   {
718
      if (t1 < t3)
719
         return MIN16(t2, t3);
720
      else
721
         return MIN16(t4, t1);
722
   } else {
723
      if (t2 < t3)
724
         return MIN16(t1, t3);
725
      else
726
         return MIN16(t2, t4);
727
   }
728
}
729
730
void clt_compute_extra_allocation(const CELTMode *m, const CELTMode *qext_mode, int start, int end, int qext_end, const celt_glog *bandLogE, const celt_glog *qext_bandLogE,
731
      opus_int32 total, int *extra_pulses, int *extra_equant, int C, int LM, ec_ctx *ec, int encode, opus_val16 tone_freq, opus_val32 toneishness)
732
{
733
   int i;
734
   opus_int32 last=0;
735
   opus_val32 sum;
736
   opus_val32 fill;
737
   int iter;
738
   int tot_bands;
739
   int tot_samples;
740
   VARDECL(int, depth);
741
   VARDECL(opus_int32, cap);
742
#ifdef FUZZING
743
   float depth_std;
744
#endif
745
   SAVE_STACK;
746
#ifdef FUZZING
747
   depth_std = -10.f*log(1e-8+(float)rand()/RAND_MAX);
748
   depth_std = FMAX(0, FMIN(48, depth_std));
749
#endif
750
   if (qext_mode != NULL) {
751
      celt_assert(end==m->nbEBands);
752
      tot_bands = end + qext_end;
753
      tot_samples = qext_mode->eBands[qext_end]*C<<LM;
754
   } else {
755
      tot_bands = end;
756
      tot_samples = (m->eBands[end]-m->eBands[start])*C<<LM;
757
   }
758
   ALLOC(cap, tot_bands, opus_int32);
759
   for (i=start;i<end;i++) cap[i] = 12;
760
   if (qext_mode != NULL) {
761
      for (i=0;i<qext_end;i++) cap[end+i] = 14;
762
   }
763
   if (total <= 0) {
764
      for (i=start;i<m->nbEBands+qext_end;i++) {
765
         extra_pulses[i] = extra_equant[i] = 0;
766
      }
767
      return;
768
   }
769
   ALLOC(depth, tot_bands, int);
770
   if (encode) {
771
      VARDECL(opus_val16, flatE);
772
      VARDECL(int, Ncoef);
773
      VARDECL(opus_val16, min);
774
      VARDECL(opus_val16, follower);
775
776
      ALLOC(flatE, tot_bands, opus_val16);
777
      ALLOC(min, tot_bands, opus_val16);
778
      ALLOC(Ncoef, tot_bands, int);
779
      for (i=start;i<end;i++) {
780
         Ncoef[i] = (m->eBands[i+1]-m->eBands[i])*C<<LM;
781
      }
782
      /* Remove the effect of band width, eMeans and pre-emphasis to compute the real (flat) spectrum. */
783
      for (i=start;i<end;i++) {
784
         flatE[i] = PSHR32(bandLogE[i] - GCONST(0.0625f)*m->logN[i] + SHL32(eMeans[i],DB_SHIFT-4) - GCONST(.0062f)*(i+5)*(i+5), DB_SHIFT-10);
785
         min[i] = 0;
786
      }
787
      if (C==2) {
788
         for (i=start;i<end;i++) {
789
            flatE[i] = MAXG(flatE[i], PSHR32(bandLogE[m->nbEBands+i] - GCONST(0.0625f)*m->logN[i] + SHL32(eMeans[i],DB_SHIFT-4) - GCONST(.0062f)*(i+5)*(i+5), DB_SHIFT-10));
790
         }
791
      }
792
      flatE[end-1] += QCONST16(2.f, 10);
793
      if (qext_mode != NULL) {
794
         opus_val16 min_depth = 0;
795
         /* If we have enough bits, give at least 1 bit of depth to all higher bands. */
796
         if (total >= 3*C*(qext_mode->eBands[qext_end]-qext_mode->eBands[start])<<LM<<BITRES && (toneishness < QCONST32(.98f, 29) || tone_freq > 1.33f))
797
            min_depth = QCONST16(1.f, 10);
798
         for (i=0;i<qext_end;i++) {
799
            Ncoef[end+i] = (qext_mode->eBands[i+1]-qext_mode->eBands[i])*C<<LM;
800
            min[end+i] = min_depth;
801
         }
802
         for (i=0;i<qext_end;i++) {
803
            flatE[end+i] = PSHR32(qext_bandLogE[i] - GCONST(0.0625f)*qext_mode->logN[i] + SHL32(eMeans[i],DB_SHIFT-4) - GCONST(.0062f)*(end+i+5)*(end+i+5), DB_SHIFT-10);
804
         }
805
         if (C==2) {
806
            for (i=0;i<qext_end;i++) {
807
               flatE[end+i] = MAXG(flatE[end+i], PSHR32(qext_bandLogE[NB_QEXT_BANDS+i] - GCONST(0.0625f)*qext_mode->logN[i] + SHL32(eMeans[i],DB_SHIFT-4) - GCONST(.0062f)*(end+i+5)*(end+i+5), DB_SHIFT-10));
808
            }
809
         }
810
      }
811
      ALLOC(follower, tot_bands, opus_val16);
812
      for (i=start+2;i<tot_bands-2;i++) {
813
         follower[i] = median_of_5_val16(&flatE[i-2]);
814
      }
815
      follower[start] = follower[start+1] = follower[start+2];
816
      follower[tot_bands-1] = follower[tot_bands-2] = follower[tot_bands-3];
817
      for (i=start+1;i<tot_bands;i++) {
818
         follower[i] = MAX16(follower[i], follower[i-1]-QCONST16(1.f, 10));
819
      }
820
      for (i=tot_bands-2;i>=start;i--) {
821
         follower[i] = MAX16(follower[i], follower[i+1]-QCONST16(1.f, 10));
822
      }
823
      for (i=start;i<tot_bands;i++) flatE[i] -= MULT16_16_Q15(Q15ONE-PSHR32(toneishness, 14), follower[i]);
824
      if (qext_mode != NULL) {
825
         for (i=0;i<qext_end;i++) flatE[end+i] = flatE[end+i] + QCONST16(3.f, 10) + QCONST16(.2f, 10)*i;
826
      }
827
      /* Approximate fill level assuming all bands contribute fully. */
828
      sum = 0;
829
      for (i=start;i<tot_bands;i++) {
830
         sum += MULT16_16(Ncoef[i], flatE[i]);
831
      }
832
      total >>= BITRES;
833
      fill = (SHL32(total, 10) + sum)/tot_samples;
834
      /* Iteratively refine the fill level considering the depth min and cap. */
835
      for (iter=0;iter<10;iter++) {
836
         sum = 0;
837
         for (i=start;i<tot_bands;i++)
838
            sum += Ncoef[i] * MIN32(SHL32(cap[i], 10), MAX32(min[i], flatE[i]-fill));
839
         fill -= (SHL32(total, 10) - sum)/tot_samples;
840
      }
841
      for (i=start;i<tot_bands;i++) {
842
#ifdef FIXED_POINT
843
         depth[i] = PSHR32(MIN32(SHL32(cap[i], 10), MAX32(min[i], flatE[i]-fill)), 10-2);
844
#else
845
         depth[i] = (int)floor(.5+4*MIN32(SHL32(cap[i], 10), MAX32(min[i], flatE[i]-fill)));
846
#endif
847
#ifdef FUZZING
848
         depth[i] = (int)-depth_std*log(1e-8+(float)rand()/RAND_MAX);
849
         depth[i] = IMAX(0, IMIN(cap[i]<<2, depth[i]));
850
#endif
851
         if (ec_tell_frac(ec) + 80 < ec->storage*8<<BITRES)
852
            ec_enc_depth(ec, depth[i], 4*cap[i], &last);
853
         else
854
            depth[i] = 0;
855
      }
856
   } else {
857
      for (i=start;i<tot_bands;i++) {
858
         if (ec_tell_frac(ec) + 80 < ec->storage*8<<BITRES)
859
            depth[i] = ec_dec_depth(ec, 4*cap[i], &last);
860
         else
861
            depth[i] = 0;
862
      }
863
   }
864
   for (i=start;i<end;i++) {
865
      extra_equant[i] = (depth[i]+3)>>2;
866
      extra_pulses[i] = ((((m->eBands[i+1]-m->eBands[i])<<LM)-1)*C * depth[i] * (1<<BITRES) + 2)>>2;
867
   }
868
   if (qext_mode) {
869
      for (i=0;i<qext_end;i++) {
870
         extra_equant[end+i] = (depth[end+i]+3)>>2;
871
         extra_pulses[end+i] = ((((qext_mode->eBands[i+1]-qext_mode->eBands[i])<<LM)-1)*C * depth[end+i] * (1<<BITRES) + 2)>>2;
872
      }
873
   }
874
}
875
#endif