Coverage Report

Created: 2025-12-14 07:08

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/opus/celt/rate.c
Line
Count
Source
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
11.9G
#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
104M
{
254
104M
   opus_int32 psum;
255
104M
   int lo, hi;
256
104M
   int i, j;
257
104M
   int logM;
258
104M
   int stereo;
259
104M
   int codedBands=-1;
260
104M
   int alloc_floor;
261
104M
   opus_int32 left, percoeff;
262
104M
   int done;
263
104M
   opus_int32 balance;
264
104M
   SAVE_STACK;
265
266
104M
   alloc_floor = C<<BITRES;
267
104M
   stereo = C>1;
268
269
104M
   logM = LM<<BITRES;
270
104M
   lo = 0;
271
104M
   hi = 1<<ALLOC_STEPS;
272
731M
   for (i=0;i<ALLOC_STEPS;i++)
273
626M
   {
274
626M
      int mid = (lo+hi)>>1;
275
626M
      psum = 0;
276
626M
      done = 0;
277
10.1G
      for (j=end;j-->start;)
278
9.49G
      {
279
9.49G
         int tmp = bits1[j] + (mid*(opus_int32)bits2[j]>>ALLOC_STEPS);
280
9.49G
         if (tmp >= thresh[j] || done)
281
4.18G
         {
282
4.18G
            done = 1;
283
            /* Don't allocate more than we can actually use */
284
4.18G
            psum += IMIN(tmp, cap[j]);
285
5.31G
         } else {
286
5.31G
            if (tmp >= alloc_floor)
287
106M
               psum += alloc_floor;
288
5.31G
         }
289
9.49G
      }
290
626M
      if (psum > total)
291
272M
         hi = mid;
292
353M
      else
293
353M
         lo = mid;
294
626M
   }
295
104M
   psum = 0;
296
   /*printf ("interp bisection gave %d\n", lo);*/
297
104M
   done = 0;
298
1.68G
   for (j=end;j-->start;)
299
1.58G
   {
300
1.58G
      int tmp = bits1[j] + ((opus_int32)lo*bits2[j]>>ALLOC_STEPS);
301
1.58G
      if (tmp < thresh[j] && !done)
302
1.10G
      {
303
1.10G
         if (tmp >= alloc_floor)
304
5.46M
            tmp = alloc_floor;
305
1.10G
         else
306
1.10G
            tmp = 0;
307
1.10G
      } else
308
474M
         done = 1;
309
      /* Don't allocate more than we can actually use */
310
1.58G
      tmp = IMIN(tmp, cap[j]);
311
1.58G
      bits[j] = tmp;
312
1.58G
      psum += tmp;
313
1.58G
   }
314
315
   /* Decide which bands to skip, working backwards from the end. */
316
1.06G
   for (codedBands=end;;codedBands--)
317
1.17G
   {
318
1.17G
      int band_width;
319
1.17G
      int band_bits;
320
1.17G
      int rem;
321
1.17G
      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 concentrated in this band. */
328
1.17G
      if (j<=skip_start)
329
70.0M
      {
330
         /* Give the bit we reserved to end skipping back. */
331
70.0M
         total += skip_rsv;
332
70.0M
         break;
333
70.0M
      }
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
1.10G
      left = total-psum;
337
1.10G
      percoeff = celt_udiv(left, m->eBands[codedBands]-m->eBands[start]);
338
1.10G
      left -= (m->eBands[codedBands]-m->eBands[start])*percoeff;
339
1.10G
      rem = IMAX(left-(m->eBands[j]-m->eBands[start]),0);
340
1.10G
      band_width = m->eBands[codedBands]-m->eBands[j];
341
1.10G
      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
1.10G
      if (band_bits >= IMAX(thresh[j], alloc_floor+(1<<BITRES)))
346
36.6M
      {
347
36.6M
         if (encode)
348
36.3M
         {
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
36.3M
            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
36.3M
            if (codedBands > 17)
356
7.67M
               depth_threshold = j<prev ? 7 : 9;
357
28.6M
            else
358
28.6M
               depth_threshold = 0;
359
#ifdef FUZZING
360
            (void)signalBandwidth;
361
            (void)depth_threshold;
362
            if ((rand()&0x1) == 0)
363
#else
364
36.3M
            if (codedBands<=start+2 || (band_bits > (depth_threshold*band_width<<LM<<BITRES)>>4 && j<=signalBandwidth))
365
34.3M
#endif
366
34.3M
            {
367
34.3M
               ec_enc_bit_logp(ec, 1, 1);
368
34.3M
               break;
369
34.3M
            }
370
2.00M
            ec_enc_bit_logp(ec, 0, 1);
371
2.00M
         } else if (ec_dec_bit_logp(ec, 1)) {
372
77.6k
            break;
373
77.6k
         }
374
         /*We used a bit to skip this band.*/
375
2.25M
         psum += 1<<BITRES;
376
2.25M
         band_bits -= 1<<BITRES;
377
2.25M
      }
378
      /*Reclaim the bits originally allocated to this band.*/
379
1.06G
      psum -= bits[j]+intensity_rsv;
380
1.06G
      if (intensity_rsv > 0)
381
55.8M
         intensity_rsv = LOG2_FRAC_TABLE[j-start];
382
1.06G
      psum += intensity_rsv;
383
1.06G
      if (band_bits >= alloc_floor)
384
30.9M
      {
385
         /*If we have enough for a fine energy bit per channel, use it.*/
386
30.9M
         psum += alloc_floor;
387
30.9M
         bits[j] = alloc_floor;
388
1.03G
      } else {
389
         /*Otherwise this band gets nothing at all.*/
390
1.03G
         bits[j] = 0;
391
1.03G
      }
392
1.06G
   }
393
394
104M
   celt_assert(codedBands > start);
395
   /* Code the intensity and dual stereo parameters. */
396
104M
   if (intensity_rsv > 0)
397
12.8M
   {
398
12.8M
      if (encode)
399
12.7M
      {
400
12.7M
         *intensity = IMIN(*intensity, codedBands);
401
12.7M
         ec_enc_uint(ec, *intensity-start, codedBands+1-start);
402
12.7M
      }
403
36.3k
      else
404
36.3k
         *intensity = start+ec_dec_uint(ec, codedBands+1-start);
405
12.8M
   }
406
91.6M
   else
407
91.6M
      *intensity = 0;
408
104M
   if (*intensity <= start)
409
91.8M
   {
410
91.8M
      total += dual_stereo_rsv;
411
91.8M
      dual_stereo_rsv = 0;
412
91.8M
   }
413
104M
   if (dual_stereo_rsv > 0)
414
12.3M
   {
415
12.3M
      if (encode)
416
12.3M
         ec_enc_bit_logp(ec, *dual_stereo, 1);
417
31.6k
      else
418
31.6k
         *dual_stereo = ec_dec_bit_logp(ec, 1);
419
12.3M
   }
420
92.0M
   else
421
92.0M
      *dual_stereo = 0;
422
423
   /* Allocate the remaining bits */
424
104M
   left = total-psum;
425
104M
   percoeff = celt_udiv(left, m->eBands[codedBands]-m->eBands[start]);
426
104M
   left -= (m->eBands[codedBands]-m->eBands[start])*percoeff;
427
617M
   for (j=start;j<codedBands;j++)
428
513M
      bits[j] += ((int)percoeff*(m->eBands[j+1]-m->eBands[j]));
429
617M
   for (j=start;j<codedBands;j++)
430
513M
   {
431
513M
      int tmp = (int)IMIN(left, m->eBands[j+1]-m->eBands[j]);
432
513M
      bits[j] += tmp;
433
513M
      left -= tmp;
434
513M
   }
435
   /*for (j=0;j<end;j++)printf("%d ", bits[j]);printf("\n");*/
436
437
104M
   balance = 0;
438
617M
   for (j=start;j<codedBands;j++)
439
513M
   {
440
513M
      int N0, N, den;
441
513M
      int offset;
442
513M
      int NClogN;
443
513M
      opus_int32 excess, bit;
444
445
513M
      celt_assert(bits[j] >= 0);
446
513M
      N0 = m->eBands[j+1]-m->eBands[j];
447
513M
      N=N0<<LM;
448
513M
      bit = (opus_int32)bits[j]+balance;
449
450
513M
      if (N>1)
451
335M
      {
452
335M
         excess = MAX32(bit-cap[j],0);
453
335M
         bits[j] = bit-excess;
454
455
         /* Compensate for the extra DoF in stereo */
456
335M
         den=(C*N+ ((C==2 && N>2 && !*dual_stereo && j<*intensity) ? 1 : 0));
457
458
335M
         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
335M
         offset = (NClogN>>1)-den*FINE_OFFSET;
463
464
         /* N=2 is the only point that doesn't match the curve */
465
335M
         if (N==2)
466
121M
            offset += den<<BITRES>>2;
467
468
         /* Changing the offset for allocating the second and third
469
             fine energy bit */
470
335M
         if (bits[j] + offset < den*2<<BITRES)
471
274M
            offset += NClogN>>2;
472
61.3M
         else if (bits[j] + offset < den*3<<BITRES)
473
23.5M
            offset += NClogN>>3;
474
475
         /* Divide with rounding */
476
335M
         ebits[j] = IMAX(0, (bits[j] + offset + (den<<(BITRES-1))));
477
335M
         ebits[j] = celt_udiv(ebits[j], den)>>BITRES;
478
479
         /* Make sure not to bust */
480
335M
         if (C*ebits[j] > (bits[j]>>BITRES))
481
64.1k
            ebits[j] = bits[j] >> stereo >> BITRES;
482
483
         /* More than that is useless because that's about as far as PVQ can go */
484
335M
         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
335M
         fine_priority[j] = ebits[j]*(den<<BITRES) >= bits[j]+offset;
489
490
         /* Remove the allocated fine bits; the rest are assigned to PVQ */
491
335M
         bits[j] -= C*ebits[j]<<BITRES;
492
493
335M
      } else {
494
         /* For N=1, all bits go to fine energy except for a single sign bit */
495
177M
         excess = MAX32(0,bit-(C<<BITRES));
496
177M
         bits[j] = bit-excess;
497
177M
         ebits[j] = 0;
498
177M
         fine_priority[j] = 1;
499
177M
      }
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
513M
      if(excess > 0)
505
131M
      {
506
131M
         int extra_fine;
507
131M
         int extra_bits;
508
131M
         extra_fine = IMIN(excess>>(stereo+BITRES),MAX_FINE_BITS-ebits[j]);
509
131M
         ebits[j] += extra_fine;
510
131M
         extra_bits = extra_fine*C<<BITRES;
511
131M
         fine_priority[j] = extra_bits >= excess-balance;
512
131M
         excess -= extra_bits;
513
131M
      }
514
513M
      balance = excess;
515
516
513M
      celt_assert(bits[j] >= 0);
517
513M
      celt_assert(ebits[j] >= 0);
518
513M
   }
519
   /* Save any remaining bits over the cap for the rebalancing in
520
       quant_all_bands(). */
521
104M
   *_balance = balance;
522
523
   /* The skipped bands use all their bits for fine energy. */
524
1.17G
   for (;j<end;j++)
525
1.06G
   {
526
1.06G
      ebits[j] = bits[j] >> stereo >> BITRES;
527
1.06G
      celt_assert(C*ebits[j]<<BITRES == bits[j]);
528
1.06G
      bits[j] = 0;
529
1.06G
      fine_priority[j] = ebits[j]<1;
530
1.06G
   }
531
104M
   RESTORE_STACK;
532
104M
   return codedBands;
533
104M
}
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
104M
{
538
104M
   int lo, hi, len, j;
539
104M
   int codedBands;
540
104M
   int skip_start;
541
104M
   int skip_rsv;
542
104M
   int intensity_rsv;
543
104M
   int dual_stereo_rsv;
544
104M
   VARDECL(int, bits1);
545
104M
   VARDECL(int, bits2);
546
104M
   VARDECL(int, thresh);
547
104M
   VARDECL(int, trim_offset);
548
104M
   SAVE_STACK;
549
550
104M
   total = IMAX(total, 0);
551
104M
   len = m->nbEBands;
552
104M
   skip_start = start;
553
   /* Reserve a bit to signal the end of manually skipped bands. */
554
104M
   skip_rsv = total >= 1<<BITRES ? 1<<BITRES : 0;
555
104M
   total -= skip_rsv;
556
   /* Reserve bits for the intensity and dual stereo parameters. */
557
104M
   intensity_rsv = dual_stereo_rsv = 0;
558
104M
   if (C==2)
559
34.3M
   {
560
34.3M
      intensity_rsv = LOG2_FRAC_TABLE[end-start];
561
34.3M
      if (intensity_rsv>total)
562
21.4M
         intensity_rsv = 0;
563
12.8M
      else
564
12.8M
      {
565
12.8M
         total -= intensity_rsv;
566
12.8M
         dual_stereo_rsv = total>=1<<BITRES ? 1<<BITRES : 0;
567
12.8M
         total -= dual_stereo_rsv;
568
12.8M
      }
569
34.3M
   }
570
104M
   ALLOC(bits1, len, int);
571
104M
   ALLOC(bits2, len, int);
572
104M
   ALLOC(thresh, len, int);
573
104M
   ALLOC(trim_offset, len, int);
574
575
1.68G
   for (j=start;j<end;j++)
576
1.58G
   {
577
      /* Below this threshold, we're sure not to allocate any PVQ bits */
578
1.58G
      thresh[j] = IMAX((C)<<BITRES, (3*(m->eBands[j+1]-m->eBands[j])<<LM<<BITRES)>>4);
579
      /* Tilt of the allocation curve */
580
1.58G
      trim_offset[j] = C*(m->eBands[j+1]-m->eBands[j])*(alloc_trim-5-LM)*(end-j-1)
581
1.58G
            *(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
1.58G
      if ((m->eBands[j+1]-m->eBands[j])<<LM==1)
585
502M
         trim_offset[j] -= C<<BITRES;
586
1.58G
   }
587
104M
   lo = 1;
588
104M
   hi = m->nbAllocVectors - 1;
589
104M
   do
590
329M
   {
591
329M
      int done = 0;
592
329M
      int psum = 0;
593
329M
      int mid = (lo+hi) >> 1;
594
5.30G
      for (j=end;j-->start;)
595
4.97G
      {
596
4.97G
         int bitsj;
597
4.97G
         int N = m->eBands[j+1]-m->eBands[j];
598
4.97G
         bitsj = C*N*m->allocVectors[mid*len+j]<<LM>>2;
599
4.97G
         if (bitsj > 0)
600
4.64G
            bitsj = IMAX(0, bitsj + trim_offset[j]);
601
4.97G
         bitsj += offsets[j];
602
4.97G
         if (bitsj >= thresh[j] || done)
603
4.61G
         {
604
4.61G
            done = 1;
605
            /* Don't allocate more than we can actually use */
606
4.61G
            psum += IMIN(bitsj, cap[j]);
607
4.61G
         } else {
608
365M
            if (bitsj >= C<<BITRES)
609
17.3M
               psum += C<<BITRES;
610
365M
         }
611
4.97G
      }
612
329M
      if (psum > total)
613
267M
         hi = mid - 1;
614
61.8M
      else
615
61.8M
         lo = mid + 1;
616
      /*printf ("lo = %d, hi = %d\n", lo, hi);*/
617
329M
   }
618
329M
   while (lo <= hi);
619
104M
   hi = lo--;
620
   /*printf ("interp between %d and %d\n", lo, hi);*/
621
1.68G
   for (j=start;j<end;j++)
622
1.58G
   {
623
1.58G
      int bits1j, bits2j;
624
1.58G
      int N = m->eBands[j+1]-m->eBands[j];
625
1.58G
      bits1j = C*N*m->allocVectors[lo*len+j]<<LM>>2;
626
1.58G
      bits2j = hi>=m->nbAllocVectors ?
627
1.54G
            cap[j] : C*N*m->allocVectors[hi*len+j]<<LM>>2;
628
1.58G
      if (bits1j > 0)
629
405M
         bits1j = IMAX(0, bits1j + trim_offset[j]);
630
1.58G
      if (bits2j > 0)
631
1.39G
         bits2j = IMAX(0, bits2j + trim_offset[j]);
632
1.58G
      if (lo > 0)
633
424M
         bits1j += offsets[j];
634
1.58G
      bits2j += offsets[j];
635
1.58G
      if (offsets[j]>0)
636
3.33M
         skip_start = j;
637
1.58G
      bits2j = IMAX(0,bits2j-bits1j);
638
1.58G
      bits1[j] = bits1j;
639
1.58G
      bits2[j] = bits2j;
640
1.58G
   }
641
104M
   codedBands = interp_bits2pulses(m, start, end, skip_start, bits1, bits2, thresh, cap,
642
104M
         total, balance, skip_rsv, intensity, intensity_rsv, dual_stereo, dual_stereo_rsv,
643
104M
         pulses, ebits, fine_priority, C, LM, ec, encode, prev, signalBandwidth);
644
104M
   RESTORE_STACK;
645
104M
   return codedBands;
646
104M
}
647
#ifdef ENABLE_QEXT
648
649
static const unsigned char last_zero[3] = {64, 50, 0};
650
static const unsigned char last_cap[3] = {110, 60, 0};
651
static const unsigned char last_other[4] = {120, 112, 70, 0};
652
653
0
static void ec_enc_depth(ec_enc *enc, opus_int32 depth, opus_int32 cap, opus_int32 *last) {
654
0
   int sym = 3;
655
0
   if (depth==*last) sym = 2;
656
0
   if (depth==cap) sym = 1;
657
0
   if (depth==0) sym = 0;
658
0
   if (*last == 0) {
659
0
      ec_enc_icdf(enc, IMIN(sym, 2), last_zero, 7);
660
0
   } else if (*last == cap) {
661
0
      ec_enc_icdf(enc, IMIN(sym, 2), last_cap, 7);
662
0
   } else {
663
0
      ec_enc_icdf(enc, sym, last_other, 7);
664
0
   }
665
   /* We accept some redundancy if depth==last (for last different from 0 and cap). */
666
0
   if (sym == 3) ec_enc_uint(enc, depth-1, cap);
667
0
   *last = depth;
668
0
}
669
670
120k
static int ec_dec_depth(ec_dec *dec, opus_int32 cap, opus_int32 *last) {
671
120k
   int depth, sym;
672
120k
   if (*last == 0) {
673
43.5k
      sym = ec_dec_icdf(dec, last_zero, 7);
674
43.5k
      if (sym==2) sym=3;
675
76.6k
   } else if (*last == cap) {
676
13.8k
      sym = ec_dec_icdf(dec, last_cap, 7);
677
13.8k
      if (sym==2) sym=3;
678
62.7k
   } else {
679
62.7k
      sym = ec_dec_icdf(dec, last_other, 7);
680
62.7k
   }
681
120k
   if (sym==0) depth=0;
682
82.2k
   else if (sym==1) depth=cap;
683
69.7k
   else if (sym==2) depth=*last;
684
47.3k
   else depth = 1 + ec_dec_uint(dec, cap);
685
120k
   *last = depth;
686
120k
   return depth;
687
120k
}
688
689
0
#define MSWAP16(a,b) do {opus_val16 tmp = a;a=b;b=tmp;} while(0)
690
static opus_val16 median_of_5_val16(const opus_val16 *x)
691
0
{
692
0
   opus_val16 t0, t1, t2, t3, t4;
693
0
   t2 = x[2];
694
0
   if (x[0] > x[1])
695
0
   {
696
0
      t0 = x[1];
697
0
      t1 = x[0];
698
0
   } else {
699
0
      t0 = x[0];
700
0
      t1 = x[1];
701
0
   }
702
0
   if (x[3] > x[4])
703
0
   {
704
0
      t3 = x[4];
705
0
      t4 = x[3];
706
0
   } else {
707
0
      t3 = x[3];
708
0
      t4 = x[4];
709
0
   }
710
0
   if (t0 > t3)
711
0
   {
712
0
      MSWAP16(t0, t3);
713
0
      MSWAP16(t1, t4);
714
0
   }
715
0
   if (t2 > t1)
716
0
   {
717
0
      if (t1 < t3)
718
0
         return MIN16(t2, t3);
719
0
      else
720
0
         return MIN16(t4, t1);
721
0
   } else {
722
0
      if (t2 < t3)
723
0
         return MIN16(t1, t3);
724
0
      else
725
0
         return MIN16(t2, t4);
726
0
   }
727
0
}
728
729
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,
730
      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)
