Coverage Report

Created: 2026-01-10 07:33

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
20.7G
#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
185M
{
254
185M
   opus_int32 psum;
255
185M
   int lo, hi;
256
185M
   int i, j;
257
185M
   int logM;
258
185M
   int stereo;
259
185M
   int codedBands=-1;
260
185M
   int alloc_floor;
261
185M
   opus_int32 left, percoeff;
262
185M
   int done;
263
185M
   opus_int32 balance;
264
185M
   SAVE_STACK;
265
266
185M
   alloc_floor = C<<BITRES;
267
185M
   stereo = C>1;
268
269
185M
   logM = LM<<BITRES;
270
185M
   lo = 0;
271
185M
   hi = 1<<ALLOC_STEPS;
272
1.29G
   for (i=0;i<ALLOC_STEPS;i++)
273
1.11G
   {
274
1.11G
      int mid = (lo+hi)>>1;
275
1.11G
      psum = 0;
276
1.11G
      done = 0;
277
17.6G
      for (j=end;j-->start;)
278
16.5G
      {
279
16.5G
         int tmp = bits1[j] + (mid*(opus_int32)bits2[j]>>ALLOC_STEPS);
280
16.5G
         if (tmp >= thresh[j] || done)
281
7.12G
         {
282
7.12G
            done = 1;
283
            /* Don't allocate more than we can actually use */
284
7.12G
            psum += IMIN(tmp, cap[j]);
285
9.43G
         } else {
286
9.43G
            if (tmp >= alloc_floor)
287
253M
               psum += alloc_floor;
288
9.43G
         }
289
16.5G
      }
290
1.11G
      if (psum > total)
291
500M
         hi = mid;
292
613M
      else
293
613M
         lo = mid;
294
1.11G
   }
295
185M
   psum = 0;
296
   /*printf ("interp bisection gave %d\n", lo);*/
297
185M
   done = 0;
298
2.94G
   for (j=end;j-->start;)
299
2.75G
   {
300
2.75G
      int tmp = bits1[j] + ((opus_int32)lo*bits2[j]>>ALLOC_STEPS);
301
2.75G
      if (tmp < thresh[j] && !done)
302
1.99G
      {
303
1.99G
         if (tmp >= alloc_floor)
304
9.33M
            tmp = alloc_floor;
305
1.98G
         else
306
1.98G
            tmp = 0;
307
1.99G
      } else
308
762M
         done = 1;
309
      /* Don't allocate more than we can actually use */
310
2.75G
      tmp = IMIN(tmp, cap[j]);
311
2.75G
      bits[j] = tmp;
312
2.75G
      psum += tmp;
313
2.75G
   }
314
315
   /* Decide which bands to skip, working backwards from the end. */
316
1.93G
   for (codedBands=end;;codedBands--)
317
2.12G
   {
318
2.12G
      int band_width;
319
2.12G
      int band_bits;
320
2.12G
      int rem;
321
2.12G
      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
2.12G
      if (j<=skip_start)
329
132M
      {
330
         /* Give the bit we reserved to end skipping back. */
331
132M
         total += skip_rsv;
332
132M
         break;
333
132M
      }
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.98G
      left = total-psum;
337
1.98G
      percoeff = celt_udiv(left, m->eBands[codedBands]-m->eBands[start]);
338
1.98G
      left -= (m->eBands[codedBands]-m->eBands[start])*percoeff;
339
1.98G
      rem = IMAX(left-(m->eBands[j]-m->eBands[start]),0);
340
1.98G
      band_width = m->eBands[codedBands]-m->eBands[j];
341
1.98G
      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.98G
      if (band_bits >= IMAX(thresh[j], alloc_floor+(1<<BITRES)))
346
55.7M
      {
347
55.7M
         if (encode)
348
55.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
55.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
55.3M
            if (codedBands > 17)
356
9.61M
               depth_threshold = j<prev ? 7 : 9;
357
45.7M
            else
358
45.7M
               depth_threshold = 0;
359
#ifdef FUZZING
360
            (void)signalBandwidth;
361
            (void)depth_threshold;
362
            if ((rand()&0x1) == 0)
363
#else
364
55.3M
            if (codedBands<=start+2 || (band_bits > (depth_threshold*band_width<<LM<<BITRES)>>4 && j<=signalBandwidth))
365
52.8M
#endif
366
52.8M
            {
367
52.8M
               ec_enc_bit_logp(ec, 1, 1);
368
52.8M
               break;
369
52.8M
            }
370
2.51M
            ec_enc_bit_logp(ec, 0, 1);
371
2.51M
         } 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.76M
         psum += 1<<BITRES;
376
2.76M
         band_bits -= 1<<BITRES;
377
2.76M
      }
378
      /*Reclaim the bits originally allocated to this band.*/
379
1.93G
      psum -= bits[j]+intensity_rsv;
380
1.93G
      if (intensity_rsv > 0)
381
68.4M
         intensity_rsv = LOG2_FRAC_TABLE[j-start];
382
1.93G
      psum += intensity_rsv;
383
1.93G
      if (band_bits >= alloc_floor)
384
56.4M
      {
385
         /*If we have enough for a fine energy bit per channel, use it.*/
386
56.4M
         psum += alloc_floor;
387
56.4M
         bits[j] = alloc_floor;
388
1.87G
      } else {
389
         /*Otherwise this band gets nothing at all.*/
390
1.87G
         bits[j] = 0;
391
1.87G
      }
392
1.93G
   }
