LCOV - code coverage report
Current view: top level - media/libopus/celt - rate.c (source / functions) Hit Total Coverage
Test: output.info Lines: 0 199 0.0 %
Date: 2017-07-14 16:53:18 Functions: 0 2 0.0 %
Legend: Lines: hit not hit

          Line data    Source code
       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             : 
      42             : static const unsigned char LOG2_FRAC_TABLE[24]={
      43             :    0,
      44             :    8,13,
      45             :   16,19,21,23,
      46             :   24,26,27,28,29,30,31,32,
      47             :   32,33,34,34,35,36,36,37,37
      48             : };
      49             : 
      50             : #ifdef CUSTOM_MODES
      51             : 
      52             : /*Determines if V(N,K) fits in a 32-bit unsigned integer.
      53             :   N and K are themselves limited to 15 bits.*/
      54             : static int fits_in32(int _n, int _k)
      55             : {
      56             :    static const opus_int16 maxN[15] = {
      57             :       32767, 32767, 32767, 1476, 283, 109,  60,  40,
      58             :        29,  24,  20,  18,  16,  14,  13};
      59             :    static const opus_int16 maxK[15] = {
      60             :       32767, 32767, 32767, 32767, 1172, 238,  95,  53,
      61             :        36,  27,  22,  18,  16,  15,  13};
      62             :    if (_n>=14)
      63             :    {
      64             :       if (_k>=14)
      65             :          return 0;
      66             :       else
      67             :          return _n <= maxN[_k];
      68             :    } else {
      69             :       return _k <= maxK[_n];
      70             :    }
      71             : }
      72             : 
      73             : void compute_pulse_cache(CELTMode *m, int LM)
      74             : {
      75             :    int C;
      76             :    int i;
      77             :    int j;
      78             :    int curr=0;
      79             :    int nbEntries=0;
      80             :    int entryN[100], entryK[100], entryI[100];
      81             :    const opus_int16 *eBands = m->eBands;
      82             :    PulseCache *cache = &m->cache;
      83             :    opus_int16 *cindex;
      84             :    unsigned char *bits;
      85             :    unsigned char *cap;
      86             : 
      87             :    cindex = (opus_int16 *)opus_alloc(sizeof(cache->index[0])*m->nbEBands*(LM+2));
      88             :    cache->index = cindex;
      89             : 
      90             :    /* Scan for all unique band sizes */
      91             :    for (i=0;i<=LM+1;i++)
      92             :    {
      93             :       for (j=0;j<m->nbEBands;j++)
      94             :       {
      95             :          int k;
      96             :          int N = (eBands[j+1]-eBands[j])<<i>>1;
      97             :          cindex[i*m->nbEBands+j] = -1;
      98             :          /* Find other bands that have the same size */
      99             :          for (k=0;k<=i;k++)
     100             :          {
     101             :             int n;
     102             :             for (n=0;n<m->nbEBands && (k!=i || n<j);n++)
     103             :             {
     104             :                if (N == (eBands[n+1]-eBands[n])<<k>>1)
     105             :                {
     106             :                   cindex[i*m->nbEBands+j] = cindex[k*m->nbEBands+n];
     107             :                   break;
     108             :                }
     109             :             }
     110             :          }
     111             :          if (cache->index[i*m->nbEBands+j] == -1 && N!=0)
     112             :          {
     113             :             int K;
     114             :             entryN[nbEntries] = N;
     115             :             K = 0;
     116             :             while (fits_in32(N,get_pulses(K+1)) && K<MAX_PSEUDO)
     117             :                K++;
     118             :             entryK[nbEntries] = K;
     119             :             cindex[i*m->nbEBands+j] = curr;
     120             :             entryI[nbEntries] = curr;
     121             : 
     122             :             curr += K+1;
     123             :             nbEntries++;
     124             :          }
     125             :       }
     126             :    }
     127             :    bits = (unsigned char *)opus_alloc(sizeof(unsigned char)*curr);
     128             :    cache->bits = bits;
     129             :    cache->size = curr;
     130             :    /* Compute the cache for all unique sizes */
     131             :    for (i=0;i<nbEntries;i++)
     132             :    {
     133             :       unsigned char *ptr = bits+entryI[i];
     134             :       opus_int16 tmp[CELT_MAX_PULSES+1];
     135             :       get_required_bits(tmp, entryN[i], get_pulses(entryK[i]), BITRES);
     136             :       for (j=1;j<=entryK[i];j++)
     137             :          ptr[j] = tmp[get_pulses(j)]-1;
     138             :       ptr[0] = entryK[i];
     139             :    }
     140             : 
     141             :    /* Compute the maximum rate for each band at which we'll reliably use as
     142             :        many bits as we ask for. */
     143             :    cache->caps = cap = (unsigned char *)opus_alloc(sizeof(cache->caps[0])*(LM+1)*2*m->nbEBands);
     144             :    for (i=0;i<=LM;i++)
     145             :    {
     146             :       for (C=1;C<=2;C++)
     147             :       {
     148             :          for (j=0;j<m->nbEBands;j++)
     149             :          {
     150             :             int N0;
     151             :             int max_bits;
     152             :             N0 = m->eBands[j+1]-m->eBands[j];
     153             :             /* N=1 bands only have a sign bit and fine bits. */
     154             :             if (N0<<i == 1)
     155             :                max_bits = C*(1+MAX_FINE_BITS)<<BITRES;
     156             :             else
     157             :             {
     158             :                const unsigned char *pcache;
     159             :                opus_int32           num;
     160             :                opus_int32           den;
     161             :                int                  LM0;
     162             :                int                  N;
     163             :                int                  offset;
     164             :                int                  ndof;
     165             :                int                  qb;
     166             :                int                  k;
     167             :                LM0 = 0;
     168             :                /* Even-sized bands bigger than N=2 can be split one more time.
     169             :                   As of commit 44203907 all bands >1 are even, including custom modes.*/
     170             :                if (N0 > 2)
     171             :                {
     172             :                   N0>>=1;
     173             :                   LM0--;
     174             :                }
     175             :                /* N0=1 bands can't be split down to N<2. */
     176             :                else if (N0 <= 1)
     177             :                {
     178             :                   LM0=IMIN(i,1);
     179             :                   N0<<=LM0;
     180             :                }
     181             :                /* Compute the cost for the lowest-level PVQ of a fully split
     182             :                    band. */
     183             :                pcache = bits + cindex[(LM0+1)*m->nbEBands+j];
     184             :                max_bits = pcache[pcache[0]]+1;
     185             :                /* Add in the cost of coding regular splits. */
     186             :                N = N0;
     187             :                for(k=0;k<i-LM0;k++){
     188             :                   max_bits <<= 1;
     189             :                   /* Offset the number of qtheta bits by log2(N)/2
     190             :                       + QTHETA_OFFSET compared to their "fair share" of
     191             :                       total/N */
     192             :                   offset = ((m->logN[j]+((LM0+k)<<BITRES))>>1)-QTHETA_OFFSET;
     193             :                   /* The number of qtheta bits we'll allocate if the remainder
     194             :                       is to be max_bits.
     195             :                      The average measured cost for theta is 0.89701 times qb,
     196             :                       approximated here as 459/512. */
     197             :                   num=459*(opus_int32)((2*N-1)*offset+max_bits);
     198             :                   den=((opus_int32)(2*N-1)<<9)-459;
     199             :                   qb = IMIN((num+(den>>1))/den, 57);
     200             :                   celt_assert(qb >= 0);
     201             :                   max_bits += qb;
     202             :                   N <<= 1;
     203             :                }
     204             :                /* Add in the cost of a stereo split, if necessary. */
     205             :                if (C==2)
     206             :                {
     207             :                   max_bits <<= 1;
     208             :                   offset = ((m->logN[j]+(i<<BITRES))>>1)-(N==2?QTHETA_OFFSET_TWOPHASE:QTHETA_OFFSET);
     209             :                   ndof = 2*N-1-(N==2);
     210             :                   /* The average measured cost for theta with the step PDF is
     211             :                       0.95164 times qb, approximated here as 487/512. */
     212             :                   num = (N==2?512:487)*(opus_int32)(max_bits+ndof*offset);
     213             :                   den = ((opus_int32)ndof<<9)-(N==2?512:487);
     214             :                   qb = IMIN((num+(den>>1))/den, (N==2?64:61));
     215             :                   celt_assert(qb >= 0);
     216             :                   max_bits += qb;
     217             :                }
     218             :                /* Add the fine bits we'll use. */
     219             :                /* Compensate for the extra DoF in stereo */
     220             :                ndof = C*N + ((C==2 && N>2) ? 1 : 0);
     221             :                /* Offset the number of fine bits by log2(N)/2 + FINE_OFFSET
     222             :                    compared to their "fair share" of total/N */
     223             :                offset = ((m->logN[j] + (i<<BITRES))>>1)-FINE_OFFSET;
     224             :                /* N=2 is the only point that doesn't match the curve */
     225             :                if (N==2)
     226             :                   offset += 1<<BITRES>>2;
     227             :                /* The number of fine bits we'll allocate if the remainder is
     228             :                    to be max_bits. */
     229             :                num = max_bits+ndof*offset;
     230             :                den = (ndof-1)<<BITRES;
     231             :                qb = IMIN((num+(den>>1))/den, MAX_FINE_BITS);
     232             :                celt_assert(qb >= 0);
     233             :                max_bits += C*qb<<BITRES;
     234             :             }
     235             :             max_bits = (4*max_bits/(C*((m->eBands[j+1]-m->eBands[j])<<i)))-64;
     236             :             celt_assert(max_bits >= 0);
     237             :             celt_assert(max_bits < 256);
     238             :             *cap++ = (unsigned char)max_bits;
     239             :          }
     240             :       }
     241             :    }
     242             : }
     243             : 
     244             : #endif /* CUSTOM_MODES */
     245             : 
     246             : #define ALLOC_STEPS 6
     247             : 
     248           0 : static OPUS_INLINE int interp_bits2pulses(const CELTMode *m, int start, int end, int skip_start,
     249             :       const int *bits1, const int *bits2, const int *thresh, const int *cap, opus_int32 total, opus_int32 *_balance,
     250             :       int skip_rsv, int *intensity, int intensity_rsv, int *dual_stereo, int dual_stereo_rsv, int *bits,
     251             :       int *ebits, int *fine_priority, int C, int LM, ec_ctx *ec, int encode, int prev, int signalBandwidth)
     252             : {
     253             :    opus_int32 psum;
     254             :    int lo, hi;
     255             :    int i, j;
     256             :    int logM;
     257             :    int stereo;
     258           0 :    int codedBands=-1;
     259             :    int alloc_floor;
     260             :    opus_int32 left, percoeff;
     261             :    int done;
     262             :    opus_int32 balance;
     263             :    SAVE_STACK;
     264             : 
     265           0 :    alloc_floor = C<<BITRES;
     266           0 :    stereo = C>1;
     267             : 
     268           0 :    logM = LM<<BITRES;
     269           0 :    lo = 0;
     270           0 :    hi = 1<<ALLOC_STEPS;
     271           0 :    for (i=0;i<ALLOC_STEPS;i++)
     272             :    {
     273           0 :       int mid = (lo+hi)>>1;
     274           0 :       psum = 0;
     275           0 :       done = 0;
     276           0 :       for (j=end;j-->start;)
     277             :       {
     278           0 :          int tmp = bits1[j] + (mid*(opus_int32)bits2[j]>>ALLOC_STEPS);
     279           0 :          if (tmp >= thresh[j] || done)
     280             :          {
     281           0 :             done = 1;
     282             :             /* Don't allocate more than we can actually use */
     283           0 :             psum += IMIN(tmp, cap[j]);
     284             :          } else {
     285           0 :             if (tmp >= alloc_floor)
     286           0 :                psum += alloc_floor;
     287             :          }
     288             :       }
     289           0 :       if (psum > total)
     290           0 :          hi = mid;
     291             :       else
     292           0 :          lo = mid;
     293             :    }
     294           0 :    psum = 0;
     295             :    /*printf ("interp bisection gave %d\n", lo);*/
     296           0 :    done = 0;
     297           0 :    for (j=end;j-->start;)
     298             :    {
     299           0 :       int tmp = bits1[j] + ((opus_int32)lo*bits2[j]>>ALLOC_STEPS);
     300           0 :       if (tmp < thresh[j] && !done)
     301             :       {
     302           0 :          if (tmp >= alloc_floor)
     303           0 :             tmp = alloc_floor;
     304             :          else
     305           0 :             tmp = 0;
     306             :       } else
     307           0 :          done = 1;
     308             :       /* Don't allocate more than we can actually use */
     309           0 :       tmp = IMIN(tmp, cap[j]);
     310           0 :       bits[j] = tmp;
     311           0 :       psum += tmp;
     312             :    }
     313             : 
     314             :    /* Decide which bands to skip, working backwards from the end. */
     315           0 :    for (codedBands=end;;codedBands--)
     316           0 :    {
     317             :       int band_width;
     318             :       int band_bits;
     319             :       int rem;
     320           0 :       j = codedBands-1;
     321             :       /* Never skip the first band, nor a band that has been boosted by
     322             :           dynalloc.
     323             :          In the first case, we'd be coding a bit to signal we're going to waste
     324             :           all the other bits.
     325             :          In the second case, we'd be coding a bit to redistribute all the bits
     326             :           we just signaled should be cocentrated in this band. */
     327           0 :       if (j<=skip_start)
     328             :       {
     329             :          /* Give the bit we reserved to end skipping back. */
     330           0 :          total += skip_rsv;
     331           0 :          break;
     332             :       }
     333             :       /*Figure out how many left-over bits we would be adding to this band.
     334             :         This can include bits we've stolen back from higher, skipped bands.*/
     335           0 :       left = total-psum;
     336           0 :       percoeff = celt_udiv(left, m->eBands[codedBands]-m->eBands[start]);
     337           0 :       left -= (m->eBands[codedBands]-m->eBands[start])*percoeff;
     338           0 :       rem = IMAX(left-(m->eBands[j]-m->eBands[start]),0);
     339           0 :       band_width = m->eBands[codedBands]-m->eBands[j];
     340           0 :       band_bits = (int)(bits[j] + percoeff*band_width + rem);
     341             :       /*Only code a skip decision if we're above the threshold for this band.
     342             :         Otherwise it is force-skipped.
     343             :         This ensures that we have enough bits to code the skip flag.*/
     344           0 :       if (band_bits >= IMAX(thresh[j], alloc_floor+(1<<BITRES)))
     345             :       {
     346           0 :          if (encode)
     347             :          {
     348             :             /*This if() block is the only part of the allocation function that
     349             :                is not a mandatory part of the bitstream: any bands we choose to
     350             :                skip here must be explicitly signaled.*/
     351             :             int depth_threshold;
     352             :             /*We choose a threshold with some hysteresis to keep bands from
     353             :                fluctuating in and out, but we try not to fold below a certain point. */
     354           0 :             if (codedBands > 17)
     355           0 :                depth_threshold = j<prev ? 7 : 9;
     356             :             else
     357           0 :                depth_threshold = 0;
     358             : #ifdef FUZZING
     359             :             if ((rand()&0x1) == 0)
     360             : #else
     361           0 :             if (codedBands<=start+2 || (band_bits > (depth_threshold*band_width<<LM<<BITRES)>>4 && j<=signalBandwidth))
     362             : #endif
     363             :             {
     364           0 :                ec_enc_bit_logp(ec, 1, 1);
     365           0 :                break;
     366             :             }
     367           0 :             ec_enc_bit_logp(ec, 0, 1);
     368           0 :          } else if (ec_dec_bit_logp(ec, 1)) {
     369           0 :             break;
     370             :          }
     371             :          /*We used a bit to skip this band.*/
     372           0 :          psum += 1<<BITRES;
     373           0 :          band_bits -= 1<<BITRES;
     374             :       }
     375             :       /*Reclaim the bits originally allocated to this band.*/
     376           0 :       psum -= bits[j]+intensity_rsv;
     377           0 :       if (intensity_rsv > 0)
     378           0 :          intensity_rsv = LOG2_FRAC_TABLE[j-start];
     379           0 :       psum += intensity_rsv;
     380           0 :       if (band_bits >= alloc_floor)
     381             :       {
     382             :          /*If we have enough for a fine energy bit per channel, use it.*/
     383           0 :          psum += alloc_floor;
     384           0 :          bits[j] = alloc_floor;
     385             :       } else {
     386             :          /*Otherwise this band gets nothing at all.*/
     387           0 :          bits[j] = 0;
     388             :       }
     389             :    }
     390             : 
     391           0 :    celt_assert(codedBands > start);
     392             :    /* Code the intensity and dual stereo parameters. */
     393           0 :    if (intensity_rsv > 0)
     394             :    {
     395           0 :       if (encode)
     396             :       {
     397           0 :          *intensity = IMIN(*intensity, codedBands);
     398           0 :          ec_enc_uint(ec, *intensity-start, codedBands+1-start);
     399             :       }
     400             :       else
     401           0 :          *intensity = start+ec_dec_uint(ec, codedBands+1-start);
     402             :    }
     403             :    else
     404           0 :       *intensity = 0;
     405           0 :    if (*intensity <= start)
     406             :    {
     407           0 :       total += dual_stereo_rsv;
     408           0 :       dual_stereo_rsv = 0;
     409             :    }
     410           0 :    if (dual_stereo_rsv > 0)
     411             :    {
     412           0 :       if (encode)
     413           0 :          ec_enc_bit_logp(ec, *dual_stereo, 1);
     414             :       else
     415           0 :          *dual_stereo = ec_dec_bit_logp(ec, 1);
     416             :    }
     417             :    else
     418           0 :       *dual_stereo = 0;
     419             : 
     420             :    /* Allocate the remaining bits */
     421           0 :    left = total-psum;
     422           0 :    percoeff = celt_udiv(left, m->eBands[codedBands]-m->eBands[start]);
     423           0 :    left -= (m->eBands[codedBands]-m->eBands[start])*percoeff;
     424           0 :    for (j=start;j<codedBands;j++)
     425           0 :       bits[j] += ((int)percoeff*(m->eBands[j+1]-m->eBands[j]));
     426           0 :    for (j=start;j<codedBands;j++)
     427             :    {
     428           0 :       int tmp = (int)IMIN(left, m->eBands[j+1]-m->eBands[j]);
     429           0 :       bits[j] += tmp;
     430           0 :       left -= tmp;
     431             :    }
     432             :    /*for (j=0;j<end;j++)printf("%d ", bits[j]);printf("\n");*/
     433             : 
     434           0 :    balance = 0;
     435           0 :    for (j=start;j<codedBands;j++)
     436             :    {
     437             :       int N0, N, den;
     438             :       int offset;
     439             :       int NClogN;
     440             :       opus_int32 excess, bit;
     441             : 
     442           0 :       celt_assert(bits[j] >= 0);
     443           0 :       N0 = m->eBands[j+1]-m->eBands[j];
     444           0 :       N=N0<<LM;
     445           0 :       bit = (opus_int32)bits[j]+balance;
     446             : 
     447           0 :       if (N>1)
     448             :       {
     449           0 :          excess = MAX32(bit-cap[j],0);
     450           0 :          bits[j] = bit-excess;
     451             : 
     452             :          /* Compensate for the extra DoF in stereo */
     453           0 :          den=(C*N+ ((C==2 && N>2 && !*dual_stereo && j<*intensity) ? 1 : 0));
     454             : 
     455           0 :          NClogN = den*(m->logN[j] + logM);
     456             : 
     457             :          /* Offset for the number of fine bits by log2(N)/2 + FINE_OFFSET
     458             :             compared to their "fair share" of total/N */
     459           0 :          offset = (NClogN>>1)-den*FINE_OFFSET;
     460             : 
     461             :          /* N=2 is the only point that doesn't match the curve */
     462           0 :          if (N==2)
     463           0 :             offset += den<<BITRES>>2;
     464             : 
     465             :          /* Changing the offset for allocating the second and third
     466             :              fine energy bit */
     467           0 :          if (bits[j] + offset < den*2<<BITRES)
     468           0 :             offset += NClogN>>2;
     469           0 :          else if (bits[j] + offset < den*3<<BITRES)
     470           0 :             offset += NClogN>>3;
     471             : 
     472             :          /* Divide with rounding */
     473           0 :          ebits[j] = IMAX(0, (bits[j] + offset + (den<<(BITRES-1))));
     474           0 :          ebits[j] = celt_udiv(ebits[j], den)>>BITRES;
     475             : 
     476             :          /* Make sure not to bust */
     477           0 :          if (C*ebits[j] > (bits[j]>>BITRES))
     478           0 :             ebits[j] = bits[j] >> stereo >> BITRES;
     479             : 
     480             :          /* More than that is useless because that's about as far as PVQ can go */
     481           0 :          ebits[j] = IMIN(ebits[j], MAX_FINE_BITS);
     482             : 
     483             :          /* If we rounded down or capped this band, make it a candidate for the
     484             :              final fine energy pass */
     485           0 :          fine_priority[j] = ebits[j]*(den<<BITRES) >= bits[j]+offset;
     486             : 
     487             :          /* Remove the allocated fine bits; the rest are assigned to PVQ */
     488           0 :          bits[j] -= C*ebits[j]<<BITRES;
     489             : 
     490             :       } else {
     491             :          /* For N=1, all bits go to fine energy except for a single sign bit */
     492           0 :          excess = MAX32(0,bit-(C<<BITRES));
     493           0 :          bits[j] = bit-excess;
     494           0 :          ebits[j] = 0;
     495           0 :          fine_priority[j] = 1;
     496             :       }
     497             : 
     498             :       /* Fine energy can't take advantage of the re-balancing in
     499             :           quant_all_bands().
     500             :          Instead, do the re-balancing here.*/
     501           0 :       if(excess > 0)
     502             :       {
     503             :          int extra_fine;
     504             :          int extra_bits;
     505           0 :          extra_fine = IMIN(excess>>(stereo+BITRES),MAX_FINE_BITS-ebits[j]);
     506           0 :          ebits[j] += extra_fine;
     507           0 :          extra_bits = extra_fine*C<<BITRES;
     508           0 :          fine_priority[j] = extra_bits >= excess-balance;
     509           0 :          excess -= extra_bits;
     510             :       }
     511           0 :       balance = excess;
     512             : 
     513           0 :       celt_assert(bits[j] >= 0);
     514           0 :       celt_assert(ebits[j] >= 0);
     515             :    }
     516             :    /* Save any remaining bits over the cap for the rebalancing in
     517             :        quant_all_bands(). */
     518           0 :    *_balance = balance;
     519             : 
     520             :    /* The skipped bands use all their bits for fine energy. */
     521           0 :    for (;j<end;j++)
     522             :    {
     523           0 :       ebits[j] = bits[j] >> stereo >> BITRES;
     524           0 :       celt_assert(C*ebits[j]<<BITRES == bits[j]);
     525           0 :       bits[j] = 0;
     526           0 :       fine_priority[j] = ebits[j]<1;
     527             :    }
     528             :    RESTORE_STACK;
     529           0 :    return codedBands;
     530             : }
     531             : 
     532           0 : int compute_allocation(const CELTMode *m, int start, int end, const int *offsets, const int *cap, int alloc_trim, int *intensity, int *dual_stereo,
     533             :       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)
     534             : {
     535             :    int lo, hi, len, j;
     536             :    int codedBands;
     537             :    int skip_start;
     538             :    int skip_rsv;
     539             :    int intensity_rsv;
     540             :    int dual_stereo_rsv;
     541             :    VARDECL(int, bits1);
     542             :    VARDECL(int, bits2);
     543             :    VARDECL(int, thresh);
     544             :    VARDECL(int, trim_offset);
     545             :    SAVE_STACK;
     546             : 
     547           0 :    total = IMAX(total, 0);
     548           0 :    len = m->nbEBands;
     549           0 :    skip_start = start;
     550             :    /* Reserve a bit to signal the end of manually skipped bands. */
     551           0 :    skip_rsv = total >= 1<<BITRES ? 1<<BITRES : 0;
     552           0 :    total -= skip_rsv;
     553             :    /* Reserve bits for the intensity and dual stereo parameters. */
     554           0 :    intensity_rsv = dual_stereo_rsv = 0;
     555           0 :    if (C==2)
     556             :    {
     557           0 :       intensity_rsv = LOG2_FRAC_TABLE[end-start];
     558           0 :       if (intensity_rsv>total)
     559           0 :          intensity_rsv = 0;
     560             :       else
     561             :       {
     562           0 :          total -= intensity_rsv;
     563           0 :          dual_stereo_rsv = total>=1<<BITRES ? 1<<BITRES : 0;
     564           0 :          total -= dual_stereo_rsv;
     565             :       }
     566             :    }
     567           0 :    ALLOC(bits1, len, int);
     568           0 :    ALLOC(bits2, len, int);
     569           0 :    ALLOC(thresh, len, int);
     570           0 :    ALLOC(trim_offset, len, int);
     571             : 
     572           0 :    for (j=start;j<end;j++)
     573             :    {
     574             :       /* Below this threshold, we're sure not to allocate any PVQ bits */
     575           0 :       thresh[j] = IMAX((C)<<BITRES, (3*(m->eBands[j+1]-m->eBands[j])<<LM<<BITRES)>>4);
     576             :       /* Tilt of the allocation curve */
     577           0 :       trim_offset[j] = C*(m->eBands[j+1]-m->eBands[j])*(alloc_trim-5-LM)*(end-j-1)
     578           0 :             *(1<<(LM+BITRES))>>6;
     579             :       /* Giving less resolution to single-coefficient bands because they get
     580             :          more benefit from having one coarse value per coefficient*/
     581           0 :       if ((m->eBands[j+1]-m->eBands[j])<<LM==1)
     582           0 :          trim_offset[j] -= C<<BITRES;
     583             :    }
     584           0 :    lo = 1;
     585           0 :    hi = m->nbAllocVectors - 1;
     586             :    do
     587             :    {
     588           0 :       int done = 0;
     589           0 :       int psum = 0;
     590           0 :       int mid = (lo+hi) >> 1;
     591           0 :       for (j=end;j-->start;)
     592             :       {
     593             :          int bitsj;
     594           0 :          int N = m->eBands[j+1]-m->eBands[j];
     595           0 :          bitsj = C*N*m->allocVectors[mid*len+j]<<LM>>2;
     596           0 :          if (bitsj > 0)
     597           0 :             bitsj = IMAX(0, bitsj + trim_offset[j]);
     598           0 :          bitsj += offsets[j];
     599           0 :          if (bitsj >= thresh[j] || done)
     600             :          {
     601           0 :             done = 1;
     602             :             /* Don't allocate more than we can actually use */
     603           0 :             psum += IMIN(bitsj, cap[j]);
     604             :          } else {
     605           0 :             if (bitsj >= C<<BITRES)
     606           0 :                psum += C<<BITRES;
     607             :          }
     608             :       }
     609           0 :       if (psum > total)
     610           0 :          hi = mid - 1;
     611             :       else
     612           0 :          lo = mid + 1;
     613             :       /*printf ("lo = %d, hi = %d\n", lo, hi);*/
     614             :    }
     615           0 :    while (lo <= hi);
     616           0 :    hi = lo--;
     617             :    /*printf ("interp between %d and %d\n", lo, hi);*/
     618           0 :    for (j=start;j<end;j++)
     619             :    {
     620             :       int bits1j, bits2j;
     621           0 :       int N = m->eBands[j+1]-m->eBands[j];
     622           0 :       bits1j = C*N*m->allocVectors[lo*len+j]<<LM>>2;
     623           0 :       bits2j = hi>=m->nbAllocVectors ?
     624           0 :             cap[j] : C*N*m->allocVectors[hi*len+j]<<LM>>2;
     625           0 :       if (bits1j > 0)
     626           0 :          bits1j = IMAX(0, bits1j + trim_offset[j]);
     627           0 :       if (bits2j > 0)
     628           0 :          bits2j = IMAX(0, bits2j + trim_offset[j]);
     629           0 :       if (lo > 0)
     630           0 :          bits1j += offsets[j];
     631           0 :       bits2j += offsets[j];
     632           0 :       if (offsets[j]>0)
     633           0 :          skip_start = j;
     634           0 :       bits2j = IMAX(0,bits2j-bits1j);
     635           0 :       bits1[j] = bits1j;
     636           0 :       bits2[j] = bits2j;
     637             :    }
     638           0 :    codedBands = interp_bits2pulses(m, start, end, skip_start, bits1, bits2, thresh, cap,
     639             :          total, balance, skip_rsv, intensity, intensity_rsv, dual_stereo, dual_stereo_rsv,
     640             :          pulses, ebits, fine_priority, C, LM, ec, encode, prev, signalBandwidth);
     641             :    RESTORE_STACK;
     642           0 :    return codedBands;
     643             : }
     644             : 

Generated by: LCOV version 1.13