731
638k
{
732
638k
   int i;
733
638k
   opus_int32 last=0;
734
638k
   opus_val32 sum;
735
638k
   opus_val32 fill;
736
638k
   int iter;
737
638k
   int tot_bands;
738
638k
   int tot_samples;
739
638k
   VARDECL(int, depth);
740
638k
   VARDECL(opus_int32, cap);
741
#ifdef FUZZING
742
   float depth_std;
743
#endif
744
638k
   SAVE_STACK;
745
#ifdef FUZZING
746
   depth_std = -10.f*log(1e-8+(float)rand()/RAND_MAX);
747
   depth_std = FMAX(0, FMIN(48, depth_std));
748
#endif
749
638k
   if (qext_mode != NULL) {
750
15.2k
      celt_assert(end==m->nbEBands);
751
15.2k
      tot_bands = end + qext_end;
752
15.2k
      tot_samples = qext_mode->eBands[qext_end]*C<<LM;
753
623k
   } else {
754
623k
      tot_bands = end;
755
623k
      tot_samples = (m->eBands[end]-m->eBands[start])*C<<LM;
756
623k
   }
757
638k
   ALLOC(cap, tot_bands, opus_int32);
758
10.2M
   for (i=start;i<end;i++) cap[i] = 12;
759
638k
   if (qext_mode != NULL) {
760
95.8k
      for (i=0;i<qext_end;i++) cap[end+i] = 14;
761
15.2k
   }
762
638k
   if (total <= 0) {
763
12.9M
      for (i=start;i<m->nbEBands+qext_end;i++) {
764
12.2M
         extra_pulses[i] = extra_equant[i] = 0;
765
12.2M
      }
766
623k
      return;
767
623k
   }
768
15.4k
   ALLOC(depth, tot_bands, int);
769
15.4k
   if (encode) {
770
0
      VARDECL(opus_val16, flatE);
771
0
      VARDECL(int, Ncoef);
772
0
      VARDECL(opus_val16, min);
773
0
      VARDECL(opus_val16, follower);
774
775
0
      ALLOC(flatE, tot_bands, opus_val16);
776
0
      ALLOC(min, tot_bands, opus_val16);
777
0
      ALLOC(Ncoef, tot_bands, int);
778
0
      for (i=start;i<end;i++) {
779
0
         Ncoef[i] = (m->eBands[i+1]-m->eBands[i])*C<<LM;
780
0
      }
781
      /* Remove the effect of band width, eMeans and pre-emphasis to compute the real (flat) spectrum. */
782
0
      for (i=start;i<end;i++) {
783
0
         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);
784
0
         min[i] = 0;
785
0
      }
786
0
      if (C==2) {
787
0
         for (i=start;i<end;i++) {
788
0
            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));
789
0
         }
