LCOV - code coverage report
Current view: top level - media/libopus/celt - quant_bands.c (source / functions) Hit Total Coverage
Test: output.info Lines: 0 197 0.0 %
Date: 2017-07-14 16:53:18 Functions: 0 9 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 "quant_bands.h"
      34             : #include "laplace.h"
      35             : #include <math.h>
      36             : #include "os_support.h"
      37             : #include "arch.h"
      38             : #include "mathops.h"
      39             : #include "stack_alloc.h"
      40             : #include "rate.h"
      41             : 
      42             : #ifdef FIXED_POINT
      43             : /* Mean energy in each band quantized in Q4 */
      44             : const signed char eMeans[25] = {
      45             :       103,100, 92, 85, 81,
      46             :        77, 72, 70, 78, 75,
      47             :        73, 71, 78, 74, 69,
      48             :        72, 70, 74, 76, 71,
      49             :        60, 60, 60, 60, 60
      50             : };
      51             : #else
      52             : /* Mean energy in each band quantized in Q4 and converted back to float */
      53             : const opus_val16 eMeans[25] = {
      54             :       6.437500f, 6.250000f, 5.750000f, 5.312500f, 5.062500f,
      55             :       4.812500f, 4.500000f, 4.375000f, 4.875000f, 4.687500f,
      56             :       4.562500f, 4.437500f, 4.875000f, 4.625000f, 4.312500f,
      57             :       4.500000f, 4.375000f, 4.625000f, 4.750000f, 4.437500f,
      58             :       3.750000f, 3.750000f, 3.750000f, 3.750000f, 3.750000f
      59             : };
      60             : #endif
      61             : /* prediction coefficients: 0.9, 0.8, 0.65, 0.5 */
      62             : #ifdef FIXED_POINT
      63             : static const opus_val16 pred_coef[4] = {29440, 26112, 21248, 16384};
      64             : static const opus_val16 beta_coef[4] = {30147, 22282, 12124, 6554};
      65             : static const opus_val16 beta_intra = 4915;
      66             : #else
      67             : static const opus_val16 pred_coef[4] = {29440/32768., 26112/32768., 21248/32768., 16384/32768.};
      68             : static const opus_val16 beta_coef[4] = {30147/32768., 22282/32768., 12124/32768., 6554/32768.};
      69             : static const opus_val16 beta_intra = 4915/32768.;
      70             : #endif
      71             : 
      72             : /*Parameters of the Laplace-like probability models used for the coarse energy.
      73             :   There is one pair of parameters for each frame size, prediction type
      74             :    (inter/intra), and band number.
      75             :   The first number of each pair is the probability of 0, and the second is the
      76             :    decay rate, both in Q8 precision.*/
      77             : static const unsigned char e_prob_model[4][2][42] = {
      78             :    /*120 sample frames.*/
      79             :    {
      80             :       /*Inter*/
      81             :       {
      82             :           72, 127,  65, 129,  66, 128,  65, 128,  64, 128,  62, 128,  64, 128,
      83             :           64, 128,  92,  78,  92,  79,  92,  78,  90,  79, 116,  41, 115,  40,
      84             :          114,  40, 132,  26, 132,  26, 145,  17, 161,  12, 176,  10, 177,  11
      85             :       },
      86             :       /*Intra*/
      87             :       {
      88             :           24, 179,  48, 138,  54, 135,  54, 132,  53, 134,  56, 133,  55, 132,
      89             :           55, 132,  61, 114,  70,  96,  74,  88,  75,  88,  87,  74,  89,  66,
      90             :           91,  67, 100,  59, 108,  50, 120,  40, 122,  37,  97,  43,  78,  50
      91             :       }
      92             :    },
      93             :    /*240 sample frames.*/
      94             :    {
      95             :       /*Inter*/
      96             :       {
      97             :           83,  78,  84,  81,  88,  75,  86,  74,  87,  71,  90,  73,  93,  74,
      98             :           93,  74, 109,  40, 114,  36, 117,  34, 117,  34, 143,  17, 145,  18,
      99             :          146,  19, 162,  12, 165,  10, 178,   7, 189,   6, 190,   8, 177,   9
     100             :       },
     101             :       /*Intra*/
     102             :       {
     103             :           23, 178,  54, 115,  63, 102,  66,  98,  69,  99,  74,  89,  71,  91,
     104             :           73,  91,  78,  89,  86,  80,  92,  66,  93,  64, 102,  59, 103,  60,
     105             :          104,  60, 117,  52, 123,  44, 138,  35, 133,  31,  97,  38,  77,  45
     106             :       }
     107             :    },
     108             :    /*480 sample frames.*/
     109             :    {
     110             :       /*Inter*/
     111             :       {
     112             :           61,  90,  93,  60, 105,  42, 107,  41, 110,  45, 116,  38, 113,  38,
     113             :          112,  38, 124,  26, 132,  27, 136,  19, 140,  20, 155,  14, 159,  16,
     114             :          158,  18, 170,  13, 177,  10, 187,   8, 192,   6, 175,   9, 159,  10
     115             :       },
     116             :       /*Intra*/
     117             :       {
     118             :           21, 178,  59, 110,  71,  86,  75,  85,  84,  83,  91,  66,  88,  73,
     119             :           87,  72,  92,  75,  98,  72, 105,  58, 107,  54, 115,  52, 114,  55,
     120             :          112,  56, 129,  51, 132,  40, 150,  33, 140,  29,  98,  35,  77,  42
     121             :       }
     122             :    },
     123             :    /*960 sample frames.*/
     124             :    {
     125             :       /*Inter*/
     126             :       {
     127             :           42, 121,  96,  66, 108,  43, 111,  40, 117,  44, 123,  32, 120,  36,
     128             :          119,  33, 127,  33, 134,  34, 139,  21, 147,  23, 152,  20, 158,  25,
     129             :          154,  26, 166,  21, 173,  16, 184,  13, 184,  10, 150,  13, 139,  15
     130             :       },
     131             :       /*Intra*/
     132             :       {
     133             :           22, 178,  63, 114,  74,  82,  84,  83,  92,  82, 103,  62,  96,  72,
     134             :           96,  67, 101,  73, 107,  72, 113,  55, 118,  52, 125,  52, 118,  52,
     135             :          117,  55, 135,  49, 137,  39, 157,  32, 145,  29,  97,  33,  77,  40
     136             :       }
     137             :    }
     138             : };
     139             : 
     140             : static const unsigned char small_energy_icdf[3]={2,1,0};
     141             : 
     142           0 : static opus_val32 loss_distortion(const opus_val16 *eBands, opus_val16 *oldEBands, int start, int end, int len, int C)
     143             : {
     144             :    int c, i;
     145           0 :    opus_val32 dist = 0;
     146           0 :    c=0; do {
     147           0 :       for (i=start;i<end;i++)
     148             :       {
     149           0 :          opus_val16 d = SUB16(SHR16(eBands[i+c*len], 3), SHR16(oldEBands[i+c*len], 3));
     150           0 :          dist = MAC16_16(dist, d,d);
     151             :       }
     152           0 :    } while (++c<C);
     153           0 :    return MIN32(200,SHR32(dist,2*DB_SHIFT-6));
     154             : }
     155             : 
     156           0 : static int quant_coarse_energy_impl(const CELTMode *m, int start, int end,
     157             :       const opus_val16 *eBands, opus_val16 *oldEBands,
     158             :       opus_int32 budget, opus_int32 tell,
     159             :       const unsigned char *prob_model, opus_val16 *error, ec_enc *enc,
     160             :       int C, int LM, int intra, opus_val16 max_decay, int lfe)
     161             : {
     162             :    int i, c;
     163           0 :    int badness = 0;
     164           0 :    opus_val32 prev[2] = {0,0};
     165             :    opus_val16 coef;
     166             :    opus_val16 beta;
     167             : 
     168           0 :    if (tell+3 <= budget)
     169           0 :       ec_enc_bit_logp(enc, intra, 3);
     170           0 :    if (intra)
     171             :    {
     172           0 :       coef = 0;
     173           0 :       beta = beta_intra;
     174             :    } else {
     175           0 :       beta = beta_coef[LM];
     176           0 :       coef = pred_coef[LM];
     177             :    }
     178             : 
     179             :    /* Encode at a fixed coarse resolution */
     180           0 :    for (i=start;i<end;i++)
     181             :    {
     182           0 :       c=0;
     183             :       do {
     184             :          int bits_left;
     185             :          int qi, qi0;
     186             :          opus_val32 q;
     187             :          opus_val16 x;
     188             :          opus_val32 f, tmp;
     189             :          opus_val16 oldE;
     190             :          opus_val16 decay_bound;
     191           0 :          x = eBands[i+c*m->nbEBands];
     192           0 :          oldE = MAX16(-QCONST16(9.f,DB_SHIFT), oldEBands[i+c*m->nbEBands]);
     193             : #ifdef FIXED_POINT
     194             :          f = SHL32(EXTEND32(x),7) - PSHR32(MULT16_16(coef,oldE), 8) - prev[c];
     195             :          /* Rounding to nearest integer here is really important! */
     196             :          qi = (f+QCONST32(.5f,DB_SHIFT+7))>>(DB_SHIFT+7);
     197             :          decay_bound = EXTRACT16(MAX32(-QCONST16(28.f,DB_SHIFT),
     198             :                SUB32((opus_val32)oldEBands[i+c*m->nbEBands],max_decay)));
     199             : #else
     200           0 :          f = x-coef*oldE-prev[c];
     201             :          /* Rounding to nearest integer here is really important! */
     202           0 :          qi = (int)floor(.5f+f);
     203           0 :          decay_bound = MAX16(-QCONST16(28.f,DB_SHIFT), oldEBands[i+c*m->nbEBands]) - max_decay;
     204             : #endif
     205             :          /* Prevent the energy from going down too quickly (e.g. for bands
     206             :             that have just one bin) */
     207           0 :          if (qi < 0 && x < decay_bound)
     208             :          {
     209           0 :             qi += (int)SHR16(SUB16(decay_bound,x), DB_SHIFT);
     210           0 :             if (qi > 0)
     211           0 :                qi = 0;
     212             :          }
     213           0 :          qi0 = qi;
     214             :          /* If we don't have enough bits to encode all the energy, just assume
     215             :              something safe. */
     216           0 :          tell = ec_tell(enc);
     217           0 :          bits_left = budget-tell-3*C*(end-i);
     218           0 :          if (i!=start && bits_left < 30)
     219             :          {
     220           0 :             if (bits_left < 24)
     221           0 :                qi = IMIN(1, qi);
     222           0 :             if (bits_left < 16)
     223           0 :                qi = IMAX(-1, qi);
     224             :          }
     225           0 :          if (lfe && i>=2)
     226           0 :             qi = IMIN(qi, 0);
     227           0 :          if (budget-tell >= 15)
     228             :          {
     229             :             int pi;
     230           0 :             pi = 2*IMIN(i,20);
     231           0 :             ec_laplace_encode(enc, &qi,
     232           0 :                   prob_model[pi]<<7, prob_model[pi+1]<<6);
     233             :          }
     234           0 :          else if(budget-tell >= 2)
     235             :          {
     236           0 :             qi = IMAX(-1, IMIN(qi, 1));
     237           0 :             ec_enc_icdf(enc, 2*qi^-(qi<0), small_energy_icdf, 2);
     238             :          }
     239           0 :          else if(budget-tell >= 1)
     240             :          {
     241           0 :             qi = IMIN(0, qi);
     242           0 :             ec_enc_bit_logp(enc, -qi, 1);
     243             :          }
     244             :          else
     245           0 :             qi = -1;
     246           0 :          error[i+c*m->nbEBands] = PSHR32(f,7) - SHL16(qi,DB_SHIFT);
     247           0 :          badness += abs(qi0-qi);
     248           0 :          q = (opus_val32)SHL32(EXTEND32(qi),DB_SHIFT);
     249             : 
     250           0 :          tmp = PSHR32(MULT16_16(coef,oldE),8) + prev[c] + SHL32(q,7);
     251             : #ifdef FIXED_POINT
     252             :          tmp = MAX32(-QCONST32(28.f, DB_SHIFT+7), tmp);
     253             : #endif
     254           0 :          oldEBands[i+c*m->nbEBands] = PSHR32(tmp, 7);
     255           0 :          prev[c] = prev[c] + SHL32(q,7) - MULT16_16(beta,PSHR32(q,8));
     256           0 :       } while (++c < C);
     257             :    }
     258           0 :    return lfe ? 0 : badness;
     259             : }
     260             : 
     261           0 : void quant_coarse_energy(const CELTMode *m, int start, int end, int effEnd,
     262             :       const opus_val16 *eBands, opus_val16 *oldEBands, opus_uint32 budget,
     263             :       opus_val16 *error, ec_enc *enc, int C, int LM, int nbAvailableBytes,
     264             :       int force_intra, opus_val32 *delayedIntra, int two_pass, int loss_rate, int lfe)
     265             : {
     266             :    int intra;
     267             :    opus_val16 max_decay;
     268             :    VARDECL(opus_val16, oldEBands_intra);
     269             :    VARDECL(opus_val16, error_intra);
     270             :    ec_enc enc_start_state;
     271             :    opus_uint32 tell;
     272           0 :    int badness1=0;
     273             :    opus_int32 intra_bias;
     274             :    opus_val32 new_distortion;
     275             :    SAVE_STACK;
     276             : 
     277           0 :    intra = force_intra || (!two_pass && *delayedIntra>2*C*(end-start) && nbAvailableBytes > (end-start)*C);
     278           0 :    intra_bias = (opus_int32)((budget**delayedIntra*loss_rate)/(C*512));
     279           0 :    new_distortion = loss_distortion(eBands, oldEBands, start, effEnd, m->nbEBands, C);
     280             : 
     281           0 :    tell = ec_tell(enc);
     282           0 :    if (tell+3 > budget)
     283           0 :       two_pass = intra = 0;
     284             : 
     285           0 :    max_decay = QCONST16(16.f,DB_SHIFT);
     286           0 :    if (end-start>10)
     287             :    {
     288             : #ifdef FIXED_POINT
     289             :       max_decay = MIN32(max_decay, SHL32(EXTEND32(nbAvailableBytes),DB_SHIFT-3));
     290             : #else
     291           0 :       max_decay = MIN32(max_decay, .125f*nbAvailableBytes);
     292             : #endif
     293             :    }
     294           0 :    if (lfe)
     295           0 :       max_decay = QCONST16(3.f,DB_SHIFT);
     296           0 :    enc_start_state = *enc;
     297             : 
     298           0 :    ALLOC(oldEBands_intra, C*m->nbEBands, opus_val16);
     299           0 :    ALLOC(error_intra, C*m->nbEBands, opus_val16);
     300           0 :    OPUS_COPY(oldEBands_intra, oldEBands, C*m->nbEBands);
     301             : 
     302           0 :    if (two_pass || intra)
     303             :    {
     304           0 :       badness1 = quant_coarse_energy_impl(m, start, end, eBands, oldEBands_intra, budget,
     305           0 :             tell, e_prob_model[LM][1], error_intra, enc, C, LM, 1, max_decay, lfe);
     306             :    }
     307             : 
     308           0 :    if (!intra)
     309             :    {
     310             :       unsigned char *intra_buf;
     311             :       ec_enc enc_intra_state;
     312             :       opus_int32 tell_intra;
     313             :       opus_uint32 nstart_bytes;
     314             :       opus_uint32 nintra_bytes;
     315             :       opus_uint32 save_bytes;
     316             :       int badness2;
     317             :       VARDECL(unsigned char, intra_bits);
     318             : 
     319           0 :       tell_intra = ec_tell_frac(enc);
     320             : 
     321           0 :       enc_intra_state = *enc;
     322             : 
     323           0 :       nstart_bytes = ec_range_bytes(&enc_start_state);
     324           0 :       nintra_bytes = ec_range_bytes(&enc_intra_state);
     325           0 :       intra_buf = ec_get_buffer(&enc_intra_state) + nstart_bytes;
     326           0 :       save_bytes = nintra_bytes-nstart_bytes;
     327           0 :       if (save_bytes == 0)
     328           0 :          save_bytes = ALLOC_NONE;
     329           0 :       ALLOC(intra_bits, save_bytes, unsigned char);
     330             :       /* Copy bits from intra bit-stream */
     331           0 :       OPUS_COPY(intra_bits, intra_buf, nintra_bytes - nstart_bytes);
     332             : 
     333           0 :       *enc = enc_start_state;
     334             : 
     335           0 :       badness2 = quant_coarse_energy_impl(m, start, end, eBands, oldEBands, budget,
     336           0 :             tell, e_prob_model[LM][intra], error, enc, C, LM, 0, max_decay, lfe);
     337             : 
     338           0 :       if (two_pass && (badness1 < badness2 || (badness1 == badness2 && ((opus_int32)ec_tell_frac(enc))+intra_bias > tell_intra)))
     339             :       {
     340           0 :          *enc = enc_intra_state;
     341             :          /* Copy intra bits to bit-stream */
     342           0 :          OPUS_COPY(intra_buf, intra_bits, nintra_bytes - nstart_bytes);
     343           0 :          OPUS_COPY(oldEBands, oldEBands_intra, C*m->nbEBands);
     344           0 :          OPUS_COPY(error, error_intra, C*m->nbEBands);
     345           0 :          intra = 1;
     346             :       }
     347             :    } else {
     348           0 :       OPUS_COPY(oldEBands, oldEBands_intra, C*m->nbEBands);
     349           0 :       OPUS_COPY(error, error_intra, C*m->nbEBands);
     350             :    }
     351             : 
     352           0 :    if (intra)
     353           0 :       *delayedIntra = new_distortion;
     354             :    else
     355           0 :       *delayedIntra = ADD32(MULT16_32_Q15(MULT16_16_Q15(pred_coef[LM], pred_coef[LM]),*delayedIntra),
     356             :             new_distortion);
     357             : 
     358             :    RESTORE_STACK;
     359           0 : }
     360             : 
     361           0 : void quant_fine_energy(const CELTMode *m, int start, int end, opus_val16 *oldEBands, opus_val16 *error, int *fine_quant, ec_enc *enc, int C)
     362             : {
     363             :    int i, c;
     364             : 
     365             :    /* Encode finer resolution */
     366           0 :    for (i=start;i<end;i++)
     367             :    {
     368           0 :       opus_int16 frac = 1<<fine_quant[i];
     369           0 :       if (fine_quant[i] <= 0)
     370           0 :          continue;
     371           0 :       c=0;
     372             :       do {
     373             :          int q2;
     374             :          opus_val16 offset;
     375             : #ifdef FIXED_POINT
     376             :          /* Has to be without rounding */
     377             :          q2 = (error[i+c*m->nbEBands]+QCONST16(.5f,DB_SHIFT))>>(DB_SHIFT-fine_quant[i]);
     378             : #else
     379           0 :          q2 = (int)floor((error[i+c*m->nbEBands]+.5f)*frac);
     380             : #endif
     381           0 :          if (q2 > frac-1)
     382           0 :             q2 = frac-1;
     383           0 :          if (q2<0)
     384           0 :             q2 = 0;
     385           0 :          ec_enc_bits(enc, q2, fine_quant[i]);
     386             : #ifdef FIXED_POINT
     387             :          offset = SUB16(SHR32(SHL32(EXTEND32(q2),DB_SHIFT)+QCONST16(.5f,DB_SHIFT),fine_quant[i]),QCONST16(.5f,DB_SHIFT));
     388             : #else
     389           0 :          offset = (q2+.5f)*(1<<(14-fine_quant[i]))*(1.f/16384) - .5f;
     390             : #endif
     391           0 :          oldEBands[i+c*m->nbEBands] += offset;
     392           0 :          error[i+c*m->nbEBands] -= offset;
     393             :          /*printf ("%f ", error[i] - offset);*/
     394           0 :       } while (++c < C);
     395             :    }
     396           0 : }
     397             : 
     398           0 : void quant_energy_finalise(const CELTMode *m, int start, int end, opus_val16 *oldEBands, opus_val16 *error, int *fine_quant, int *fine_priority, int bits_left, ec_enc *enc, int C)
     399             : {
     400             :    int i, prio, c;
     401             : 
     402             :    /* Use up the remaining bits */
     403           0 :    for (prio=0;prio<2;prio++)
     404             :    {
     405           0 :       for (i=start;i<end && bits_left>=C ;i++)
     406             :       {
     407           0 :          if (fine_quant[i] >= MAX_FINE_BITS || fine_priority[i]!=prio)
     408           0 :             continue;
     409           0 :          c=0;
     410             :          do {
     411             :             int q2;
     412             :             opus_val16 offset;
     413           0 :             q2 = error[i+c*m->nbEBands]<0 ? 0 : 1;
     414           0 :             ec_enc_bits(enc, q2, 1);
     415             : #ifdef FIXED_POINT
     416             :             offset = SHR16(SHL16(q2,DB_SHIFT)-QCONST16(.5f,DB_SHIFT),fine_quant[i]+1);
     417             : #else
     418           0 :             offset = (q2-.5f)*(1<<(14-fine_quant[i]-1))*(1.f/16384);
     419             : #endif
     420           0 :             oldEBands[i+c*m->nbEBands] += offset;
     421           0 :             error[i+c*m->nbEBands] -= offset;
     422           0 :             bits_left--;
     423           0 :          } while (++c < C);
     424             :       }
     425             :    }
     426           0 : }
     427             : 
     428           0 : void unquant_coarse_energy(const CELTMode *m, int start, int end, opus_val16 *oldEBands, int intra, ec_dec *dec, int C, int LM)
     429             : {
     430           0 :    const unsigned char *prob_model = e_prob_model[LM][intra];
     431             :    int i, c;
     432           0 :    opus_val32 prev[2] = {0, 0};
     433             :    opus_val16 coef;
     434             :    opus_val16 beta;
     435             :    opus_int32 budget;
     436             :    opus_int32 tell;
     437             : 
     438           0 :    if (intra)
     439             :    {
     440           0 :       coef = 0;
     441           0 :       beta = beta_intra;
     442             :    } else {
     443           0 :       beta = beta_coef[LM];
     444           0 :       coef = pred_coef[LM];
     445             :    }
     446             : 
     447           0 :    budget = dec->storage*8;
     448             : 
     449             :    /* Decode at a fixed coarse resolution */
     450           0 :    for (i=start;i<end;i++)
     451             :    {
     452           0 :       c=0;
     453             :       do {
     454             :          int qi;
     455             :          opus_val32 q;
     456             :          opus_val32 tmp;
     457             :          /* It would be better to express this invariant as a
     458             :             test on C at function entry, but that isn't enough
     459             :             to make the static analyzer happy. */
     460           0 :          celt_assert(c<2);
     461           0 :          tell = ec_tell(dec);
     462           0 :          if(budget-tell>=15)
     463             :          {
     464             :             int pi;
     465           0 :             pi = 2*IMIN(i,20);
     466           0 :             qi = ec_laplace_decode(dec,
     467           0 :                   prob_model[pi]<<7, prob_model[pi+1]<<6);
     468             :          }
     469           0 :          else if(budget-tell>=2)
     470             :          {
     471           0 :             qi = ec_dec_icdf(dec, small_energy_icdf, 2);
     472           0 :             qi = (qi>>1)^-(qi&1);
     473             :          }
     474           0 :          else if(budget-tell>=1)
     475             :          {
     476           0 :             qi = -ec_dec_bit_logp(dec, 1);
     477             :          }
     478             :          else
     479           0 :             qi = -1;
     480           0 :          q = (opus_val32)SHL32(EXTEND32(qi),DB_SHIFT);
     481             : 
     482           0 :          oldEBands[i+c*m->nbEBands] = MAX16(-QCONST16(9.f,DB_SHIFT), oldEBands[i+c*m->nbEBands]);
     483           0 :          tmp = PSHR32(MULT16_16(coef,oldEBands[i+c*m->nbEBands]),8) + prev[c] + SHL32(q,7);
     484             : #ifdef FIXED_POINT
     485             :          tmp = MAX32(-QCONST32(28.f, DB_SHIFT+7), tmp);
     486             : #endif
     487           0 :          oldEBands[i+c*m->nbEBands] = PSHR32(tmp, 7);
     488           0 :          prev[c] = prev[c] + SHL32(q,7) - MULT16_16(beta,PSHR32(q,8));
     489           0 :       } while (++c < C);
     490             :    }
     491           0 : }
     492             : 
     493           0 : void unquant_fine_energy(const CELTMode *m, int start, int end, opus_val16 *oldEBands, int *fine_quant, ec_dec *dec, int C)
     494             : {
     495             :    int i, c;
     496             :    /* Decode finer resolution */
     497           0 :    for (i=start;i<end;i++)
     498             :    {
     499           0 :       if (fine_quant[i] <= 0)
     500           0 :          continue;
     501           0 :       c=0;
     502             :       do {
     503             :          int q2;
     504             :          opus_val16 offset;
     505           0 :          q2 = ec_dec_bits(dec, fine_quant[i]);
     506             : #ifdef FIXED_POINT
     507             :          offset = SUB16(SHR32(SHL32(EXTEND32(q2),DB_SHIFT)+QCONST16(.5f,DB_SHIFT),fine_quant[i]),QCONST16(.5f,DB_SHIFT));
     508             : #else
     509           0 :          offset = (q2+.5f)*(1<<(14-fine_quant[i]))*(1.f/16384) - .5f;
     510             : #endif
     511           0 :          oldEBands[i+c*m->nbEBands] += offset;
     512           0 :       } while (++c < C);
     513             :    }
     514           0 : }
     515             : 
     516           0 : void unquant_energy_finalise(const CELTMode *m, int start, int end, opus_val16 *oldEBands, int *fine_quant,  int *fine_priority, int bits_left, ec_dec *dec, int C)
     517             : {
     518             :    int i, prio, c;
     519             : 
     520             :    /* Use up the remaining bits */
     521           0 :    for (prio=0;prio<2;prio++)
     522             :    {
     523           0 :       for (i=start;i<end && bits_left>=C ;i++)
     524             :       {
     525           0 :          if (fine_quant[i] >= MAX_FINE_BITS || fine_priority[i]!=prio)
     526           0 :             continue;
     527           0 :          c=0;
     528             :          do {
     529             :             int q2;
     530             :             opus_val16 offset;
     531           0 :             q2 = ec_dec_bits(dec, 1);
     532             : #ifdef FIXED_POINT
     533             :             offset = SHR16(SHL16(q2,DB_SHIFT)-QCONST16(.5f,DB_SHIFT),fine_quant[i]+1);
     534             : #else
     535           0 :             offset = (q2-.5f)*(1<<(14-fine_quant[i]-1))*(1.f/16384);
     536             : #endif
     537           0 :             oldEBands[i+c*m->nbEBands] += offset;
     538           0 :             bits_left--;
     539           0 :          } while (++c < C);
     540             :       }
     541             :    }
     542           0 : }
     543             : 
     544           0 : void amp2Log2(const CELTMode *m, int effEnd, int end,
     545             :       celt_ener *bandE, opus_val16 *bandLogE, int C)
     546             : {
     547             :    int c, i;
     548           0 :    c=0;
     549             :    do {
     550           0 :       for (i=0;i<effEnd;i++)
     551             :       {
     552           0 :          bandLogE[i+c*m->nbEBands] =
     553           0 :                celt_log2(bandE[i+c*m->nbEBands])
     554           0 :                - SHL16((opus_val16)eMeans[i],6);
     555             : #ifdef FIXED_POINT
     556             :          /* Compensate for bandE[] being Q12 but celt_log2() taking a Q14 input. */
     557             :          bandLogE[i+c*m->nbEBands] += QCONST16(2.f, DB_SHIFT);
     558             : #endif
     559             :       }
     560           0 :       for (i=effEnd;i<end;i++)
     561           0 :          bandLogE[c*m->nbEBands+i] = -QCONST16(14.f,DB_SHIFT);
     562           0 :    } while (++c < C);
     563           0 : }

Generated by: LCOV version 1.13