393
394
185M
   celt_assert(codedBands > start);
395
   /* Code the intensity and dual stereo parameters. */
396
185M
   if (intensity_rsv > 0)
397
16.4M
   {
398
16.4M
      if (encode)
399
16.3M
      {
400
16.3M
         *intensity = IMIN(*intensity, codedBands);
401
16.3M
         ec_enc_uint(ec, *intensity-start, codedBands+1-start);
402
16.3M
      }
403
36.8k
      else
404
36.8k
         *intensity = start+ec_dec_uint(ec, codedBands+1-start);
405
16.4M
   }
406
169M
   else
407
169M
      *intensity = 0;
408
185M
   if (*intensity <= start)
409
169M
   {
410
169M
      total += dual_stereo_rsv;
411
169M
      dual_stereo_rsv = 0;
412
169M
   }
413
185M
   if (dual_stereo_rsv > 0)
414
15.7M
   {
415
15.7M
      if (encode)
416
15.7M
         ec_enc_bit_logp(ec, *dual_stereo, 1);
417
31.9k
      else
418
31.9k
         *dual_stereo = ec_dec_bit_logp(ec, 1);
419
15.7M
   }
420
169M
   else
421
169M
      *dual_stereo = 0;
422
423
   /* Allocate the remaining bits */
424
185M
   left = total-psum;
425
185M
   percoeff = celt_udiv(left, m->eBands[codedBands]-m->eBands[start]);
426
185M
   left -= (m->eBands[codedBands]-m->eBands[start])*percoeff;
427
1.00G
   for (j=start;j<codedBands;j++)
428
823M
      bits[j] += ((int)percoeff*(m->eBands[j+1]-m->eBands[j]));
429
1.00G
   for (j=start;j<codedBands;j++)
430
823M
   {
431
823M
      int tmp = (int)IMIN(left, m->eBands[j+1]-m->eBands[j]);
432
823M
      bits[j] += tmp;
433
823M
      left -= tmp;
434
823M
   }
435
   /*for (j=0;j<end;j++)printf("%d ", bits[j]);printf("\n");*/
436
437
185M
   balance = 0;
438
1.00G
   for (j=start;j<codedBands;j++)
439
823M
   {
440
823M
      int N0, N, den;
441
823M
      int offset;
442
823M
      int NClogN;
443
823M
      opus_int32 excess, bit;
444
445
823M
      celt_assert(bits[j] >= 0);
446
823M
      N0 = m->eBands[j+1]-m->eBands[j];
447
823M
      N=N0<<LM;
448
823M
      bit = (opus_int32)bits[j]+balance;
449
450
823M
      if (N>1)
451
562M
      {
452
562M
         excess = MAX32(bit-cap[j],0);
453
562M
         bits[j] = bit-excess;
454
455
         /* Compensate for the extra DoF in stereo */
456
562M
         den=(C*N+ ((C==2 && N>2 && !*dual_stereo && j<*intensity) ? 1 : 0));
457
458
562M
         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
562M
         offset = (NClogN>>1)-den*FINE_OFFSET;
463
464
         /* N=2 is the only point that doesn't match the curve */
465
562M
         if (N==2)
466
198M
            offset += den<<BITRES>>2;
467
468
         /* Changing the offset for allocating the second and third
469
             fine energy bit */
470
562M
         if (bits[j] + offset < den*2<<BITRES)
471
454M
            offset += NClogN>>2;
472
108M
         else if (bits[j] + offset < den*3<<BITRES)
473
43.1M
            offset += NClogN>>3;
474
475
         /* Divide with rounding */
476
562M
         ebits[j] = IMAX(0, (bits[j] + offset + (den<<(BITRES-1))));
477
562M
         ebits[j] = celt_udiv(ebits[j], den)>>BITRES;
478
479
         /* Make sure not to bust */
480
562M
         if (C*ebits[j] > (bits[j]>>BITRES))
481
80.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
562M
         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
562M
         fine_priority[j] = ebits[j]*(den<<BITRES) >= bits[j]+offset;
489
490
         /* Remove the allocated fine bits; the rest are assigned to PVQ */
491
562M
         bits[j] -= C*ebits[j]<<BITRES;
492
493
562M
      } else {
494
         /* For N=1, all bits go to fine energy except for a single sign bit */
495
260M
         excess = MAX32(0,bit-(C<<BITRES));
496
260M
         bits[j] = bit-excess;
497
260M
         ebits[j] = 0;
498
260M
         fine_priority[j] = 1;
499
260M
      }
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
823M
      if(excess > 0)
505
183M
      {
506
183M
         int extra_fine;
507
183M
         int extra_bits;
508
183M
         extra_fine = IMIN(excess>>(stereo+BITRES),MAX_FINE_BITS-ebits[j]);
509
183M
         ebits[j] += extra_fine;
510
183M
         extra_bits = extra_fine*C<<BITRES;
511
183M
         fine_priority[j] = extra_bits >= excess-balance;
512
183M
         excess -= extra_bits;
513
183M
      }
514
823M
      balance = excess;
515
516
823M
      celt_assert(bits[j] >= 0);
517
823M
      celt_assert(ebits[j] >= 0);
518
823M
   }
519
   /* Save any remaining bits over the cap for the rebalancing in
520
       quant_all_bands(). */
521
185M
   *_balance = balance;
522
523
   /* The skipped bands use all their bits for fine energy. */