790
0
      }
791
0
      flatE[end-1] += QCONST16(2.f, 10);
792
0
      if (qext_mode != NULL) {
793
0
         opus_val16 min_depth = 0;
794
         /* If we have enough bits, give at least 1 bit of depth to all higher bands. */
795
0
         if (total >= 3*C*(qext_mode->eBands[qext_end]-qext_mode->eBands[start])<<LM<<BITRES && (toneishness < QCONST32(.98f, 29) || tone_freq > 1.33f))
796
0
            min_depth = QCONST16(1.f, 10);
797
0
         for (i=0;i<qext_end;i++) {
798
0
            Ncoef[end+i] = (qext_mode->eBands[i+1]-qext_mode->eBands[i])*C<<LM;
799
0
            min[end+i] = min_depth;
800
0
         }
801
0
         for (i=0;i<qext_end;i++) {
802
0
            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);
803
0
         }
804
0
         if (C==2) {
805
0
            for (i=0;i<qext_end;i++) {
806
0
               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));
807
0
            }
808
0
         }
809
0
      }
810
0
      ALLOC(follower, tot_bands, opus_val16);
811
0
      for (i=start+2;i<tot_bands-2;i++) {
812
0
         follower[i] = median_of_5_val16(&flatE[i-2]);
813
0
      }
814
0
      follower[start] = follower[start+1] = follower[start+2];
815
0
      follower[tot_bands-1] = follower[tot_bands-2] = follower[tot_bands-3];
816
0
      for (i=start+1;i<tot_bands;i++) {
817
0
         follower[i] = MAX16(follower[i], follower[i-1]-QCONST16(1.f, 10));
818
0
      }
819
0
      for (i=tot_bands-2;i>=start;i--) {
820
0
         follower[i] = MAX16(follower[i], follower[i+1]-QCONST16(1.f, 10));
821
0
      }
822
0
      for (i=start;i<tot_bands;i++) flatE[i] -= MULT16_16_Q15(Q15ONE-PSHR32(toneishness, 14), follower[i]);
823
0
      if (qext_mode != NULL) {
824
0
         for (i=0;i<qext_end;i++) flatE[end+i] = flatE[end+i] + QCONST16(3.f, 10) + QCONST16(.2f, 10)*i;
825
0
      }
826
      /* Approximate fill level assuming all bands contribute fully. */
827
0
      sum = 0;
828
0
      for (i=start;i<tot_bands;i++) {
829
0
         sum += MULT16_16(Ncoef[i], flatE[i]);
830
0
      }
831
0
      total >>= BITRES;
832
0
      fill = (SHL32(total, 10) + sum)/tot_samples;