524
2.12G
   for (;j<end;j++)
525
1.93G
   {
526
1.93G
      ebits[j] = bits[j] >> stereo >> BITRES;
527
1.93G
      celt_assert(C*ebits[j]<<BITRES == bits[j]);
528
1.93G
      bits[j] = 0;
529
1.93G
      fine_priority[j] = ebits[j]<1;
530
1.93G
   }
531
185M
   RESTORE_STACK;
532
185M
   return codedBands;
533
185M
}
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
185M
{
538
185M
   int lo, hi, len, j;
539
185M
   int codedBands;
540
185M
   int skip_start;
541
185M
   int skip_rsv;
542
185M
   int intensity_rsv;
543
185M
   int dual_stereo_rsv;
544
185M
   VARDECL(int, bits1);
545
185M
   VARDECL(int, bits2);
546
185M
   VARDECL(int, thresh);
547
185M
   VARDECL(int, trim_offset);
548
185M
   SAVE_STACK;
549
550
185M
   total = IMAX(total, 0);
551
185M
   len = m->nbEBands;
552
185M
   skip_start = start;
553
   /* Reserve a bit to signal the end of manually skipped bands. */
554
185M
   skip_rsv = total >= 1<<BITRES ? 1<<BITRES : 0;
555
185M
   total -= skip_rsv;
556
   /* Reserve bits for the intensity and dual stereo parameters. */
557
185M
   intensity_rsv = dual_stereo_rsv = 0;
558
185M
   if (C==2)
559
47.1M
   {
560
47.1M
      intensity_rsv = LOG2_FRAC_TABLE[end-start];
561
47.1M
      if (intensity_rsv>total)
562
30.7M
         intensity_rsv = 0;
563
16.4M
      else
564
16.4M
      {
565
16.4M
         total -= intensity_rsv;
566
16.4M
         dual_stereo_rsv = total>=1<<BITRES ? 1<<BITRES : 0;
567
16.4M
         total -= dual_stereo_rsv;
568
16.4M
      }
569
47.1M
   }
570
185M
   ALLOC(bits1, len, int);
571
185M
   ALLOC(bits2, len, int);
572
185M
   ALLOC(thresh, len, int);
573
185M
   ALLOC(trim_offset, len, int);
574
575
2.94G
   for (j=start;j<end;j++)
576
2.75G
   {
577
      /* Below this threshold, we're sure not to allocate any PVQ bits */
578
2.75G
      thresh[j] = IMAX((C)<<BITRES, (3*(m->eBands[j+1]-m->eBands[j])<<LM<<BITRES)>>4);
579
      /* Tilt of the allocation curve */
580
2.75G
      trim_offset[j] = C*(m->eBands[j+1]-m->eBands[j])*(alloc_trim-5-LM)*(end-j-1)
581
2.75G
            *(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
2.75G
      if ((m->eBands[j+1]-m->eBands[j])<<LM==1)
585
839M
         trim_offset[j] -= C<<BITRES;
586
2.75G
   }
587
185M
   lo = 1;
588
185M
   hi = m->nbAllocVectors - 1;
589
185M
   do
590
579M
   {
591
579M
      int done = 0;
592
579M
      int psum = 0;
593
579M
      int mid = (lo+hi) >> 1;
594
9.17G
      for (j=end;j-->start;)
595
8.59G
      {
596
8.59G
         int bitsj;
597
8.59G
         int N = m->eBands[j+1]-m->eBands[j];
598
8.59G
         bitsj = C*N*m->allocVectors[mid*len+j]<<LM>>2;
599
8.59G
         if (bitsj > 0)
600
8.09G
            bitsj = IMAX(0, bitsj + trim_offset[j]);
601
8.59G
         bitsj += offsets[j];
602
8.59G
         if (bitsj >= thresh[j] || done)
603
8.04G
         {
604
8.04G
            done = 1;
605
            /* Don't allocate more than we can actually use */
606
8.04G
            psum += IMIN(bitsj, cap[j]);
607
8.04G
         } else {
608
550M
            if (bitsj >= C<<BITRES)
609
31.1M
               psum += C<<BITRES;
610
550M
         }
611
8.59G
      }
612
579M
      if (psum > total)
613
487M
         hi = mid - 1;
614
91.1M
      else
615
91.1M
         lo = mid + 1;
616
      /*printf ("lo = %d, hi = %d\n", lo, hi);*/
617
579M
   }
618
579M
   while (lo <= hi);
619
185M
   hi = lo--;
620
   /*printf ("interp between %d and %d\n", lo, hi);*/
621
2.94G
   for (j=start;j<end;j++)
622
2.75G
   {
623
2.75G
      int bits1j, bits2j;
624
2.75G
      int N = m->eBands[j+1]-m->eBands[j];
625
2.75G
      bits1j = C*N*m->allocVectors[lo*len+j]<<LM>>2;
626
2.75G
      bits2j = hi>=m->nbAllocVectors ?
627
2.70G
            cap[j] : C*N*m->allocVectors[hi*len+j]<<LM>>2;
628
2.75G
      if (bits1j > 0)
629
628M
         bits1j = IMAX(0, bits1j + trim_offset[j]);
630
2.75G
      if (bits2j > 0)
631
2.47G
         bits2j = IMAX(0, bits2j + trim_offset[j]);
632
2.75G
      if (lo > 0)
633
657M
         bits1j += offsets[j];
634
2.75G
      bits2j += offsets[j];
635
2.75G
      if (offsets[j]>0)
636
5.25M
         skip_start = j;
637
2.75G
      bits2j = IMAX(0,bits2j-bits1j);
638
2.75G
      bits1[j] = bits1j;
639
2.75G
      bits2[j] = bits2j;
640
2.75G
   }
641
185M
   codedBands = interp_bits2pulses(m, start, end, skip_start, bits1, bits2, thresh, cap,
642
185M
         total, balance, skip_rsv, intensity, intensity_rsv, dual_stereo, dual_stereo_rsv,
643
185M
         pulses, ebits, fine_priority, C, LM, ec, encode, prev, signalBandwidth);
644
185M
   RESTORE_STACK;
645
185M
   return codedBands;
646
185M
}
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
2.84M
static void ec_enc_depth(ec_enc *enc, opus_int32 depth, opus_int32 cap, opus_int32 *last) {
654
2.84M
   int sym = 3;
655
2.84M
   if (depth==*last) sym = 2;
656
2.84M
   if (depth==cap) sym = 1;
657
2.84M
   if (depth==0) sym = 0;
658
2.84M
   if (*last == 0) {
659
2.30M
      ec_enc_icdf(enc, IMIN(sym, 2), last_zero, 7);
660
2.30M
   } else if (*last == cap) {
661
69
      ec_enc_icdf(enc, IMIN(sym, 2), last_cap, 7);
662
538k
   } else {
663
538k
      ec_enc_icdf(enc, sym, last_other, 7);
664
538k
   }
665
   /* We accept some redundancy if depth==last (for last different from 0 and cap). */
666
2.84M
   if (sym == 3) ec_enc_uint(enc, depth-1, cap);
667
2.84M
   *last = depth;
668
2.84M
}
669
670
127k
static int ec_dec_depth(ec_dec *dec, opus_int32 cap, opus_int32 *last) {
671
127k
   int depth, sym;
672
127k
   if (*last == 0) {
673
45.2k
      sym = ec_dec_icdf(dec, last_zero, 7);
674
45.2k
      if (sym==2) sym=3;
675
82.4k
   } else if (*last == cap) {
676
14.6k
      sym = ec_dec_icdf(dec, last_cap, 7);
677
14.6k
      if (sym==2) sym=3;
678
67.8k
   } else {
679
67.8k
      sym = ec_dec_icdf(dec, last_other, 7);
680
67.8k
   }
681
127k
   if (sym==0) depth=0;
682
88.2k
   else if (sym==1) depth=cap;
683
75.1k
   else if (sym==2) depth=*last;
684
50.7k
   else depth = 1 + ec_dec_uint(dec, cap);
685
127k
   *last = depth;
686
127k
   return depth;
687
127k
}
688
689
3.38M
#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
2.23M
{
692
2.23M
   opus_val16 t0, t1, t2, t3, t4;
693
2.23M
   t2 = x[2];
694
2.23M
   if (x[0] > x[1])
695
1.63M
   {
696
1.63M
      t0 = x[1];
697
1.63M
      t1 = x[0];
698
1.63M
   } else {
699
605k
      t0 = x[0];
700
605k
      t1 = x[1];
701
605k
   }
702
2.23M
   if (x[3] > x[4])
703
1.49M
   {
704
1.49M
      t3 = x[4];
705
1.49M
      t4 = x[3];
706
1.49M
   } else {
707
742k
      t3 = x[3];
708
742k
      t4 = x[4];
709
742k
   }
710
2.23M
   if (t0 > t3)
711
1.69M
   {
712
1.69M
      MSWAP16(t0, t3);
713
1.69M
      MSWAP16(t1, t4);
714
1.69M
   }
715
2.23M
   if (t2 > t1)
716
1.37M
   {
717
1.37M
      if (t1 < t3)
718
1.14M
         return MIN16(t2, t3);
719
230k
      else
720
230k
         return MIN16(t4, t1);
721
1.37M
   } else {
722
860k
      if (t2 < t3)
723
600k
         return MIN16(t1, t3);
724
260k
      else
725
260k
         return MIN16(t2, t4);
726
860k
   }
727
2.23M
}
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
161M
{
732
161M
   int i;
733
161M
   opus_int32 last=0;
734
161M
   opus_val32 sum;
735
161M
   opus_val32 fill;
736
161M
   int iter;
737
161M
   int tot_bands;
738
161M
   int tot_samples;
739
161M
   VARDECL(int, depth);
740
161M
   VARDECL(opus_int32, cap);
741
#ifdef FUZZING
742
   float depth_std;
743
#endif
744
161M
   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
161M
   if (qext_mode != NULL) {
750
74.7k
      celt_assert(end==m->nbEBands);
751
74.7k
      tot_bands = end + qext_end;
752
74.7k
      tot_samples = qext_mode->eBands[qext_end]*C<<LM;
753
160M
   } else {
754
160M
      tot_bands = end;
755
160M
      tot_samples = (m->eBands[end]-m->eBands[start])*C<<LM;
756
160M
   }
757
161M
   ALLOC(cap, tot_bands, opus_int32);
758
2.49G
   for (i=start;i<end;i++) cap[i] = 12;
759
161M
   if (qext_mode != NULL) {
760
917k
      for (i=0;i<qext_end;i++) cap[end+i] = 14;
761
74.7k
   }
762
161M
   if (total <= 0) {
763
3.53G
      for (i=start;i<m->nbEBands+qext_end;i++) {
764
3.36G
         extra_pulses[i] = extra_equant[i] = 0;
765
3.36G
      }
766
160M
      return;
767
160M
   }
768
319k
   ALLOC(depth, tot_bands, int);
769
319k
   if (encode) {
770
303k
      VARDECL(opus_val16, flatE);
771
303k
      VARDECL(int, Ncoef);
772
303k
      VARDECL(opus_val16, min);
773
303k
      VARDECL(opus_val16, follower);
774
775
303k
      ALLOC(flatE, tot_bands, opus_val16);
776
303k
      ALLOC(min, tot_bands, opus_val16);
777
303k
      ALLOC(Ncoef, tot_bands, int);
778
5.24M
      for (i=start;i<end;i++) {
779
4.94M
         Ncoef[i] = (m->eBands[i+1]-m->eBands[i])*C<<LM;
780
4.94M
      }
781
      /* Remove the effect of band width, eMeans and pre-emphasis to compute the real (flat) spectrum. */
782
5.24M
      for (i=start;i<end;i++) {
783
4.94M
         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
4.94M
         min[i] = 0;
785
4.94M
      }
786
303k
      if (C==2) {
787
8.40k
         for (i=start;i<end;i++) {
788
7.83k
            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
7.83k
         }
790
562
      }
791
303k
      flatE[end-1] += QCONST16(2.f, 10);
792
303k
      if (qext_mode != NULL) {
793
58.8k
         opus_val16 min_depth = 0;
794
         /* If we have enough bits, give at least 1 bit of depth to all higher bands. */
795
58.8k
         if (total >= 3*C*(qext_mode->eBands[qext_end]-qext_mode->eBands[start])<<LM<<BITRES && (toneishness < QCONST32(.98f, 29) || tone_freq > 1.33f))
796
18
            min_depth = QCONST16(1.f, 10);
797
810k
         for (i=0;i<qext_end;i++) {
798
751k
            Ncoef[end+i] = (qext_mode->eBands[i+1]-qext_mode->eBands[i])*C<<LM;
799
751k
            min[end+i] = min_depth;
800
751k
         }
801
810k
         for (i=0;i<qext_end;i++) {
802
751k
            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
751k
         }
804
58.8k
         if (C==2) {
805
6
            for (i=0;i<qext_end;i++) {
806
4
               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
4
            }
808
2
         }
809
58.8k
      }
810
303k
      ALLOC(follower, tot_bands, opus_val16);
811
4.78M
      for (i=start+2;i<tot_bands-2;i++) {
812
4.47M
         follower[i] = median_of_5_val16(&flatE[i-2]);
813
4.47M
      }
814
303k
      follower[start] = follower[start+1] = follower[start+2];
815
303k
      follower[tot_bands-1] = follower[tot_bands-2] = follower[tot_bands-3];
816
5.69M
      for (i=start+1;i<tot_bands;i++) {
817
5.38M
         follower[i] = MAX16(follower[i], follower[i-1]-QCONST16(1.f, 10));
818
5.38M
      }
819
5.69M
      for (i=tot_bands-2;i>=start;i--) {
820
5.38M
         follower[i] = MAX16(follower[i], follower[i+1]-QCONST16(1.f, 10));
821
5.38M
      }
822
5.99M
      for (i=start;i<tot_bands;i++) flatE[i] -= MULT16_16_Q15(Q15ONE-PSHR32(toneishness, 14), follower[i]);
823
303k
      if (qext_mode != NULL) {
824
810k
         for (i=0;i<qext_end;i++) flatE[end+i] = flatE[end+i] + QCONST16(3.f, 10) + QCONST16(.2f, 10)*i;
825
58.8k
      }
826
      /* Approximate fill level assuming all bands contribute fully. */
827
303k
      sum = 0;
828
5.99M
      for (i=start;i<tot_bands;i++) {
829
5.69M
         sum += MULT16_16(Ncoef[i], flatE[i]);
830
5.69M
      }
831
303k
      total >>= BITRES;
832
303k
      fill = (SHL32(total, 10) + sum)/tot_samples;
833
      /* Iteratively refine the fill level considering the depth min and cap. */
834
3.33M
      for (iter=0;iter<10;iter++) {
835
3.03M
         sum = 0;
836
59.9M
         for (i=start;i<tot_bands;i++)
837
56.9M
            sum += Ncoef[i] * MIN32(SHL32(cap[i], 10), MAX32(min[i], flatE[i]-fill));
838
3.03M
         fill -= (SHL32(total, 10) - sum)/tot_samples;
839
3.03M
      }
840
5.99M
      for (i=start;i<tot_bands;i++) {
841
#ifdef FIXED_POINT
842
2.84M
         depth[i] = PSHR32(MIN32(SHL32(cap[i], 10), MAX32(min[i], flatE[i]-fill)), 10-2);
843
#else
844
2.84M
         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
5.69M
         if (ec_tell_frac(ec) + 80 < ec->storage*8<<BITRES)
851
5.69M
            ec_enc_depth(ec, depth[i], 4*cap[i], &last);
852
0
         else
853
0
            depth[i] = 0;
854
5.69M
      }
855
303k
   } else {
856
354k
      for (i=start;i<tot_bands;i++) {
857
338k
         if (ec_tell_frac(ec) + 80 < ec->storage*8<<BITRES)
858
255k
            depth[i] = ec_dec_depth(ec, 4*cap[i], &last);
859
82.8k
         else
860
82.8k
            depth[i] = 0;
861
338k
      }
862
15.8k
   }
863
5.53M
   for (i=start;i<end;i++) {
864
5.21M
      extra_equant[i] = (depth[i]+3)>>2;
865
5.21M
      extra_pulses[i] = ((((m->eBands[i+1]-m->eBands[i])<<LM)-1)*C * depth[i] * (1<<BITRES) + 2)>>2;
866
5.21M
   }
867
319k
   if (qext_mode) {
868
884k
      for (i=0;i<qext_end;i++) {
869
815k
         extra_equant[end+i] = (depth[end+i]+3)>>2;
870
815k
         extra_pulses[end+i] = ((((qext_mode->eBands[i+1]-qext_mode->eBands[i])<<LM)-1)*C * depth[end+i] * (1<<BITRES) + 2)>>2;
871
815k
      }
872
69.7k
   }
873
319k
}
clt_compute_extra_allocation
Line
Count
Source
731
80.5M
{
732
80.5M
   int i;
733
80.5M
   opus_int32 last=0;
734
80.5M
   opus_val32 sum;
735
80.5M
   opus_val32 fill;
736
80.5M
   int iter;
737
80.5M
   int tot_bands;
738
80.5M
   int tot_samples;
739
80.5M
   VARDECL(int, depth);
740
80.5M
   VARDECL(opus_int32, cap);
741
#ifdef FUZZING
742
   float depth_std;
743
#endif
744
80.5M
   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
80.5M
   if (qext_mode != NULL) {
750
37.3k
      celt_assert(end==m->nbEBands);
751
37.3k
      tot_bands = end + qext_end;
752
37.3k
      tot_samples = qext_mode->eBands[qext_end]*C<<LM;
753
80.4M
   } else {
754
80.4M
      tot_bands = end;
755
80.4M
      tot_samples = (m->eBands[end]-m->eBands[start])*C<<LM;
756
80.4M
   }
757
80.5M
   ALLOC(cap, tot_bands, opus_int32);
758
1.24G
   for (i=start;i<end;i++) cap[i] = 12;
759
80.5M
   if (qext_mode != NULL) {
760
458k
      for (i=0;i<qext_end;i++) cap[end+i] = 14;
761
37.3k
   }
762
80.5M
   if (total <= 0) {
763
1.76G
      for (i=start;i<m->nbEBands+qext_end;i++) {
764
1.68G
         extra_pulses[i] = extra_equant[i] = 0;
765
1.68G
      }
766
80.3M
      return;
767
80.3M
   }
768
159k
   ALLOC(depth, tot_bands, int);
769
159k
   if (encode) {
770
151k
      VARDECL(opus_val16, flatE);
771
151k
      VARDECL(int, Ncoef);
772
151k
      VARDECL(opus_val16, min);
773
151k
      VARDECL(opus_val16, follower);
774
775
151k
      ALLOC(flatE, tot_bands, opus_val16);
776
151k
      ALLOC(min, tot_bands, opus_val16);
777
151k
      ALLOC(Ncoef, tot_bands, int);
778
2.62M
      for (i=start;i<end;i++) {
779
2.47M
         Ncoef[i] = (m->eBands[i+1]-m->eBands[i])*C<<LM;
780
2.47M
      }
781
      /* Remove the effect of band width, eMeans and pre-emphasis to compute the real (flat) spectrum. */
782
2.62M
      for (i=start;i<end;i++) {
783
2.47M
         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
2.47M
         min[i] = 0;
785
2.47M
      }
786
151k
      if (C==2) {
787
4.20k
         for (i=start;i<end;i++) {
788
3.91k
            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
3.91k
         }
790
281
      }
791
151k
      flatE[end-1] += QCONST16(2.f, 10);
792
151k
      if (qext_mode != NULL) {
793
29.4k
         opus_val16 min_depth = 0;
794
         /* If we have enough bits, give at least 1 bit of depth to all higher bands. */
795
29.4k
         if (total >= 3*C*(qext_mode->eBands[qext_end]-qext_mode->eBands[start])<<LM<<BITRES && (toneishness < QCONST32(.98f, 29) || tone_freq > 1.33f))
796
9
            min_depth = QCONST16(1.f, 10);
797
405k
         for (i=0;i<qext_end;i++) {
798
375k
            Ncoef[end+i] = (qext_mode->eBands[i+1]-qext_mode->eBands[i])*C<<LM;
799
375k
            min[end+i] = min_depth;
800
375k
         }
801
405k
         for (i=0;i<qext_end;i++) {
802
375k
            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
375k
         }
804
29.4k
         if (C==2) {
805
3
            for (i=0;i<qext_end;i++) {
806
2
               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
2
            }
808
1
         }
809
29.4k
      }
810
151k
      ALLOC(follower, tot_bands, opus_val16);
811
2.39M
      for (i=start+2;i<tot_bands-2;i++) {
812
2.23M
         follower[i] = median_of_5_val16(&flatE[i-2]);
813
2.23M
      }
814
151k
      follower[start] = follower[start+1] = follower[start+2];
815
151k
      follower[tot_bands-1] = follower[tot_bands-2] = follower[tot_bands-3];
816
2.84M
      for (i=start+1;i<tot_bands;i++) {
817
2.69M
         follower[i] = MAX16(follower[i], follower[i-1]-QCONST16(1.f, 10));
818
2.69M
      }
819
2.84M
      for (i=tot_bands-2;i>=start;i--) {
820
2.69M
         follower[i] = MAX16(follower[i], follower[i+1]-QCONST16(1.f, 10));
821
2.69M
      }
822
2.99M
      for (i=start;i<tot_bands;i++) flatE[i] -= MULT16_16_Q15(Q15ONE-PSHR32(toneishness, 14), follower[i]);
823
151k
      if (qext_mode != NULL) {
824
405k
         for (i=0;i<qext_end;i++) flatE[end+i] = flatE[end+i] + QCONST16(3.f, 10) + QCONST16(.2f, 10)*i;
825
29.4k
      }
826
      /* Approximate fill level assuming all bands contribute fully. */
827
151k
      sum = 0;
828
2.99M
      for (i=start;i<tot_bands;i++) {
829
2.84M
         sum += MULT16_16(Ncoef[i], flatE[i]);
830
2.84M
      }
831
151k
      total >>= BITRES;
832
151k
      fill = (SHL32(total, 10) + sum)/tot_samples;
833
      /* Iteratively refine the fill level considering the depth min and cap. */
834
1.66M
      for (iter=0;iter<10;iter++) {
835
1.51M
         sum = 0;
836
29.9M
         for (i=start;i<tot_bands;i++)
837
28.4M
            sum += Ncoef[i] * MIN32(SHL32(cap[i], 10), MAX32(min[i], flatE[i]-fill));
838
1.51M
         fill -= (SHL32(total, 10) - sum)/tot_samples;
839
1.51M
      }
840
2.99M
      for (i=start;i<tot_bands;i++) {
841
2.84M
#ifdef FIXED_POINT
842
2.84M
         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
2.84M
         if (ec_tell_frac(ec) + 80 < ec->storage*8<<BITRES)
851
2.84M
            ec_enc_depth(ec, depth[i], 4*cap[i], &last);
852
0
         else
853
0
            depth[i] = 0;
854
2.84M
      }
855
151k
   } else {
856
177k
      for (i=start;i<tot_bands;i++) {
857
169k
         if (ec_tell_frac(ec) + 80 < ec->storage*8<<BITRES)
858
127k
            depth[i] = ec_dec_depth(ec, 4*cap[i], &last);
859
41.4k
         else
860
41.4k
            depth[i] = 0;
861
169k
      }
862
7.92k
   }
863
2.76M
   for (i=start;i<end;i++) {
864
2.60M
      extra_equant[i] = (depth[i]+3)>>2;
865
2.60M
      extra_pulses[i] = ((((m->eBands[i+1]-m->eBands[i])<<LM)-1)*C * depth[i] * (1<<BITRES) + 2)>>2;
866
2.60M
   }
867
159k
   if (qext_mode) {
868
442k
      for (i=0;i<qext_end;i++) {
869
407k
         extra_equant[end+i] = (depth[end+i]+3)>>2;
870
407k
         extra_pulses[end+i] = ((((qext_mode->eBands[i+1]-qext_mode->eBands[i])<<LM)-1)*C * depth[end+i] * (1<<BITRES) + 2)>>2;
871
407k
      }
872
34.8k
   }
873
159k
}
clt_compute_extra_allocation
Line
Count
Source
731
80.5M
{
732
80.5M
   int i;
733
80.5M
   opus_int32 last=0;
734
80.5M
   opus_val32 sum;
735
80.5M
   opus_val32 fill;
736
80.5M
   int iter;
737
80.5M
   int tot_bands;
738
80.5M
   int tot_samples;
739
80.5M
   VARDECL(int, depth);
740
80.5M
   VARDECL(opus_int32, cap);
741
#ifdef FUZZING
742
   float depth_std;
743
#endif
744
80.5M
   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
80.5M
   if (qext_mode != NULL) {
750
37.3k
      celt_assert(end==m->nbEBands);
751
37.3k
      tot_bands = end + qext_end;
752
37.3k
      tot_samples = qext_mode->eBands[qext_end]*C<<LM;
753
80.4M
   } else {
754
80.4M
      tot_bands = end;
755
80.4M
      tot_samples = (m->eBands[end]-m->eBands[start])*C<<LM;
756
80.4M
   }
757
80.5M
   ALLOC(cap, tot_bands, opus_int32);
758
1.24G
   for (i=start;i<end;i++) cap[i] = 12;
759
80.5M
   if (qext_mode != NULL) {
760
458k
      for (i=0;i<qext_end;i++) cap[end+i] = 14;
761
37.3k
   }
762
80.5M
   if (total <= 0) {
763
1.76G
      for (i=start;i<m->nbEBands+qext_end;i++) {
764
1.68G
         extra_pulses[i] = extra_equant[i] = 0;
765
1.68G
      }
766
80.3M
      return;
767
80.3M
   }
768
159k
   ALLOC(depth, tot_bands, int);
769
159k
   if (encode) {
770
151k
      VARDECL(opus_val16, flatE);
771
151k
      VARDECL(int, Ncoef);
772
151k
      VARDECL(opus_val16, min);
773
151k
      VARDECL(opus_val16, follower);
774
775
151k
      ALLOC(flatE, tot_bands, opus_val16);
776
151k
      ALLOC(min, tot_bands, opus_val16);
777
151k
      ALLOC(Ncoef, tot_bands, int);
778
2.62M
      for (i=start;i<end;i++) {
779
2.47M
         Ncoef[i] = (m->eBands[i+1]-m->eBands[i])*C<<LM;
780
2.47M
      }
781
      /* Remove the effect of band width, eMeans and pre-emphasis to compute the real (flat) spectrum. */
782
2.62M
      for (i=start;i<end;i++) {
783
2.47M
         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
2.47M
         min[i] = 0;
785
2.47M
      }
786
151k
      if (C==2) {
787
4.20k
         for (i=start;i<end;i++) {
788
3.91k
            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
3.91k
         }
790
281
      }
791
151k
      flatE[end-1] += QCONST16(2.f, 10);
792
151k
      if (qext_mode != NULL) {
793
29.4k
         opus_val16 min_depth = 0;
794
         /* If we have enough bits, give at least 1 bit of depth to all higher bands. */
795
29.4k
         if (total >= 3*C*(qext_mode->eBands[qext_end]-qext_mode->eBands[start])<<LM<<BITRES && (toneishness < QCONST32(.98f, 29) || tone_freq > 1.33f))
796
9
            min_depth = QCONST16(1.f, 10);
797
405k
         for (i=0;i<qext_end;i++) {
798
375k
            Ncoef[end+i] = (qext_mode->eBands[i+1]-qext_mode->eBands[i])*C<<LM;
799
375k
            min[end+i] = min_depth;
800
375k
         }
801
405k
         for (i=0;i<qext_end;i++) {
802
375k
            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
375k
         }
804
29.4k
         if (C==2) {
805
3
            for (i=0;i<qext_end;i++) {
806
2
               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
2
            }
808
1
         }
809
29.4k
      }
810
151k
      ALLOC(follower, tot_bands, opus_val16);
811
2.39M
      for (i=start+2;i<tot_bands-2;i++) {
812
2.23M
         follower[i] = median_of_5_val16(&flatE[i-2]);
813
2.23M
      }
814
151k
      follower[start] = follower[start+1] = follower[start+2];
815
151k
      follower[tot_bands-1] = follower[tot_bands-2] = follower[tot_bands-3];
816
2.84M
      for (i=start+1;i<tot_bands;i++) {
817
2.69M
         follower[i] = MAX16(follower[i], follower[i-1]-QCONST16(1.f, 10));
818
2.69M
      }
819
2.84M
      for (i=tot_bands-2;i>=start;i--) {
820
2.69M
         follower[i] = MAX16(follower[i], follower[i+1]-QCONST16(1.f, 10));
821
2.69M
      }
822
2.99M
      for (i=start;i<tot_bands;i++) flatE[i] -= MULT16_16_Q15(Q15ONE-PSHR32(toneishness, 14), follower[i]);
823
151k
      if (qext_mode != NULL) {
824
405k
         for (i=0;i<qext_end;i++) flatE[end+i] = flatE[end+i] + QCONST16(3.f, 10) + QCONST16(.2f, 10)*i;
825
29.4k
      }
826
      /* Approximate fill level assuming all bands contribute fully. */
827
151k
      sum = 0;
828
2.99M
      for (i=start;i<tot_bands;i++) {
829
2.84M
         sum += MULT16_16(Ncoef[i], flatE[i]);
830
2.84M
      }
831
151k
      total >>= BITRES;
832
151k
      fill = (SHL32(total, 10) + sum)/tot_samples;
833
      /* Iteratively refine the fill level considering the depth min and cap. */
834
1.66M
      for (iter=0;iter<10;iter++) {
835
1.51M
         sum = 0;
836
29.9M
         for (i=start;i<tot_bands;i++)
837
28.4M
            sum += Ncoef[i] * MIN32(SHL32(cap[i], 10), MAX32(min[i], flatE[i]-fill));
838
1.51M
         fill -= (SHL32(total, 10) - sum)/tot_samples;
839
1.51M
      }
840
2.99M
      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
2.84M
         depth[i] = (int)floor(.5+4*MIN32(SHL32(cap[i], 10), MAX32(min[i], flatE[i]-fill)));
845
2.84M
#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
2.84M
         if (ec_tell_frac(ec) + 80 < ec->storage*8<<BITRES)
851
2.84M
            ec_enc_depth(ec, depth[i], 4*cap[i], &last);
852
0
         else
853
0
            depth[i] = 0;
854
2.84M
      }
855
151k
   } else {
856
177k
      for (i=start;i<tot_bands;i++) {
857
169k
         if (ec_tell_frac(ec) + 80 < ec->storage*8<<BITRES)
858
127k
            depth[i] = ec_dec_depth(ec, 4*cap[i], &last);
859
41.4k
         else
860
41.4k
            depth[i] = 0;
861
169k
      }
862
7.92k
   }
863
2.76M
   for (i=start;i<end;i++) {
864
2.60M
      extra_equant[i] = (depth[i]+3)>>2;
865
2.60M
      extra_pulses[i] = ((((m->eBands[i+1]-m->eBands[i])<<LM)-1)*C * depth[i] * (1<<BITRES) + 2)>>2;
866
2.60M
   }
867
159k
   if (qext_mode) {
868
442k
      for (i=0;i<qext_end;i++) {
869
407k
         extra_equant[end+i] = (depth[end+i]+3)>>2;
870
407k
         extra_pulses[end+i] = ((((qext_mode->eBands[i+1]-qext_mode->eBands[i])<<LM)-1)*C * depth[end+i] * (1<<BITRES) + 2)>>2;
871
407k
      }
872
34.8k
   }
873
159k
}
874
#endif