833
      /* Iteratively refine the fill level considering the depth min and cap. */
834
0
      for (iter=0;iter<10;iter++) {
835
0
         sum = 0;
836
0
         for (i=start;i<tot_bands;i++)
837
0
            sum += Ncoef[i] * MIN32(SHL32(cap[i], 10), MAX32(min[i], flatE[i]-fill));
838
0
         fill -= (SHL32(total, 10) - sum)/tot_samples;
839
0
      }
840
0
      for (i=start;i<tot_bands;i++) {
841
#ifdef FIXED_POINT
842
0
         depth[i] = PSHR32(MIN32(SHL32(cap[i], 10), MAX32(min[i], flatE[i]-fill)), 10-2);
843
#else
844
0
         depth[i] = (int)floor(.5+4*MIN32(SHL32(cap[i], 10), MAX32(min[i], flatE[i]-fill)));
845
#endif
846
#ifdef FUZZING
847
         depth[i] = (int)-depth_std*log(1e-8+(float)rand()/RAND_MAX);
848
         depth[i] = IMAX(0, IMIN(cap[i]<<2, depth[i]));
849
#endif
850
0
         if (ec_tell_frac(ec) + 80 < ec->storage*8<<BITRES)
851
0
            ec_enc_depth(ec, depth[i], 4*cap[i], &last);
852
0
         else
853
0
            depth[i] = 0;
854
0
      }
855
15.4k
   } else {
856
339k
      for (i=start;i<tot_bands;i++) {
857
323k
         if (ec_tell_frac(ec) + 80 < ec->storage*8<<BITRES)
858
240k
            depth[i] = ec_dec_depth(ec, 4*cap[i], &last);
859
83.3k
         else
860
83.3k
            depth[i] = 0;
861
323k
      }
862
15.4k
   }
863
282k
   for (i=start;i<end;i++) {
864
266k
      extra_equant[i] = (depth[i]+3)>>2;
865
266k
      extra_pulses[i] = ((((m->eBands[i+1]-m->eBands[i])<<LM)-1)*C * depth[i] * (1<<BITRES) + 2)>>2;
866
266k
   }
867
15.4k
   if (qext_mode) {
868
67.4k
      for (i=0;i<qext_end;i++) {
869
56.9k
         extra_equant[end+i] = (depth[end+i]+3)>>2;
870
56.9k
         extra_pulses[end+i] = ((((qext_mode->eBands[i+1]-qext_mode->eBands[i])<<LM)-1)*C * depth[end+i] * (1<<BITRES) + 2)>>2;
871
56.9k
      }
872
10.5k
   }
873
15.4k
}
clt_compute_extra_allocation
Line
Count
Source
731
319k
{
732
319k
   int i;
733
319k
   opus_int32 last=0;
734
319k
   opus_val32 sum;
735
319k
   opus_val32 fill;
736
319k
   int iter;
737
319k
   int tot_bands;
738
319k
   int tot_samples;
739
319k
   VARDECL(int, depth);
740
319k
   VARDECL(opus_int32, cap);
741
#ifdef FUZZING
742
   float depth_std;
743
#endif
744
319k
   SAVE_STACK;
745
#ifdef FUZZING
746
   depth_std = -10.f*log(1e-8+(float)rand()/RAND_MAX);
747
   depth_std = FMAX(0, FMIN(48, depth_std));
748
#endif
749
319k
   if (qext_mode != NULL) {
750
7.62k
      celt_assert(end==m->nbEBands);
751
7.62k
      tot_bands = end + qext_end;
752
7.62k
      tot_samples = qext_mode->eBands[qext_end]*C<<LM;
753
311k
   } else {
754
311k
      tot_bands = end;
755
311k
      tot_samples = (m->eBands[end]-m->eBands[start])*C<<LM;
756
311k
   }
757
319k
   ALLOC(cap, tot_bands, opus_int32);
758
5.12M
   for (i=start;i<end;i++) cap[i] = 12;
759
319k
   if (qext_mode != NULL) {
760
47.9k
      for (i=0;i<qext_end;i++) cap[end+i] = 14;
761
7.62k
   }
762
319k
   if (total <= 0) {
763
6.45M
      for (i=start;i<m->nbEBands+qext_end;i++) {
764
6.14M
         extra_pulses[i] = extra_equant[i] = 0;
765
6.14M
      }
766
311k
      return;
767
311k
   }
768
7.70k
   ALLOC(depth, tot_bands, int);
769
7.70k
   if (encode) {
770
0
      VARDECL(opus_val16, flatE);
771
0
      VARDECL(int, Ncoef);
772
0
      VARDECL(opus_val16, min);
773
0
      VARDECL(opus_val16, follower);
774
775
0
      ALLOC(flatE, tot_bands, opus_val16);
776
0
      ALLOC(min, tot_bands, opus_val16);
777
0
      ALLOC(Ncoef, tot_bands, int);
778
0
      for (i=start;i<end;i++) {
779
0
         Ncoef[i] = (m->eBands[i+1]-m->eBands[i])*C<<LM;
780
0
      }
781
      /* Remove the effect of band width, eMeans and pre-emphasis to compute the real (flat) spectrum. */
782
0
      for (i=start;i<end;i++) {
783
0
         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);
784
0
         min[i] = 0;
785
0
      }
786
0
      if (C==2) {
787
0
         for (i=start;i<end;i++) {
788
0
            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));
789
0
         }
790
0
      }
791
0
      flatE[end-1] += QCONST16(2.f, 10);
792
0
      if (qext_mode != NULL) {
793
0
         opus_val16 min_depth = 0;
794
         /* If we have enough bits, give at least 1 bit of depth to all higher bands. */
795
0
         if (total >= 3*C*(qext_mode->eBands[qext_end]-qext_mode->eBands[start])<<LM<<BITRES && (toneishness < QCONST32(.98f, 29) || tone_freq > 1.33f))
796
0
            min_depth = QCONST16(1.f, 10);
797
0
         for (i=0;i<qext_end;i++) {
798
0
            Ncoef[end+i] = (qext_mode->eBands[i+1]-qext_mode->eBands[i])*C<<LM;
799
0
            min[end+i] = min_depth;
800
0
         }
801
0
         for (i=0;i<qext_end;i++) {
802
0
            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);
803
0
         }
804
0
         if (C==2) {
805
0
            for (i=0;i<qext_end;i++) {
806
0
               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));
807
0
            }
808
0
         }
809
0
      }
810
0
      ALLOC(follower, tot_bands, opus_val16);
811
0
      for (i=start+2;i<tot_bands-2;i++) {
812
0
         follower[i] = median_of_5_val16(&flatE[i-2]);
813
0
      }
814
0
      follower[start] = follower[start+1] = follower[start+2];
815
0
      follower[tot_bands-1] = follower[tot_bands-2] = follower[tot_bands-3];
816
0
      for (i=start+1;i<tot_bands;i++) {
817
0
         follower[i] = MAX16(follower[i], follower[i-1]-QCONST16(1.f, 10));
818
0
      }
819
0
      for (i=tot_bands-2;i>=start;i--) {
820
0
         follower[i] = MAX16(follower[i], follower[i+1]-QCONST16(1.f, 10));
821
0
      }
822
0
      for (i=start;i<tot_bands;i++) flatE[i] -= MULT16_16_Q15(Q15ONE-PSHR32(toneishness, 14), follower[i]);
823
0
      if (qext_mode != NULL) {
824
0
         for (i=0;i<qext_end;i++) flatE[end+i] = flatE[end+i] + QCONST16(3.f, 10) + QCONST16(.2f, 10)*i;
825
0
      }
826
      /* Approximate fill level assuming all bands contribute fully. */
827
0
      sum = 0;
828
0
      for (i=start;i<tot_bands;i++) {
829
0
         sum += MULT16_16(Ncoef[i], flatE[i]);
830
0
      }
831
0
      total >>= BITRES;
832
0
      fill = (SHL32(total, 10) + sum)/tot_samples;
833
      /* Iteratively refine the fill level considering the depth min and cap. */
834
0
      for (iter=0;iter<10;iter++) {
835
0
         sum = 0;
836
0
         for (i=start;i<tot_bands;i++)
837
0
            sum += Ncoef[i] * MIN32(SHL32(cap[i], 10), MAX32(min[i], flatE[i]-fill));
838
0
         fill -= (SHL32(total, 10) - sum)/tot_samples;
839
0
      }
840
0
      for (i=start;i<tot_bands;i++) {
841
0
#ifdef FIXED_POINT
842
0
         depth[i] = PSHR32(MIN32(SHL32(cap[i], 10), MAX32(min[i], flatE[i]-fill)), 10-2);
843
#else
844
         depth[i] = (int)floor(.5+4*MIN32(SHL32(cap[i], 10), MAX32(min[i], flatE[i]-fill)));
845
#endif
846
#ifdef FUZZING
847
         depth[i] = (int)-depth_std*log(1e-8+(float)rand()/RAND_MAX);
848
         depth[i] = IMAX(0, IMIN(cap[i]<<2, depth[i]));
849
#endif
850
0
         if (ec_tell_frac(ec) + 80 < ec->storage*8<<BITRES)
851
0
            ec_enc_depth(ec, depth[i], 4*cap[i], &last);
852
0
         else
853
0
            depth[i] = 0;
854
0
      }
855
7.70k
   } else {
856
169k
      for (i=start;i<tot_bands;i++) {
857
161k
         if (ec_tell_frac(ec) + 80 < ec->storage*8<<BITRES)
858
120k
            depth[i] = ec_dec_depth(ec, 4*cap[i], &last);
859
41.6k
         else
860
41.6k
            depth[i] = 0;
861
161k
      }
862
7.70k
   }
863
141k
   for (i=start;i<end;i++) {
864
133k
      extra_equant[i] = (depth[i]+3)>>2;
865
133k
      extra_pulses[i] = ((((m->eBands[i+1]-m->eBands[i])<<LM)-1)*C * depth[i] * (1<<BITRES) + 2)>>2;
866
133k
   }
867
7.70k
   if (qext_mode) {
868
33.7k
      for (i=0;i<qext_end;i++) {
869
28.4k
         extra_equant[end+i] = (depth[end+i]+3)>>2;
870
28.4k
         extra_pulses[end+i] = ((((qext_mode->eBands[i+1]-qext_mode->eBands[i])<<LM)-1)*C * depth[end+i] * (1<<BITRES) + 2)>>2;
871
28.4k
      }
872
5.26k
   }
873
7.70k
}
clt_compute_extra_allocation
Line
Count
Source
731
319k
{
732
319k
   int i;
733
319k
   opus_int32 last=0;
734
319k
   opus_val32 sum;
735
319k
   opus_val32 fill;
736
319k
   int iter;
737
319k
   int tot_bands;
738
319k
   int tot_samples;
739
319k
   VARDECL(int, depth);
740
319k
   VARDECL(opus_int32, cap);
741
#ifdef FUZZING
742
   float depth_std;
743
#endif
744
319k
   SAVE_STACK;
745
#ifdef FUZZING
746
   depth_std = -10.f*log(1e-8+(float)rand()/RAND_MAX);
747
   depth_std = FMAX(0, FMIN(48, depth_std));
748
#endif
749
319k
   if (qext_mode != NULL) {
750
7.62k
      celt_assert(end==m->nbEBands);
751
7.62k
      tot_bands = end + qext_end;
752
7.62k
      tot_samples = qext_mode->eBands[qext_end]*C<<LM;
753
311k
   } else {
754
311k
      tot_bands = end;
755
311k
      tot_samples = (m->eBands[end]-m->eBands[start])*C<<LM;
756
311k
   }
757
319k
   ALLOC(cap, tot_bands, opus_int32);
758
5.12M
   for (i=start;i<end;i++) cap[i] = 12;
759
319k
   if (qext_mode != NULL) {
760
47.9k
      for (i=0;i<qext_end;i++) cap[end+i] = 14;
761
7.62k
   }
762
319k
   if (total <= 0) {
763
6.45M
      for (i=start;i<m->nbEBands+qext_end;i++) {
764
6.14M
         extra_pulses[i] = extra_equant[i] = 0;
765
6.14M
      }
766
311k
      return;
767
311k
   }
768
7.70k
   ALLOC(depth, tot_bands, int);
769
7.70k
   if (encode) {
770
0
      VARDECL(opus_val16, flatE);
771
0
      VARDECL(int, Ncoef);
772
0
      VARDECL(opus_val16, min);
773
0
      VARDECL(opus_val16, follower);
774
775
0
      ALLOC(flatE, tot_bands, opus_val16);
776
0
      ALLOC(min, tot_bands, opus_val16);
777
0
      ALLOC(Ncoef, tot_bands, int);
778
0
      for (i=start;i<end;i++) {
779
0
         Ncoef[i] = (m->eBands[i+1]-m->eBands[i])*C<<LM;
780
0
      }
781
      /* Remove the effect of band width, eMeans and pre-emphasis to compute the real (flat) spectrum. */
782
0
      for (i=start;i<end;i++) {
783
0
         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);
784
0
         min[i] = 0;
785
0
      }
786
0
      if (C==2) {
787
0
         for (i=start;i<end;i++) {
788
0
            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));
789
0
         }
790
0
      }
791
0
      flatE[end-1] += QCONST16(2.f, 10);
792
0
      if (qext_mode != NULL) {
793
0
         opus_val16 min_depth = 0;
794
         /* If we have enough bits, give at least 1 bit of depth to all higher bands. */
795
0
         if (total >= 3*C*(qext_mode->eBands[qext_end]-qext_mode->eBands[start])<<LM<<BITRES && (toneishness < QCONST32(.98f, 29) || tone_freq > 1.33f))
796
0
            min_depth = QCONST16(1.f, 10);
797
0
         for (i=0;i<qext_end;i++) {
798
0
            Ncoef[end+i] = (qext_mode->eBands[i+1]-qext_mode->eBands[i])*C<<LM;
799
0
            min[end+i] = min_depth;
800
0
         }
801
0
         for (i=0;i<qext_end;i++) {
802
0
            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);
803
0
         }
804
0
         if (C==2) {
805
0
            for (i=0;i<qext_end;i++) {
806
0
               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));
807
0
            }
808
0
         }
809
0
      }
810
0
      ALLOC(follower, tot_bands, opus_val16);
811
0
      for (i=start+2;i<tot_bands-2;i++) {
812
0
         follower[i] = median_of_5_val16(&flatE[i-2]);
813
0
      }
814
0
      follower[start] = follower[start+1] = follower[start+2];
815
0
      follower[tot_bands-1] = follower[tot_bands-2] = follower[tot_bands-3];
816
0
      for (i=start+1;i<tot_bands;i++) {
817
0
         follower[i] = MAX16(follower[i], follower[i-1]-QCONST16(1.f, 10));
818
0
      }
819
0
      for (i=tot_bands-2;i>=start;i--) {
820
0
         follower[i] = MAX16(follower[i], follower[i+1]-QCONST16(1.f, 10));
821
0
      }
822
0
      for (i=start;i<tot_bands;i++) flatE[i] -= MULT16_16_Q15(Q15ONE-PSHR32(toneishness, 14), follower[i]);
823
0
      if (qext_mode != NULL) {
824
0
         for (i=0;i<qext_end;i++) flatE[end+i] = flatE[end+i] + QCONST16(3.f, 10) + QCONST16(.2f, 10)*i;
825
0
      }
826
      /* Approximate fill level assuming all bands contribute fully. */
827
0
      sum = 0;
828
0
      for (i=start;i<tot_bands;i++) {
829
0
         sum += MULT16_16(Ncoef[i], flatE[i]);
830
0
      }
831
0
      total >>= BITRES;
832
0
      fill = (SHL32(total, 10) + sum)/tot_samples;
833
      /* Iteratively refine the fill level considering the depth min and cap. */
834
0
      for (iter=0;iter<10;iter++) {
835
0
         sum = 0;
836
0
         for (i=start;i<tot_bands;i++)
837
0
            sum += Ncoef[i] * MIN32(SHL32(cap[i], 10), MAX32(min[i], flatE[i]-fill));
838
0
         fill -= (SHL32(total, 10) - sum)/tot_samples;
839
0
      }
840
0
      for (i=start;i<tot_bands;i++) {
841
#ifdef FIXED_POINT
842
         depth[i] = PSHR32(MIN32(SHL32(cap[i], 10), MAX32(min[i], flatE[i]-fill)), 10-2);
843
#else
844
0
         depth[i] = (int)floor(.5+4*MIN32(SHL32(cap[i], 10), MAX32(min[i], flatE[i]-fill)));
845
0
#endif
846
#ifdef FUZZING
847
         depth[i] = (int)-depth_std*log(1e-8+(float)rand()/RAND_MAX);
848
         depth[i] = IMAX(0, IMIN(cap[i]<<2, depth[i]));
849
#endif
850
0
         if (ec_tell_frac(ec) + 80 < ec->storage*8<<BITRES)
851
0
            ec_enc_depth(ec, depth[i], 4*cap[i], &last);
852
0
         else
853
0
            depth[i] = 0;
854
0
      }
855
7.70k
   } else {
856
169k
      for (i=start;i<tot_bands;i++) {
857
161k
         if (ec_tell_frac(ec) + 80 < ec->storage*8<<BITRES)
858
120k
            depth[i] = ec_dec_depth(ec, 4*cap[i], &last);
859
41.6k
         else
860
41.6k
            depth[i] = 0;
861
161k
      }
862
7.70k
   }
863
141k
   for (i=start;i<end;i++) {
864
133k
      extra_equant[i] = (depth[i]+3)>>2;
865
133k
      extra_pulses[i] = ((((m->eBands[i+1]-m->eBands[i])<<LM)-1)*C * depth[i] * (1<<BITRES) + 2)>>2;
866
133k
   }
867
7.70k
   if (qext_mode) {
868
33.7k
      for (i=0;i<qext_end;i++) {
869
28.4k
         extra_equant[end+i] = (depth[end+i]+3)>>2;
870
28.4k
         extra_pulses[end+i] = ((((qext_mode->eBands[i+1]-qext_mode->eBands[i])<<LM)-1)*C * depth[end+i] * (1<<BITRES) + 2)>>2;
871
28.4k
      }
872
5.26k
   }
873
7.70k
}
874
#endif