Home | History | Annotate | Download | only in celt
      1 /* Copyright (c) 2007-2008 CSIRO
      2    Copyright (c) 2007-2010 Xiph.Org Foundation
      3    Copyright (c) 2008 Gregory Maxwell
      4    Written by Jean-Marc Valin and Gregory Maxwell */
      5 /*
      6    Redistribution and use in source and binary forms, with or without
      7    modification, are permitted provided that the following conditions
      8    are met:
      9 
     10    - Redistributions of source code must retain the above copyright
     11    notice, this list of conditions and the following disclaimer.
     12 
     13    - Redistributions in binary form must reproduce the above copyright
     14    notice, this list of conditions and the following disclaimer in the
     15    documentation and/or other materials provided with the distribution.
     16 
     17    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     18    ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     19    LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
     20    A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
     21    OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
     22    EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
     23    PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
     24    PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
     25    LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
     26    NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
     27    SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     28 */
     29 
     30 #ifdef HAVE_CONFIG_H
     31 #include "config.h"
     32 #endif
     33 
     34 #define CELT_ENCODER_C
     35 
     36 #include "cpu_support.h"
     37 #include "os_support.h"
     38 #include "mdct.h"
     39 #include <math.h>
     40 #include "celt.h"
     41 #include "pitch.h"
     42 #include "bands.h"
     43 #include "modes.h"
     44 #include "entcode.h"
     45 #include "quant_bands.h"
     46 #include "rate.h"
     47 #include "stack_alloc.h"
     48 #include "mathops.h"
     49 #include "float_cast.h"
     50 #include <stdarg.h>
     51 #include "celt_lpc.h"
     52 #include "vq.h"
     53 
     54 
     55 /** Encoder state
     56  @brief Encoder state
     57  */
     58 struct OpusCustomEncoder {
     59    const OpusCustomMode *mode;     /**< Mode used by the encoder */
     60    int overlap;
     61    int channels;
     62    int stream_channels;
     63 
     64    int force_intra;
     65    int clip;
     66    int disable_pf;
     67    int complexity;
     68    int upsample;
     69    int start, end;
     70 
     71    opus_int32 bitrate;
     72    int vbr;
     73    int signalling;
     74    int constrained_vbr;      /* If zero, VBR can do whatever it likes with the rate */
     75    int loss_rate;
     76    int lsb_depth;
     77    int variable_duration;
     78    int lfe;
     79    int arch;
     80 
     81    /* Everything beyond this point gets cleared on a reset */
     82 #define ENCODER_RESET_START rng
     83 
     84    opus_uint32 rng;
     85    int spread_decision;
     86    opus_val32 delayedIntra;
     87    int tonal_average;
     88    int lastCodedBands;
     89    int hf_average;
     90    int tapset_decision;
     91 
     92    int prefilter_period;
     93    opus_val16 prefilter_gain;
     94    int prefilter_tapset;
     95 #ifdef RESYNTH
     96    int prefilter_period_old;
     97    opus_val16 prefilter_gain_old;
     98    int prefilter_tapset_old;
     99 #endif
    100    int consec_transient;
    101    AnalysisInfo analysis;
    102 
    103    opus_val32 preemph_memE[2];
    104    opus_val32 preemph_memD[2];
    105 
    106    /* VBR-related parameters */
    107    opus_int32 vbr_reservoir;
    108    opus_int32 vbr_drift;
    109    opus_int32 vbr_offset;
    110    opus_int32 vbr_count;
    111    opus_val32 overlap_max;
    112    opus_val16 stereo_saving;
    113    int intensity;
    114    opus_val16 *energy_mask;
    115    opus_val16 spec_avg;
    116 
    117 #ifdef RESYNTH
    118    /* +MAX_PERIOD/2 to make space for overlap */
    119    celt_sig syn_mem[2][2*MAX_PERIOD+MAX_PERIOD/2];
    120 #endif
    121 
    122    celt_sig in_mem[1]; /* Size = channels*mode->overlap */
    123    /* celt_sig prefilter_mem[],  Size = channels*COMBFILTER_MAXPERIOD */
    124    /* opus_val16 oldBandE[],     Size = channels*mode->nbEBands */
    125    /* opus_val16 oldLogE[],      Size = channels*mode->nbEBands */
    126    /* opus_val16 oldLogE2[],     Size = channels*mode->nbEBands */
    127 };
    128 
    129 int celt_encoder_get_size(int channels)
    130 {
    131    CELTMode *mode = opus_custom_mode_create(48000, 960, NULL);
    132    return opus_custom_encoder_get_size(mode, channels);
    133 }
    134 
    135 OPUS_CUSTOM_NOSTATIC int opus_custom_encoder_get_size(const CELTMode *mode, int channels)
    136 {
    137    int size = sizeof(struct CELTEncoder)
    138          + (channels*mode->overlap-1)*sizeof(celt_sig)    /* celt_sig in_mem[channels*mode->overlap]; */
    139          + channels*COMBFILTER_MAXPERIOD*sizeof(celt_sig) /* celt_sig prefilter_mem[channels*COMBFILTER_MAXPERIOD]; */
    140          + 3*channels*mode->nbEBands*sizeof(opus_val16);  /* opus_val16 oldBandE[channels*mode->nbEBands]; */
    141                                                           /* opus_val16 oldLogE[channels*mode->nbEBands]; */
    142                                                           /* opus_val16 oldLogE2[channels*mode->nbEBands]; */
    143    return size;
    144 }
    145 
    146 #ifdef CUSTOM_MODES
    147 CELTEncoder *opus_custom_encoder_create(const CELTMode *mode, int channels, int *error)
    148 {
    149    int ret;
    150    CELTEncoder *st = (CELTEncoder *)opus_alloc(opus_custom_encoder_get_size(mode, channels));
    151    /* init will handle the NULL case */
    152    ret = opus_custom_encoder_init(st, mode, channels);
    153    if (ret != OPUS_OK)
    154    {
    155       opus_custom_encoder_destroy(st);
    156       st = NULL;
    157    }
    158    if (error)
    159       *error = ret;
    160    return st;
    161 }
    162 #endif /* CUSTOM_MODES */
    163 
    164 int celt_encoder_init(CELTEncoder *st, opus_int32 sampling_rate, int channels)
    165 {
    166    int ret;
    167    ret = opus_custom_encoder_init(st, opus_custom_mode_create(48000, 960, NULL), channels);
    168    if (ret != OPUS_OK)
    169       return ret;
    170    st->upsample = resampling_factor(sampling_rate);
    171    return OPUS_OK;
    172 }
    173 
    174 OPUS_CUSTOM_NOSTATIC int opus_custom_encoder_init(CELTEncoder *st, const CELTMode *mode, int channels)
    175 {
    176    if (channels < 0 || channels > 2)
    177       return OPUS_BAD_ARG;
    178 
    179    if (st==NULL || mode==NULL)
    180       return OPUS_ALLOC_FAIL;
    181 
    182    OPUS_CLEAR((char*)st, opus_custom_encoder_get_size(mode, channels));
    183 
    184    st->mode = mode;
    185    st->overlap = mode->overlap;
    186    st->stream_channels = st->channels = channels;
    187 
    188    st->upsample = 1;
    189    st->start = 0;
    190    st->end = st->mode->effEBands;
    191    st->signalling = 1;
    192 
    193    st->arch = opus_select_arch();
    194 
    195    st->constrained_vbr = 1;
    196    st->clip = 1;
    197 
    198    st->bitrate = OPUS_BITRATE_MAX;
    199    st->vbr = 0;
    200    st->force_intra  = 0;
    201    st->complexity = 5;
    202    st->lsb_depth=24;
    203 
    204    opus_custom_encoder_ctl(st, OPUS_RESET_STATE);
    205 
    206    return OPUS_OK;
    207 }
    208 
    209 #ifdef CUSTOM_MODES
    210 void opus_custom_encoder_destroy(CELTEncoder *st)
    211 {
    212    opus_free(st);
    213 }
    214 #endif /* CUSTOM_MODES */
    215 
    216 
    217 static int transient_analysis(const opus_val32 * OPUS_RESTRICT in, int len, int C,
    218                               opus_val16 *tf_estimate, int *tf_chan)
    219 {
    220    int i;
    221    VARDECL(opus_val16, tmp);
    222    opus_val32 mem0,mem1;
    223    int is_transient = 0;
    224    opus_int32 mask_metric = 0;
    225    int c;
    226    opus_val16 tf_max;
    227    int len2;
    228    /* Table of 6*64/x, trained on real data to minimize the average error */
    229    static const unsigned char inv_table[128] = {
    230          255,255,156,110, 86, 70, 59, 51, 45, 40, 37, 33, 31, 28, 26, 25,
    231           23, 22, 21, 20, 19, 18, 17, 16, 16, 15, 15, 14, 13, 13, 12, 12,
    232           12, 12, 11, 11, 11, 10, 10, 10,  9,  9,  9,  9,  9,  9,  8,  8,
    233            8,  8,  8,  7,  7,  7,  7,  7,  7,  6,  6,  6,  6,  6,  6,  6,
    234            6,  6,  6,  6,  6,  6,  6,  6,  6,  5,  5,  5,  5,  5,  5,  5,
    235            5,  5,  5,  5,  5,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
    236            4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  3,  3,
    237            3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  2,
    238    };
    239    SAVE_STACK;
    240    ALLOC(tmp, len, opus_val16);
    241 
    242    len2=len/2;
    243    tf_max = 0;
    244    for (c=0;c<C;c++)
    245    {
    246       opus_val32 mean;
    247       opus_int32 unmask=0;
    248       opus_val32 norm;
    249       opus_val16 maxE;
    250       mem0=0;
    251       mem1=0;
    252       /* High-pass filter: (1 - 2*z^-1 + z^-2) / (1 - z^-1 + .5*z^-2) */
    253       for (i=0;i<len;i++)
    254       {
    255          opus_val32 x,y;
    256          x = SHR32(in[i+c*len],SIG_SHIFT);
    257          y = ADD32(mem0, x);
    258 #ifdef FIXED_POINT
    259          mem0 = mem1 + y - SHL32(x,1);
    260          mem1 = x - SHR32(y,1);
    261 #else
    262          mem0 = mem1 + y - 2*x;
    263          mem1 = x - .5f*y;
    264 #endif
    265          tmp[i] = EXTRACT16(SHR32(y,2));
    266          /*printf("%f ", tmp[i]);*/
    267       }
    268       /*printf("\n");*/
    269       /* First few samples are bad because we don't propagate the memory */
    270       for (i=0;i<12;i++)
    271          tmp[i] = 0;
    272 
    273 #ifdef FIXED_POINT
    274       /* Normalize tmp to max range */
    275       {
    276          int shift=0;
    277          shift = 14-celt_ilog2(1+celt_maxabs16(tmp, len));
    278          if (shift!=0)
    279          {
    280             for (i=0;i<len;i++)
    281                tmp[i] = SHL16(tmp[i], shift);
    282          }
    283       }
    284 #endif
    285 
    286       mean=0;
    287       mem0=0;
    288       /* Grouping by two to reduce complexity */
    289       /* Forward pass to compute the post-echo threshold*/
    290       for (i=0;i<len2;i++)
    291       {
    292          opus_val16 x2 = PSHR32(MULT16_16(tmp[2*i],tmp[2*i]) + MULT16_16(tmp[2*i+1],tmp[2*i+1]),16);
    293          mean += x2;
    294 #ifdef FIXED_POINT
    295          /* FIXME: Use PSHR16() instead */
    296          tmp[i] = mem0 + PSHR32(x2-mem0,4);
    297 #else
    298          tmp[i] = mem0 + MULT16_16_P15(QCONST16(.0625f,15),x2-mem0);
    299 #endif
    300          mem0 = tmp[i];
    301       }
    302 
    303       mem0=0;
    304       maxE=0;
    305       /* Backward pass to compute the pre-echo threshold */
    306       for (i=len2-1;i>=0;i--)
    307       {
    308 #ifdef FIXED_POINT
    309          /* FIXME: Use PSHR16() instead */
    310          tmp[i] = mem0 + PSHR32(tmp[i]-mem0,3);
    311 #else
    312          tmp[i] = mem0 + MULT16_16_P15(QCONST16(0.125f,15),tmp[i]-mem0);
    313 #endif
    314          mem0 = tmp[i];
    315          maxE = MAX16(maxE, mem0);
    316       }
    317       /*for (i=0;i<len2;i++)printf("%f ", tmp[i]/mean);printf("\n");*/
    318 
    319       /* Compute the ratio of the "frame energy" over the harmonic mean of the energy.
    320          This essentially corresponds to a bitrate-normalized temporal noise-to-mask
    321          ratio */
    322 
    323       /* As a compromise with the old transient detector, frame energy is the
    324          geometric mean of the energy and half the max */
    325 #ifdef FIXED_POINT
    326       /* Costs two sqrt() to avoid overflows */
    327       mean = MULT16_16(celt_sqrt(mean), celt_sqrt(MULT16_16(maxE,len2>>1)));
    328 #else
    329       mean = celt_sqrt(mean * maxE*.5*len2);
    330 #endif
    331       /* Inverse of the mean energy in Q15+6 */
    332       norm = SHL32(EXTEND32(len2),6+14)/ADD32(EPSILON,SHR32(mean,1));
    333       /* Compute harmonic mean discarding the unreliable boundaries
    334          The data is smooth, so we only take 1/4th of the samples */
    335       unmask=0;
    336       for (i=12;i<len2-5;i+=4)
    337       {
    338          int id;
    339 #ifdef FIXED_POINT
    340          id = IMAX(0,IMIN(127,MULT16_32_Q15(tmp[i],norm))); /* Do not round to nearest */
    341 #else
    342          id = IMAX(0,IMIN(127,(int)floor(64*norm*tmp[i]))); /* Do not round to nearest */
    343 #endif
    344          unmask += inv_table[id];
    345       }
    346       /*printf("%d\n", unmask);*/
    347       /* Normalize, compensate for the 1/4th of the sample and the factor of 6 in the inverse table */
    348       unmask = 64*unmask*4/(6*(len2-17));
    349       if (unmask>mask_metric)
    350       {
    351          *tf_chan = c;
    352          mask_metric = unmask;
    353       }
    354    }
    355    is_transient = mask_metric>200;
    356 
    357    /* Arbitrary metric for VBR boost */
    358    tf_max = MAX16(0,celt_sqrt(27*mask_metric)-42);
    359    /* *tf_estimate = 1 + MIN16(1, sqrt(MAX16(0, tf_max-30))/20); */
    360    *tf_estimate = celt_sqrt(MAX16(0, SHL32(MULT16_16(QCONST16(0.0069,14),MIN16(163,tf_max)),14)-QCONST32(0.139,28)));
    361    /*printf("%d %f\n", tf_max, mask_metric);*/
    362    RESTORE_STACK;
    363 #ifdef FUZZING
    364    is_transient = rand()&0x1;
    365 #endif
    366    /*printf("%d %f %d\n", is_transient, (float)*tf_estimate, tf_max);*/
    367    return is_transient;
    368 }
    369 
    370 /* Looks for sudden increases of energy to decide whether we need to patch
    371    the transient decision */
    372 int patch_transient_decision(opus_val16 *newE, opus_val16 *oldE, int nbEBands,
    373       int end, int C)
    374 {
    375    int i, c;
    376    opus_val32 mean_diff=0;
    377    opus_val16 spread_old[26];
    378    /* Apply an aggressive (-6 dB/Bark) spreading function to the old frame to
    379       avoid false detection caused by irrelevant bands */
    380    if (C==1)
    381    {
    382       spread_old[0] = oldE[0];
    383       for (i=1;i<end;i++)
    384          spread_old[i] = MAX16(spread_old[i-1]-QCONST16(1.0f, DB_SHIFT), oldE[i]);
    385    } else {
    386       spread_old[0] = MAX16(oldE[0],oldE[nbEBands]);
    387       for (i=1;i<end;i++)
    388          spread_old[i] = MAX16(spread_old[i-1]-QCONST16(1.0f, DB_SHIFT),
    389                                MAX16(oldE[i],oldE[i+nbEBands]));
    390    }
    391    for (i=end-2;i>=0;i--)
    392       spread_old[i] = MAX16(spread_old[i], spread_old[i+1]-QCONST16(1.0f, DB_SHIFT));
    393    /* Compute mean increase */
    394    c=0; do {
    395       for (i=2;i<end-1;i++)
    396       {
    397          opus_val16 x1, x2;
    398          x1 = MAX16(0, newE[i]);
    399          x2 = MAX16(0, spread_old[i]);
    400          mean_diff = ADD32(mean_diff, EXTEND32(MAX16(0, SUB16(x1, x2))));
    401       }
    402    } while (++c<C);
    403    mean_diff = DIV32(mean_diff, C*(end-3));
    404    /*printf("%f %f %d\n", mean_diff, max_diff, count);*/
    405    return mean_diff > QCONST16(1.f, DB_SHIFT);
    406 }
    407 
    408 /** Apply window and compute the MDCT for all sub-frames and
    409     all channels in a frame */
    410 static void compute_mdcts(const CELTMode *mode, int shortBlocks, celt_sig * OPUS_RESTRICT in,
    411                           celt_sig * OPUS_RESTRICT out, int C, int CC, int LM, int upsample)
    412 {
    413    const int overlap = OVERLAP(mode);
    414    int N;
    415    int B;
    416    int shift;
    417    int i, b, c;
    418    if (shortBlocks)
    419    {
    420       B = shortBlocks;
    421       N = mode->shortMdctSize;
    422       shift = mode->maxLM;
    423    } else {
    424       B = 1;
    425       N = mode->shortMdctSize<<LM;
    426       shift = mode->maxLM-LM;
    427    }
    428    c=0; do {
    429       for (b=0;b<B;b++)
    430       {
    431          /* Interleaving the sub-frames while doing the MDCTs */
    432          clt_mdct_forward(&mode->mdct, in+c*(B*N+overlap)+b*N, &out[b+c*N*B], mode->window, overlap, shift, B);
    433       }
    434    } while (++c<CC);
    435    if (CC==2&&C==1)
    436    {
    437       for (i=0;i<B*N;i++)
    438          out[i] = ADD32(HALF32(out[i]), HALF32(out[B*N+i]));
    439    }
    440    if (upsample != 1)
    441    {
    442       c=0; do
    443       {
    444          int bound = B*N/upsample;
    445          for (i=0;i<bound;i++)
    446             out[c*B*N+i] *= upsample;
    447          for (;i<B*N;i++)
    448             out[c*B*N+i] = 0;
    449       } while (++c<C);
    450    }
    451 }
    452 
    453 
    454 void preemphasis(const opus_val16 * OPUS_RESTRICT pcmp, celt_sig * OPUS_RESTRICT inp,
    455                         int N, int CC, int upsample, const opus_val16 *coef, celt_sig *mem, int clip)
    456 {
    457    int i;
    458    opus_val16 coef0;
    459    celt_sig m;
    460    int Nu;
    461 
    462    coef0 = coef[0];
    463 
    464 
    465    Nu = N/upsample;
    466    if (upsample!=1)
    467    {
    468       for (i=0;i<N;i++)
    469          inp[i] = 0;
    470    }
    471    for (i=0;i<Nu;i++)
    472    {
    473       celt_sig x;
    474 
    475       x = SCALEIN(pcmp[CC*i]);
    476 #ifndef FIXED_POINT
    477       /* Replace NaNs with zeros */
    478       if (!(x==x))
    479          x = 0;
    480 #endif
    481       inp[i*upsample] = x;
    482    }
    483 
    484 #ifndef FIXED_POINT
    485    if (clip)
    486    {
    487       /* Clip input to avoid encoding non-portable files */
    488       for (i=0;i<Nu;i++)
    489          inp[i*upsample] = MAX32(-65536.f, MIN32(65536.f,inp[i*upsample]));
    490    }
    491 #endif
    492    m = *mem;
    493 #ifdef CUSTOM_MODES
    494    if (coef[1] != 0)
    495    {
    496       opus_val16 coef1 = coef[1];
    497       opus_val16 coef2 = coef[2];
    498       for (i=0;i<N;i++)
    499       {
    500          opus_val16 x, tmp;
    501          x = inp[i];
    502          /* Apply pre-emphasis */
    503          tmp = MULT16_16(coef2, x);
    504          inp[i] = tmp + m;
    505          m = MULT16_32_Q15(coef1, inp[i]) - MULT16_32_Q15(coef0, tmp);
    506       }
    507    } else
    508 #endif
    509    {
    510       for (i=0;i<N;i++)
    511       {
    512          celt_sig x;
    513          x = SHL32(inp[i], SIG_SHIFT);
    514          /* Apply pre-emphasis */
    515          inp[i] = x + m;
    516          m = - MULT16_32_Q15(coef0, x);
    517       }
    518    }
    519    *mem = m;
    520 }
    521 
    522 
    523 
    524 static opus_val32 l1_metric(const celt_norm *tmp, int N, int LM, opus_val16 bias)
    525 {
    526    int i;
    527    opus_val32 L1;
    528    L1 = 0;
    529    for (i=0;i<N;i++)
    530       L1 += EXTEND32(ABS16(tmp[i]));
    531    /* When in doubt, prefer good freq resolution */
    532    L1 = MAC16_32_Q15(L1, LM*bias, L1);
    533    return L1;
    534 
    535 }
    536 
    537 static int tf_analysis(const CELTMode *m, int len, int isTransient,
    538       int *tf_res, int lambda, celt_norm *X, int N0, int LM,
    539       int *tf_sum, opus_val16 tf_estimate, int tf_chan)
    540 {
    541    int i;
    542    VARDECL(int, metric);
    543    int cost0;
    544    int cost1;
    545    VARDECL(int, path0);
    546    VARDECL(int, path1);
    547    VARDECL(celt_norm, tmp);
    548    VARDECL(celt_norm, tmp_1);
    549    int sel;
    550    int selcost[2];
    551    int tf_select=0;
    552    opus_val16 bias;
    553 
    554    SAVE_STACK;
    555    bias = MULT16_16_Q14(QCONST16(.04f,15), MAX16(-QCONST16(.25f,14), QCONST16(.5f,14)-tf_estimate));
    556    /*printf("%f ", bias);*/
    557 
    558    ALLOC(metric, len, int);
    559    ALLOC(tmp, (m->eBands[len]-m->eBands[len-1])<<LM, celt_norm);
    560    ALLOC(tmp_1, (m->eBands[len]-m->eBands[len-1])<<LM, celt_norm);
    561    ALLOC(path0, len, int);
    562    ALLOC(path1, len, int);
    563 
    564    *tf_sum = 0;
    565    for (i=0;i<len;i++)
    566    {
    567       int j, k, N;
    568       int narrow;
    569       opus_val32 L1, best_L1;
    570       int best_level=0;
    571       N = (m->eBands[i+1]-m->eBands[i])<<LM;
    572       /* band is too narrow to be split down to LM=-1 */
    573       narrow = (m->eBands[i+1]-m->eBands[i])==1;
    574       for (j=0;j<N;j++)
    575          tmp[j] = X[tf_chan*N0 + j+(m->eBands[i]<<LM)];
    576       /* Just add the right channel if we're in stereo */
    577       /*if (C==2)
    578          for (j=0;j<N;j++)
    579             tmp[j] = ADD16(SHR16(tmp[j], 1),SHR16(X[N0+j+(m->eBands[i]<<LM)], 1));*/
    580       L1 = l1_metric(tmp, N, isTransient ? LM : 0, bias);
    581       best_L1 = L1;
    582       /* Check the -1 case for transients */
    583       if (isTransient && !narrow)
    584       {
    585          for (j=0;j<N;j++)
    586             tmp_1[j] = tmp[j];
    587          haar1(tmp_1, N>>LM, 1<<LM);
    588          L1 = l1_metric(tmp_1, N, LM+1, bias);
    589          if (L1<best_L1)
    590          {
    591             best_L1 = L1;
    592             best_level = -1;
    593          }
    594       }
    595       /*printf ("%f ", L1);*/
    596       for (k=0;k<LM+!(isTransient||narrow);k++)
    597       {
    598          int B;
    599 
    600          if (isTransient)
    601             B = (LM-k-1);
    602          else
    603             B = k+1;
    604 
    605          haar1(tmp, N>>k, 1<<k);
    606 
    607          L1 = l1_metric(tmp, N, B, bias);
    608 
    609          if (L1 < best_L1)
    610          {
    611             best_L1 = L1;
    612             best_level = k+1;
    613          }
    614       }
    615       /*printf ("%d ", isTransient ? LM-best_level : best_level);*/
    616       /* metric is in Q1 to be able to select the mid-point (-0.5) for narrower bands */
    617       if (isTransient)
    618          metric[i] = 2*best_level;
    619       else
    620          metric[i] = -2*best_level;
    621       *tf_sum += (isTransient ? LM : 0) - metric[i]/2;
    622       /* For bands that can't be split to -1, set the metric to the half-way point to avoid
    623          biasing the decision */
    624       if (narrow && (metric[i]==0 || metric[i]==-2*LM))
    625          metric[i]-=1;
    626       /*printf("%d ", metric[i]);*/
    627    }
    628    /*printf("\n");*/
    629    /* Search for the optimal tf resolution, including tf_select */
    630    tf_select = 0;
    631    for (sel=0;sel<2;sel++)
    632    {
    633       cost0 = 0;
    634       cost1 = isTransient ? 0 : lambda;
    635       for (i=1;i<len;i++)
    636       {
    637          int curr0, curr1;
    638          curr0 = IMIN(cost0, cost1 + lambda);
    639          curr1 = IMIN(cost0 + lambda, cost1);
    640          cost0 = curr0 + abs(metric[i]-2*tf_select_table[LM][4*isTransient+2*sel+0]);
    641          cost1 = curr1 + abs(metric[i]-2*tf_select_table[LM][4*isTransient+2*sel+1]);
    642       }
    643       cost0 = IMIN(cost0, cost1);
    644       selcost[sel]=cost0;
    645    }
    646    /* For now, we're conservative and only allow tf_select=1 for transients.
    647     * If tests confirm it's useful for non-transients, we could allow it. */
    648    if (selcost[1]<selcost[0] && isTransient)
    649       tf_select=1;
    650    cost0 = 0;
    651    cost1 = isTransient ? 0 : lambda;
    652    /* Viterbi forward pass */
    653    for (i=1;i<len;i++)
    654    {
    655       int curr0, curr1;
    656       int from0, from1;
    657 
    658       from0 = cost0;
    659       from1 = cost1 + lambda;
    660       if (from0 < from1)
    661       {
    662          curr0 = from0;
    663          path0[i]= 0;
    664       } else {
    665          curr0 = from1;
    666          path0[i]= 1;
    667       }
    668 
    669       from0 = cost0 + lambda;
    670       from1 = cost1;
    671       if (from0 < from1)
    672       {
    673          curr1 = from0;
    674          path1[i]= 0;
    675       } else {
    676          curr1 = from1;
    677          path1[i]= 1;
    678       }
    679       cost0 = curr0 + abs(metric[i]-2*tf_select_table[LM][4*isTransient+2*tf_select+0]);
    680       cost1 = curr1 + abs(metric[i]-2*tf_select_table[LM][4*isTransient+2*tf_select+1]);
    681    }
    682    tf_res[len-1] = cost0 < cost1 ? 0 : 1;
    683    /* Viterbi backward pass to check the decisions */
    684    for (i=len-2;i>=0;i--)
    685    {
    686       if (tf_res[i+1] == 1)
    687          tf_res[i] = path1[i+1];
    688       else
    689          tf_res[i] = path0[i+1];
    690    }
    691    /*printf("%d %f\n", *tf_sum, tf_estimate);*/
    692    RESTORE_STACK;
    693 #ifdef FUZZING
    694    tf_select = rand()&0x1;
    695    tf_res[0] = rand()&0x1;
    696    for (i=1;i<len;i++)
    697       tf_res[i] = tf_res[i-1] ^ ((rand()&0xF) == 0);
    698 #endif
    699    return tf_select;
    700 }
    701 
    702 static void tf_encode(int start, int end, int isTransient, int *tf_res, int LM, int tf_select, ec_enc *enc)
    703 {
    704    int curr, i;
    705    int tf_select_rsv;
    706    int tf_changed;
    707    int logp;
    708    opus_uint32 budget;
    709    opus_uint32 tell;
    710    budget = enc->storage*8;
    711    tell = ec_tell(enc);
    712    logp = isTransient ? 2 : 4;
    713    /* Reserve space to code the tf_select decision. */
    714    tf_select_rsv = LM>0 && tell+logp+1 <= budget;
    715    budget -= tf_select_rsv;
    716    curr = tf_changed = 0;
    717    for (i=start;i<end;i++)
    718    {
    719       if (tell+logp<=budget)
    720       {
    721          ec_enc_bit_logp(enc, tf_res[i] ^ curr, logp);
    722          tell = ec_tell(enc);
    723          curr = tf_res[i];
    724          tf_changed |= curr;
    725       }
    726       else
    727          tf_res[i] = curr;
    728       logp = isTransient ? 4 : 5;
    729    }
    730    /* Only code tf_select if it would actually make a difference. */
    731    if (tf_select_rsv &&
    732          tf_select_table[LM][4*isTransient+0+tf_changed]!=
    733          tf_select_table[LM][4*isTransient+2+tf_changed])
    734       ec_enc_bit_logp(enc, tf_select, 1);
    735    else
    736       tf_select = 0;
    737    for (i=start;i<end;i++)
    738       tf_res[i] = tf_select_table[LM][4*isTransient+2*tf_select+tf_res[i]];
    739    /*for(i=0;i<end;i++)printf("%d ", isTransient ? tf_res[i] : LM+tf_res[i]);printf("\n");*/
    740 }
    741 
    742 
    743 static int alloc_trim_analysis(const CELTMode *m, const celt_norm *X,
    744       const opus_val16 *bandLogE, int end, int LM, int C, int N0,
    745       AnalysisInfo *analysis, opus_val16 *stereo_saving, opus_val16 tf_estimate,
    746       int intensity, opus_val16 surround_trim)
    747 {
    748    int i;
    749    opus_val32 diff=0;
    750    int c;
    751    int trim_index = 5;
    752    opus_val16 trim = QCONST16(5.f, 8);
    753    opus_val16 logXC, logXC2;
    754    if (C==2)
    755    {
    756       opus_val16 sum = 0; /* Q10 */
    757       opus_val16 minXC; /* Q10 */
    758       /* Compute inter-channel correlation for low frequencies */
    759       for (i=0;i<8;i++)
    760       {
    761          int j;
    762          opus_val32 partial = 0;
    763          for (j=m->eBands[i]<<LM;j<m->eBands[i+1]<<LM;j++)
    764             partial = MAC16_16(partial, X[j], X[N0+j]);
    765          sum = ADD16(sum, EXTRACT16(SHR32(partial, 18)));
    766       }
    767       sum = MULT16_16_Q15(QCONST16(1.f/8, 15), sum);
    768       sum = MIN16(QCONST16(1.f, 10), ABS16(sum));
    769       minXC = sum;
    770       for (i=8;i<intensity;i++)
    771       {
    772          int j;
    773          opus_val32 partial = 0;
    774          for (j=m->eBands[i]<<LM;j<m->eBands[i+1]<<LM;j++)
    775             partial = MAC16_16(partial, X[j], X[N0+j]);
    776          minXC = MIN16(minXC, ABS16(EXTRACT16(SHR32(partial, 18))));
    777       }
    778       minXC = MIN16(QCONST16(1.f, 10), ABS16(minXC));
    779       /*printf ("%f\n", sum);*/
    780       if (sum > QCONST16(.995f,10))
    781          trim_index-=4;
    782       else if (sum > QCONST16(.92f,10))
    783          trim_index-=3;
    784       else if (sum > QCONST16(.85f,10))
    785          trim_index-=2;
    786       else if (sum > QCONST16(.8f,10))
    787          trim_index-=1;
    788       /* mid-side savings estimations based on the LF average*/
    789       logXC = celt_log2(QCONST32(1.001f, 20)-MULT16_16(sum, sum));
    790       /* mid-side savings estimations based on min correlation */
    791       logXC2 = MAX16(HALF16(logXC), celt_log2(QCONST32(1.001f, 20)-MULT16_16(minXC, minXC)));
    792 #ifdef FIXED_POINT
    793       /* Compensate for Q20 vs Q14 input and convert output to Q8 */
    794       logXC = PSHR32(logXC-QCONST16(6.f, DB_SHIFT),DB_SHIFT-8);
    795       logXC2 = PSHR32(logXC2-QCONST16(6.f, DB_SHIFT),DB_SHIFT-8);
    796 #endif
    797 
    798       trim += MAX16(-QCONST16(4.f, 8), MULT16_16_Q15(QCONST16(.75f,15),logXC));
    799       *stereo_saving = MIN16(*stereo_saving + QCONST16(0.25f, 8), -HALF16(logXC2));
    800    }
    801 
    802    /* Estimate spectral tilt */
    803    c=0; do {
    804       for (i=0;i<end-1;i++)
    805       {
    806          diff += bandLogE[i+c*m->nbEBands]*(opus_int32)(2+2*i-end);
    807       }
    808    } while (++c<C);
    809    diff /= C*(end-1);
    810    /*printf("%f\n", diff);*/
    811    if (diff > QCONST16(2.f, DB_SHIFT))
    812       trim_index--;
    813    if (diff > QCONST16(8.f, DB_SHIFT))
    814       trim_index--;
    815    if (diff < -QCONST16(4.f, DB_SHIFT))
    816       trim_index++;
    817    if (diff < -QCONST16(10.f, DB_SHIFT))
    818       trim_index++;
    819    trim -= MAX16(-QCONST16(2.f, 8), MIN16(QCONST16(2.f, 8), SHR16(diff+QCONST16(1.f, DB_SHIFT),DB_SHIFT-8)/6 ));
    820    trim -= SHR16(surround_trim, DB_SHIFT-8);
    821    trim -= 2*SHR16(tf_estimate, 14-8);
    822 #ifndef DISABLE_FLOAT_API
    823    if (analysis->valid)
    824    {
    825       trim -= MAX16(-QCONST16(2.f, 8), MIN16(QCONST16(2.f, 8), QCONST16(2.f, 8)*(analysis->tonality_slope+.05f)));
    826    }
    827 #endif
    828 
    829 #ifdef FIXED_POINT
    830    trim_index = PSHR32(trim, 8);
    831 #else
    832    trim_index = (int)floor(.5f+trim);
    833 #endif
    834    if (trim_index<0)
    835       trim_index = 0;
    836    if (trim_index>10)
    837       trim_index = 10;
    838    /*printf("%d\n", trim_index);*/
    839 #ifdef FUZZING
    840    trim_index = rand()%11;
    841 #endif
    842    return trim_index;
    843 }
    844 
    845 static int stereo_analysis(const CELTMode *m, const celt_norm *X,
    846       int LM, int N0)
    847 {
    848    int i;
    849    int thetas;
    850    opus_val32 sumLR = EPSILON, sumMS = EPSILON;
    851 
    852    /* Use the L1 norm to model the entropy of the L/R signal vs the M/S signal */
    853    for (i=0;i<13;i++)
    854    {
    855       int j;
    856       for (j=m->eBands[i]<<LM;j<m->eBands[i+1]<<LM;j++)
    857       {
    858          opus_val32 L, R, M, S;
    859          /* We cast to 32-bit first because of the -32768 case */
    860          L = EXTEND32(X[j]);
    861          R = EXTEND32(X[N0+j]);
    862          M = ADD32(L, R);
    863          S = SUB32(L, R);
    864          sumLR = ADD32(sumLR, ADD32(ABS32(L), ABS32(R)));
    865          sumMS = ADD32(sumMS, ADD32(ABS32(M), ABS32(S)));
    866       }
    867    }
    868    sumMS = MULT16_32_Q15(QCONST16(0.707107f, 15), sumMS);
    869    thetas = 13;
    870    /* We don't need thetas for lower bands with LM<=1 */
    871    if (LM<=1)
    872       thetas -= 8;
    873    return MULT16_32_Q15((m->eBands[13]<<(LM+1))+thetas, sumMS)
    874          > MULT16_32_Q15(m->eBands[13]<<(LM+1), sumLR);
    875 }
    876 
    877 static opus_val16 dynalloc_analysis(const opus_val16 *bandLogE, const opus_val16 *bandLogE2,
    878       int nbEBands, int start, int end, int C, int *offsets, int lsb_depth, const opus_int16 *logN,
    879       int isTransient, int vbr, int constrained_vbr, const opus_int16 *eBands, int LM,
    880       int effectiveBytes, opus_int32 *tot_boost_, int lfe, opus_val16 *surround_dynalloc)
    881 {
    882    int i, c;
    883    opus_int32 tot_boost=0;
    884    opus_val16 maxDepth;
    885    VARDECL(opus_val16, follower);
    886    VARDECL(opus_val16, noise_floor);
    887    SAVE_STACK;
    888    ALLOC(follower, C*nbEBands, opus_val16);
    889    ALLOC(noise_floor, C*nbEBands, opus_val16);
    890    for (i=0;i<nbEBands;i++)
    891       offsets[i] = 0;
    892    /* Dynamic allocation code */
    893    maxDepth=-QCONST16(31.9f, DB_SHIFT);
    894    for (i=0;i<end;i++)
    895    {
    896       /* Noise floor must take into account eMeans, the depth, the width of the bands
    897          and the preemphasis filter (approx. square of bark band ID) */
    898       noise_floor[i] = MULT16_16(QCONST16(0.0625f, DB_SHIFT),logN[i])
    899             +QCONST16(.5f,DB_SHIFT)+SHL16(9-lsb_depth,DB_SHIFT)-SHL16(eMeans[i],6)
    900             +MULT16_16(QCONST16(.0062,DB_SHIFT),(i+5)*(i+5));
    901    }
    902    c=0;do
    903    {
    904       for (i=0;i<end;i++)
    905          maxDepth = MAX16(maxDepth, bandLogE[c*nbEBands+i]-noise_floor[i]);
    906    } while (++c<C);
    907    /* Make sure that dynamic allocation can't make us bust the budget */
    908    if (effectiveBytes > 50 && LM>=1 && !lfe)
    909    {
    910       int last=0;
    911       c=0;do
    912       {
    913          follower[c*nbEBands] = bandLogE2[c*nbEBands];
    914          for (i=1;i<end;i++)
    915          {
    916             /* The last band to be at least 3 dB higher than the previous one
    917                is the last we'll consider. Otherwise, we run into problems on
    918                bandlimited signals. */
    919             if (bandLogE2[c*nbEBands+i] > bandLogE2[c*nbEBands+i-1]+QCONST16(.5f,DB_SHIFT))
    920                last=i;
    921             follower[c*nbEBands+i] = MIN16(follower[c*nbEBands+i-1]+QCONST16(1.5f,DB_SHIFT), bandLogE2[c*nbEBands+i]);
    922          }
    923          for (i=last-1;i>=0;i--)
    924             follower[c*nbEBands+i] = MIN16(follower[c*nbEBands+i], MIN16(follower[c*nbEBands+i+1]+QCONST16(2.f,DB_SHIFT), bandLogE2[c*nbEBands+i]));
    925          for (i=0;i<end;i++)
    926             follower[c*nbEBands+i] = MAX16(follower[c*nbEBands+i], noise_floor[i]);
    927       } while (++c<C);
    928       if (C==2)
    929       {
    930          for (i=start;i<end;i++)
    931          {
    932             /* Consider 24 dB "cross-talk" */
    933             follower[nbEBands+i] = MAX16(follower[nbEBands+i], follower[         i]-QCONST16(4.f,DB_SHIFT));
    934             follower[         i] = MAX16(follower[         i], follower[nbEBands+i]-QCONST16(4.f,DB_SHIFT));
    935             follower[i] = HALF16(MAX16(0, bandLogE[i]-follower[i]) + MAX16(0, bandLogE[nbEBands+i]-follower[nbEBands+i]));
    936          }
    937       } else {
    938          for (i=start;i<end;i++)
    939          {
    940             follower[i] = MAX16(0, bandLogE[i]-follower[i]);
    941          }
    942       }
    943       for (i=start;i<end;i++)
    944          follower[i] = MAX16(follower[i], surround_dynalloc[i]);
    945       /* For non-transient CBR/CVBR frames, halve the dynalloc contribution */
    946       if ((!vbr || constrained_vbr)&&!isTransient)
    947       {
    948          for (i=start;i<end;i++)
    949             follower[i] = HALF16(follower[i]);
    950       }
    951       for (i=start;i<end;i++)
    952       {
    953          int width;
    954          int boost;
    955          int boost_bits;
    956 
    957          if (i<8)
    958             follower[i] *= 2;
    959          if (i>=12)
    960             follower[i] = HALF16(follower[i]);
    961          follower[i] = MIN16(follower[i], QCONST16(4, DB_SHIFT));
    962 
    963          width = C*(eBands[i+1]-eBands[i])<<LM;
    964          if (width<6)
    965          {
    966             boost = (int)SHR32(EXTEND32(follower[i]),DB_SHIFT);
    967             boost_bits = boost*width<<BITRES;
    968          } else if (width > 48) {
    969             boost = (int)SHR32(EXTEND32(follower[i])*8,DB_SHIFT);
    970             boost_bits = (boost*width<<BITRES)/8;
    971          } else {
    972             boost = (int)SHR32(EXTEND32(follower[i])*width/6,DB_SHIFT);
    973             boost_bits = boost*6<<BITRES;
    974          }
    975          /* For CBR and non-transient CVBR frames, limit dynalloc to 1/4 of the bits */
    976          if ((!vbr || (constrained_vbr&&!isTransient))
    977                && (tot_boost+boost_bits)>>BITRES>>3 > effectiveBytes/4)
    978          {
    979             opus_int32 cap = ((effectiveBytes/4)<<BITRES<<3);
    980             offsets[i] = cap-tot_boost;
    981             tot_boost = cap;
    982             break;
    983          } else {
    984             offsets[i] = boost;
    985             tot_boost += boost_bits;
    986          }
    987       }
    988    }
    989    *tot_boost_ = tot_boost;
    990    RESTORE_STACK;
    991    return maxDepth;
    992 }
    993 
    994 
    995 static int run_prefilter(CELTEncoder *st, celt_sig *in, celt_sig *prefilter_mem, int CC, int N,
    996       int prefilter_tapset, int *pitch, opus_val16 *gain, int *qgain, int enabled, int nbAvailableBytes)
    997 {
    998    int c;
    999    VARDECL(celt_sig, _pre);
   1000    celt_sig *pre[2];
   1001    const CELTMode *mode;
   1002    int pitch_index;
   1003    opus_val16 gain1;
   1004    opus_val16 pf_threshold;
   1005    int pf_on;
   1006    int qg;
   1007    SAVE_STACK;
   1008 
   1009    mode = st->mode;
   1010    ALLOC(_pre, CC*(N+COMBFILTER_MAXPERIOD), celt_sig);
   1011 
   1012    pre[0] = _pre;
   1013    pre[1] = _pre + (N+COMBFILTER_MAXPERIOD);
   1014 
   1015 
   1016    c=0; do {
   1017       OPUS_COPY(pre[c], prefilter_mem+c*COMBFILTER_MAXPERIOD, COMBFILTER_MAXPERIOD);
   1018       OPUS_COPY(pre[c]+COMBFILTER_MAXPERIOD, in+c*(N+st->overlap)+st->overlap, N);
   1019    } while (++c<CC);
   1020 
   1021    if (enabled)
   1022    {
   1023       VARDECL(opus_val16, pitch_buf);
   1024       ALLOC(pitch_buf, (COMBFILTER_MAXPERIOD+N)>>1, opus_val16);
   1025 
   1026       pitch_downsample(pre, pitch_buf, COMBFILTER_MAXPERIOD+N, CC);
   1027       /* Don't search for the fir last 1.5 octave of the range because
   1028          there's too many false-positives due to short-term correlation */
   1029       pitch_search(pitch_buf+(COMBFILTER_MAXPERIOD>>1), pitch_buf, N,
   1030             COMBFILTER_MAXPERIOD-3*COMBFILTER_MINPERIOD, &pitch_index);
   1031       pitch_index = COMBFILTER_MAXPERIOD-pitch_index;
   1032 
   1033       gain1 = remove_doubling(pitch_buf, COMBFILTER_MAXPERIOD, COMBFILTER_MINPERIOD,
   1034             N, &pitch_index, st->prefilter_period, st->prefilter_gain);
   1035       if (pitch_index > COMBFILTER_MAXPERIOD-2)
   1036          pitch_index = COMBFILTER_MAXPERIOD-2;
   1037       gain1 = MULT16_16_Q15(QCONST16(.7f,15),gain1);
   1038       /*printf("%d %d %f %f\n", pitch_change, pitch_index, gain1, st->analysis.tonality);*/
   1039       if (st->loss_rate>2)
   1040          gain1 = HALF32(gain1);
   1041       if (st->loss_rate>4)
   1042          gain1 = HALF32(gain1);
   1043       if (st->loss_rate>8)
   1044          gain1 = 0;
   1045    } else {
   1046       gain1 = 0;
   1047       pitch_index = COMBFILTER_MINPERIOD;
   1048    }
   1049 
   1050    /* Gain threshold for enabling the prefilter/postfilter */
   1051    pf_threshold = QCONST16(.2f,15);
   1052 
   1053    /* Adjusting the threshold based on rate and continuity */
   1054    if (abs(pitch_index-st->prefilter_period)*10>pitch_index)
   1055       pf_threshold += QCONST16(.2f,15);
   1056    if (nbAvailableBytes<25)
   1057       pf_threshold += QCONST16(.1f,15);
   1058    if (nbAvailableBytes<35)
   1059       pf_threshold += QCONST16(.1f,15);
   1060    if (st->prefilter_gain > QCONST16(.4f,15))
   1061       pf_threshold -= QCONST16(.1f,15);
   1062    if (st->prefilter_gain > QCONST16(.55f,15))
   1063       pf_threshold -= QCONST16(.1f,15);
   1064 
   1065    /* Hard threshold at 0.2 */
   1066    pf_threshold = MAX16(pf_threshold, QCONST16(.2f,15));
   1067    if (gain1<pf_threshold)
   1068    {
   1069       gain1 = 0;
   1070       pf_on = 0;
   1071       qg = 0;
   1072    } else {
   1073       /*This block is not gated by a total bits check only because
   1074         of the nbAvailableBytes check above.*/
   1075       if (ABS16(gain1-st->prefilter_gain)<QCONST16(.1f,15))
   1076          gain1=st->prefilter_gain;
   1077 
   1078 #ifdef FIXED_POINT
   1079       qg = ((gain1+1536)>>10)/3-1;
   1080 #else
   1081       qg = (int)floor(.5f+gain1*32/3)-1;
   1082 #endif
   1083       qg = IMAX(0, IMIN(7, qg));
   1084       gain1 = QCONST16(0.09375f,15)*(qg+1);
   1085       pf_on = 1;
   1086    }
   1087    /*printf("%d %f\n", pitch_index, gain1);*/
   1088 
   1089    c=0; do {
   1090       int offset = mode->shortMdctSize-st->overlap;
   1091       st->prefilter_period=IMAX(st->prefilter_period, COMBFILTER_MINPERIOD);
   1092       OPUS_COPY(in+c*(N+st->overlap), st->in_mem+c*(st->overlap), st->overlap);
   1093       if (offset)
   1094          comb_filter(in+c*(N+st->overlap)+st->overlap, pre[c]+COMBFILTER_MAXPERIOD,
   1095                st->prefilter_period, st->prefilter_period, offset, -st->prefilter_gain, -st->prefilter_gain,
   1096                st->prefilter_tapset, st->prefilter_tapset, NULL, 0);
   1097 
   1098       comb_filter(in+c*(N+st->overlap)+st->overlap+offset, pre[c]+COMBFILTER_MAXPERIOD+offset,
   1099             st->prefilter_period, pitch_index, N-offset, -st->prefilter_gain, -gain1,
   1100             st->prefilter_tapset, prefilter_tapset, mode->window, st->overlap);
   1101       OPUS_COPY(st->in_mem+c*(st->overlap), in+c*(N+st->overlap)+N, st->overlap);
   1102 
   1103       if (N>COMBFILTER_MAXPERIOD)
   1104       {
   1105          OPUS_MOVE(prefilter_mem+c*COMBFILTER_MAXPERIOD, pre[c]+N, COMBFILTER_MAXPERIOD);
   1106       } else {
   1107          OPUS_MOVE(prefilter_mem+c*COMBFILTER_MAXPERIOD, prefilter_mem+c*COMBFILTER_MAXPERIOD+N, COMBFILTER_MAXPERIOD-N);
   1108          OPUS_MOVE(prefilter_mem+c*COMBFILTER_MAXPERIOD+COMBFILTER_MAXPERIOD-N, pre[c]+COMBFILTER_MAXPERIOD, N);
   1109       }
   1110    } while (++c<CC);
   1111 
   1112    RESTORE_STACK;
   1113    *gain = gain1;
   1114    *pitch = pitch_index;
   1115    *qgain = qg;
   1116    return pf_on;
   1117 }
   1118 
   1119 static int compute_vbr(const CELTMode *mode, AnalysisInfo *analysis, opus_int32 base_target,
   1120       int LM, opus_int32 bitrate, int lastCodedBands, int C, int intensity,
   1121       int constrained_vbr, opus_val16 stereo_saving, int tot_boost,
   1122       opus_val16 tf_estimate, int pitch_change, opus_val16 maxDepth,
   1123       int variable_duration, int lfe, int has_surround_mask, opus_val16 surround_masking,
   1124       opus_val16 temporal_vbr)
   1125 {
   1126    /* The target rate in 8th bits per frame */
   1127    opus_int32 target;
   1128    int coded_bins;
   1129    int coded_bands;
   1130    opus_val16 tf_calibration;
   1131    int nbEBands;
   1132    const opus_int16 *eBands;
   1133 
   1134    nbEBands = mode->nbEBands;
   1135    eBands = mode->eBands;
   1136 
   1137    coded_bands = lastCodedBands ? lastCodedBands : nbEBands;
   1138    coded_bins = eBands[coded_bands]<<LM;
   1139    if (C==2)
   1140       coded_bins += eBands[IMIN(intensity, coded_bands)]<<LM;
   1141 
   1142    target = base_target;
   1143 
   1144    /*printf("%f %f %f %f %d %d ", st->analysis.activity, st->analysis.tonality, tf_estimate, st->stereo_saving, tot_boost, coded_bands);*/
   1145 #ifndef DISABLE_FLOAT_API
   1146    if (analysis->valid && analysis->activity<.4)
   1147       target -= (opus_int32)((coded_bins<<BITRES)*(.4f-analysis->activity));
   1148 #endif
   1149    /* Stereo savings */
   1150    if (C==2)
   1151    {
   1152       int coded_stereo_bands;
   1153       int coded_stereo_dof;
   1154       opus_val16 max_frac;
   1155       coded_stereo_bands = IMIN(intensity, coded_bands);
   1156       coded_stereo_dof = (eBands[coded_stereo_bands]<<LM)-coded_stereo_bands;
   1157       /* Maximum fraction of the bits we can save if the signal is mono. */
   1158       max_frac = DIV32_16(MULT16_16(QCONST16(0.8f, 15), coded_stereo_dof), coded_bins);
   1159       /*printf("%d %d %d ", coded_stereo_dof, coded_bins, tot_boost);*/
   1160       target -= (opus_int32)MIN32(MULT16_32_Q15(max_frac,target),
   1161                       SHR32(MULT16_16(stereo_saving-QCONST16(0.1f,8),(coded_stereo_dof<<BITRES)),8));
   1162    }
   1163    /* Boost the rate according to dynalloc (minus the dynalloc average for calibration). */
   1164    target += tot_boost-(16<<LM);
   1165    /* Apply transient boost, compensating for average boost. */
   1166    tf_calibration = variable_duration==OPUS_FRAMESIZE_VARIABLE ?
   1167                     QCONST16(0.02f,14) : QCONST16(0.04f,14);
   1168    target += (opus_int32)SHL32(MULT16_32_Q15(tf_estimate-tf_calibration, target),1);
   1169 
   1170 #ifndef DISABLE_FLOAT_API
   1171    /* Apply tonality boost */
   1172    if (analysis->valid && !lfe)
   1173    {
   1174       opus_int32 tonal_target;
   1175       float tonal;
   1176 
   1177       /* Tonality boost (compensating for the average). */
   1178       tonal = MAX16(0.f,analysis->tonality-.15f)-0.09f;
   1179       tonal_target = target + (opus_int32)((coded_bins<<BITRES)*1.2f*tonal);
   1180       if (pitch_change)
   1181          tonal_target +=  (opus_int32)((coded_bins<<BITRES)*.8f);
   1182       /*printf("%f %f ", analysis->tonality, tonal);*/
   1183       target = tonal_target;
   1184    }
   1185 #endif
   1186 
   1187    if (has_surround_mask&&!lfe)
   1188    {
   1189       opus_int32 surround_target = target + (opus_int32)SHR32(MULT16_16(surround_masking,coded_bins<<BITRES), DB_SHIFT);
   1190       /*printf("%f %d %d %d %d %d %d ", surround_masking, coded_bins, st->end, st->intensity, surround_target, target, st->bitrate);*/
   1191       target = IMAX(target/4, surround_target);
   1192    }
   1193 
   1194    {
   1195       opus_int32 floor_depth;
   1196       int bins;
   1197       bins = eBands[nbEBands-2]<<LM;
   1198       /*floor_depth = SHR32(MULT16_16((C*bins<<BITRES),celt_log2(SHL32(MAX16(1,sample_max),13))), DB_SHIFT);*/
   1199       floor_depth = (opus_int32)SHR32(MULT16_16((C*bins<<BITRES),maxDepth), DB_SHIFT);
   1200       floor_depth = IMAX(floor_depth, target>>2);
   1201       target = IMIN(target, floor_depth);
   1202       /*printf("%f %d\n", maxDepth, floor_depth);*/
   1203    }
   1204 
   1205    if ((!has_surround_mask||lfe) && (constrained_vbr || bitrate<64000))
   1206    {
   1207       opus_val16 rate_factor;
   1208 #ifdef FIXED_POINT
   1209       rate_factor = MAX16(0,(bitrate-32000));
   1210 #else
   1211       rate_factor = MAX16(0,(1.f/32768)*(bitrate-32000));
   1212 #endif
   1213       if (constrained_vbr)
   1214          rate_factor = MIN16(rate_factor, QCONST16(0.67f, 15));
   1215       target = base_target + (opus_int32)MULT16_32_Q15(rate_factor, target-base_target);
   1216 
   1217    }
   1218 
   1219    if (!has_surround_mask && tf_estimate < QCONST16(.2f, 14))
   1220    {
   1221       opus_val16 amount;
   1222       opus_val16 tvbr_factor;
   1223       amount = MULT16_16_Q15(QCONST16(.0000031f, 30), IMAX(0, IMIN(32000, 96000-bitrate)));
   1224       tvbr_factor = SHR32(MULT16_16(temporal_vbr, amount), DB_SHIFT);
   1225       target += (opus_int32)MULT16_32_Q15(tvbr_factor, target);
   1226    }
   1227 
   1228    /* Don't allow more than doubling the rate */
   1229    target = IMIN(2*base_target, target);
   1230 
   1231    return target;
   1232 }
   1233 
   1234 int celt_encode_with_ec(CELTEncoder * OPUS_RESTRICT st, const opus_val16 * pcm, int frame_size, unsigned char *compressed, int nbCompressedBytes, ec_enc *enc)
   1235 {
   1236    int i, c, N;
   1237    opus_int32 bits;
   1238    ec_enc _enc;
   1239    VARDECL(celt_sig, in);
   1240    VARDECL(celt_sig, freq);
   1241    VARDECL(celt_norm, X);
   1242    VARDECL(celt_ener, bandE);
   1243    VARDECL(opus_val16, bandLogE);
   1244    VARDECL(opus_val16, bandLogE2);
   1245    VARDECL(int, fine_quant);
   1246    VARDECL(opus_val16, error);
   1247    VARDECL(int, pulses);
   1248    VARDECL(int, cap);
   1249    VARDECL(int, offsets);
   1250    VARDECL(int, fine_priority);
   1251    VARDECL(int, tf_res);
   1252    VARDECL(unsigned char, collapse_masks);
   1253    celt_sig *prefilter_mem;
   1254    opus_val16 *oldBandE, *oldLogE, *oldLogE2;
   1255    int shortBlocks=0;
   1256    int isTransient=0;
   1257    const int CC = st->channels;
   1258    const int C = st->stream_channels;
   1259    int LM, M;
   1260    int tf_select;
   1261    int nbFilledBytes, nbAvailableBytes;
   1262    int effEnd;
   1263    int codedBands;
   1264    int tf_sum;
   1265    int alloc_trim;
   1266    int pitch_index=COMBFILTER_MINPERIOD;
   1267    opus_val16 gain1 = 0;
   1268    int dual_stereo=0;
   1269    int effectiveBytes;
   1270    int dynalloc_logp;
   1271    opus_int32 vbr_rate;
   1272    opus_int32 total_bits;
   1273    opus_int32 total_boost;
   1274    opus_int32 balance;
   1275    opus_int32 tell;
   1276    int prefilter_tapset=0;
   1277    int pf_on;
   1278    int anti_collapse_rsv;
   1279    int anti_collapse_on=0;
   1280    int silence=0;
   1281    int tf_chan = 0;
   1282    opus_val16 tf_estimate;
   1283    int pitch_change=0;
   1284    opus_int32 tot_boost;
   1285    opus_val32 sample_max;
   1286    opus_val16 maxDepth;
   1287    const OpusCustomMode *mode;
   1288    int nbEBands;
   1289    int overlap;
   1290    const opus_int16 *eBands;
   1291    int secondMdct;
   1292    int signalBandwidth;
   1293    int transient_got_disabled=0;
   1294    opus_val16 surround_masking=0;
   1295    opus_val16 temporal_vbr=0;
   1296    opus_val16 surround_trim = 0;
   1297    VARDECL(opus_val16, surround_dynalloc);
   1298    ALLOC_STACK;
   1299 
   1300    mode = st->mode;
   1301    nbEBands = mode->nbEBands;
   1302    overlap = mode->overlap;
   1303    eBands = mode->eBands;
   1304    tf_estimate = 0;
   1305    if (nbCompressedBytes<2 || pcm==NULL)
   1306      return OPUS_BAD_ARG;
   1307 
   1308    frame_size *= st->upsample;
   1309    for (LM=0;LM<=mode->maxLM;LM++)
   1310       if (mode->shortMdctSize<<LM==frame_size)
   1311          break;
   1312    if (LM>mode->maxLM)
   1313       return OPUS_BAD_ARG;
   1314    M=1<<LM;
   1315    N = M*mode->shortMdctSize;
   1316 
   1317    prefilter_mem = st->in_mem+CC*(st->overlap);
   1318    oldBandE = (opus_val16*)(st->in_mem+CC*(st->overlap+COMBFILTER_MAXPERIOD));
   1319    oldLogE = oldBandE + CC*nbEBands;
   1320    oldLogE2 = oldLogE + CC*nbEBands;
   1321 
   1322    if (enc==NULL)
   1323    {
   1324       tell=1;
   1325       nbFilledBytes=0;
   1326    } else {
   1327       tell=ec_tell(enc);
   1328       nbFilledBytes=(tell+4)>>3;
   1329    }
   1330 
   1331 #ifdef CUSTOM_MODES
   1332    if (st->signalling && enc==NULL)
   1333    {
   1334       int tmp = (mode->effEBands-st->end)>>1;
   1335       st->end = IMAX(1, mode->effEBands-tmp);
   1336       compressed[0] = tmp<<5;
   1337       compressed[0] |= LM<<3;
   1338       compressed[0] |= (C==2)<<2;
   1339       /* Convert "standard mode" to Opus header */
   1340       if (mode->Fs==48000 && mode->shortMdctSize==120)
   1341       {
   1342          int c0 = toOpus(compressed[0]);
   1343          if (c0<0)
   1344             return OPUS_BAD_ARG;
   1345          compressed[0] = c0;
   1346       }
   1347       compressed++;
   1348       nbCompressedBytes--;
   1349    }
   1350 #else
   1351    celt_assert(st->signalling==0);
   1352 #endif
   1353 
   1354    /* Can't produce more than 1275 output bytes */
   1355    nbCompressedBytes = IMIN(nbCompressedBytes,1275);
   1356    nbAvailableBytes = nbCompressedBytes - nbFilledBytes;
   1357 
   1358    if (st->vbr && st->bitrate!=OPUS_BITRATE_MAX)
   1359    {
   1360       opus_int32 den=mode->Fs>>BITRES;
   1361       vbr_rate=(st->bitrate*frame_size+(den>>1))/den;
   1362 #ifdef CUSTOM_MODES
   1363       if (st->signalling)
   1364          vbr_rate -= 8<<BITRES;
   1365 #endif
   1366       effectiveBytes = vbr_rate>>(3+BITRES);
   1367    } else {
   1368       opus_int32 tmp;
   1369       vbr_rate = 0;
   1370       tmp = st->bitrate*frame_size;
   1371       if (tell>1)
   1372          tmp += tell;
   1373       if (st->bitrate!=OPUS_BITRATE_MAX)
   1374          nbCompressedBytes = IMAX(2, IMIN(nbCompressedBytes,
   1375                (tmp+4*mode->Fs)/(8*mode->Fs)-!!st->signalling));
   1376       effectiveBytes = nbCompressedBytes;
   1377    }
   1378 
   1379    if (enc==NULL)
   1380    {
   1381       ec_enc_init(&_enc, compressed, nbCompressedBytes);
   1382       enc = &_enc;
   1383    }
   1384 
   1385    if (vbr_rate>0)
   1386    {
   1387       /* Computes the max bit-rate allowed in VBR mode to avoid violating the
   1388           target rate and buffering.
   1389          We must do this up front so that bust-prevention logic triggers
   1390           correctly if we don't have enough bits. */
   1391       if (st->constrained_vbr)
   1392       {
   1393          opus_int32 vbr_bound;
   1394          opus_int32 max_allowed;
   1395          /* We could use any multiple of vbr_rate as bound (depending on the
   1396              delay).
   1397             This is clamped to ensure we use at least two bytes if the encoder
   1398              was entirely empty, but to allow 0 in hybrid mode. */
   1399          vbr_bound = vbr_rate;
   1400          max_allowed = IMIN(IMAX(tell==1?2:0,
   1401                (vbr_rate+vbr_bound-st->vbr_reservoir)>>(BITRES+3)),
   1402                nbAvailableBytes);
   1403          if(max_allowed < nbAvailableBytes)
   1404          {
   1405             nbCompressedBytes = nbFilledBytes+max_allowed;
   1406             nbAvailableBytes = max_allowed;
   1407             ec_enc_shrink(enc, nbCompressedBytes);
   1408          }
   1409       }
   1410    }
   1411    total_bits = nbCompressedBytes*8;
   1412 
   1413    effEnd = st->end;
   1414    if (effEnd > mode->effEBands)
   1415       effEnd = mode->effEBands;
   1416 
   1417    ALLOC(in, CC*(N+st->overlap), celt_sig);
   1418 
   1419    sample_max=MAX32(st->overlap_max, celt_maxabs16(pcm, C*(N-overlap)/st->upsample));
   1420    st->overlap_max=celt_maxabs16(pcm+C*(N-overlap)/st->upsample, C*overlap/st->upsample);
   1421    sample_max=MAX32(sample_max, st->overlap_max);
   1422 #ifdef FIXED_POINT
   1423    silence = (sample_max==0);
   1424 #else
   1425    silence = (sample_max <= (opus_val16)1/(1<<st->lsb_depth));
   1426 #endif
   1427 #ifdef FUZZING
   1428    if ((rand()&0x3F)==0)
   1429       silence = 1;
   1430 #endif
   1431    if (tell==1)
   1432       ec_enc_bit_logp(enc, silence, 15);
   1433    else
   1434       silence=0;
   1435    if (silence)
   1436    {
   1437       /*In VBR mode there is no need to send more than the minimum. */
   1438       if (vbr_rate>0)
   1439       {
   1440          effectiveBytes=nbCompressedBytes=IMIN(nbCompressedBytes, nbFilledBytes+2);
   1441          total_bits=nbCompressedBytes*8;
   1442          nbAvailableBytes=2;
   1443          ec_enc_shrink(enc, nbCompressedBytes);
   1444       }
   1445       /* Pretend we've filled all the remaining bits with zeros
   1446             (that's what the initialiser did anyway) */
   1447       tell = nbCompressedBytes*8;
   1448       enc->nbits_total+=tell-ec_tell(enc);
   1449    }
   1450    c=0; do {
   1451       preemphasis(pcm+c, in+c*(N+st->overlap)+st->overlap, N, CC, st->upsample,
   1452                   mode->preemph, st->preemph_memE+c, st->clip);
   1453    } while (++c<CC);
   1454 
   1455 
   1456 
   1457    /* Find pitch period and gain */
   1458    {
   1459       int enabled;
   1460       int qg;
   1461       enabled = (st->lfe || nbAvailableBytes>12*C) && st->start==0 && !silence && !st->disable_pf
   1462             && st->complexity >= 5 && !(st->consec_transient && LM!=3 && st->variable_duration==OPUS_FRAMESIZE_VARIABLE);
   1463 
   1464       prefilter_tapset = st->tapset_decision;
   1465       pf_on = run_prefilter(st, in, prefilter_mem, CC, N, prefilter_tapset, &pitch_index, &gain1, &qg, enabled, nbAvailableBytes);
   1466       if ((gain1 > QCONST16(.4f,15) || st->prefilter_gain > QCONST16(.4f,15)) && (!st->analysis.valid || st->analysis.tonality > .3)
   1467             && (pitch_index > 1.26*st->prefilter_period || pitch_index < .79*st->prefilter_period))
   1468          pitch_change = 1;
   1469       if (pf_on==0)
   1470       {
   1471          if(st->start==0 && tell+16<=total_bits)
   1472             ec_enc_bit_logp(enc, 0, 1);
   1473       } else {
   1474          /*This block is not gated by a total bits check only because
   1475            of the nbAvailableBytes check above.*/
   1476          int octave;
   1477          ec_enc_bit_logp(enc, 1, 1);
   1478          pitch_index += 1;
   1479          octave = EC_ILOG(pitch_index)-5;
   1480          ec_enc_uint(enc, octave, 6);
   1481          ec_enc_bits(enc, pitch_index-(16<<octave), 4+octave);
   1482          pitch_index -= 1;
   1483          ec_enc_bits(enc, qg, 3);
   1484          ec_enc_icdf(enc, prefilter_tapset, tapset_icdf, 2);
   1485       }
   1486    }
   1487 
   1488    isTransient = 0;
   1489    shortBlocks = 0;
   1490    if (st->complexity >= 1 && !st->lfe)
   1491    {
   1492       isTransient = transient_analysis(in, N+st->overlap, CC,
   1493             &tf_estimate, &tf_chan);
   1494    }
   1495    if (LM>0 && ec_tell(enc)+3<=total_bits)
   1496    {
   1497       if (isTransient)
   1498          shortBlocks = M;
   1499    } else {
   1500       isTransient = 0;
   1501       transient_got_disabled=1;
   1502    }
   1503 
   1504    ALLOC(freq, CC*N, celt_sig); /**< Interleaved signal MDCTs */
   1505    ALLOC(bandE,nbEBands*CC, celt_ener);
   1506    ALLOC(bandLogE,nbEBands*CC, opus_val16);
   1507 
   1508    secondMdct = shortBlocks && st->complexity>=8;
   1509    ALLOC(bandLogE2, C*nbEBands, opus_val16);
   1510    if (secondMdct)
   1511    {
   1512       compute_mdcts(mode, 0, in, freq, C, CC, LM, st->upsample);
   1513       compute_band_energies(mode, freq, bandE, effEnd, C, M);
   1514       amp2Log2(mode, effEnd, st->end, bandE, bandLogE2, C);
   1515       for (i=0;i<C*nbEBands;i++)
   1516          bandLogE2[i] += HALF16(SHL16(LM, DB_SHIFT));
   1517    }
   1518 
   1519    compute_mdcts(mode, shortBlocks, in, freq, C, CC, LM, st->upsample);
   1520    if (CC==2&&C==1)
   1521       tf_chan = 0;
   1522    compute_band_energies(mode, freq, bandE, effEnd, C, M);
   1523 
   1524    if (st->lfe)
   1525    {
   1526       for (i=2;i<st->end;i++)
   1527       {
   1528          bandE[i] = IMIN(bandE[i], MULT16_32_Q15(QCONST16(1e-4f,15),bandE[0]));
   1529          bandE[i] = MAX32(bandE[i], EPSILON);
   1530       }
   1531    }
   1532    amp2Log2(mode, effEnd, st->end, bandE, bandLogE, C);
   1533 
   1534    ALLOC(surround_dynalloc, C*nbEBands, opus_val16);
   1535    for(i=0;i<st->end;i++)
   1536       surround_dynalloc[i] = 0;
   1537    /* This computes how much masking takes place between surround channels */
   1538    if (st->start==0&&st->energy_mask&&!st->lfe)
   1539    {
   1540       int mask_end;
   1541       int midband;
   1542       int count_dynalloc;
   1543       opus_val32 mask_avg=0;
   1544       opus_val32 diff=0;
   1545       int count=0;
   1546       mask_end = IMAX(2,st->lastCodedBands);
   1547       for (c=0;c<C;c++)
   1548       {
   1549          for(i=0;i<mask_end;i++)
   1550          {
   1551             opus_val16 mask;
   1552             mask = MAX16(MIN16(st->energy_mask[nbEBands*c+i],
   1553                    QCONST16(.25f, DB_SHIFT)), -QCONST16(2.0f, DB_SHIFT));
   1554             if (mask > 0)
   1555                mask = HALF16(mask);
   1556             mask_avg += MULT16_16(mask, eBands[i+1]-eBands[i]);
   1557             count += eBands[i+1]-eBands[i];
   1558             diff += MULT16_16(mask, 1+2*i-mask_end);
   1559          }
   1560       }
   1561       mask_avg = DIV32_16(mask_avg,count);
   1562       mask_avg += QCONST16(.2f, DB_SHIFT);
   1563       diff = diff*6/(C*(mask_end-1)*(mask_end+1)*mask_end);
   1564       /* Again, being conservative */
   1565       diff = HALF32(diff);
   1566       diff = MAX32(MIN32(diff, QCONST32(.031f, DB_SHIFT)), -QCONST32(.031f, DB_SHIFT));
   1567       /* Find the band that's in the middle of the coded spectrum */
   1568       for (midband=0;eBands[midband+1] < eBands[mask_end]/2;midband++);
   1569       count_dynalloc=0;
   1570       for(i=0;i<mask_end;i++)
   1571       {
   1572          opus_val32 lin;
   1573          opus_val16 unmask;
   1574          lin = mask_avg + diff*(i-midband);
   1575          if (C==2)
   1576             unmask = MAX16(st->energy_mask[i], st->energy_mask[nbEBands+i]);
   1577          else
   1578             unmask = st->energy_mask[i];
   1579          unmask = MIN16(unmask, QCONST16(.0f, DB_SHIFT));
   1580          unmask -= lin;
   1581          if (unmask > QCONST16(.25f, DB_SHIFT))
   1582          {
   1583             surround_dynalloc[i] = unmask - QCONST16(.25f, DB_SHIFT);
   1584             count_dynalloc++;
   1585          }
   1586       }
   1587       if (count_dynalloc>=3)
   1588       {
   1589          /* If we need dynalloc in many bands, it's probably because our
   1590             initial masking rate was too low. */
   1591          mask_avg += QCONST16(.25f, DB_SHIFT);
   1592          if (mask_avg>0)
   1593          {
   1594             /* Something went really wrong in the original calculations,
   1595                disabling masking. */
   1596             mask_avg = 0;
   1597             diff = 0;
   1598             for(i=0;i<mask_end;i++)
   1599                surround_dynalloc[i] = 0;
   1600          } else {
   1601             for(i=0;i<mask_end;i++)
   1602                surround_dynalloc[i] = MAX16(0, surround_dynalloc[i]-QCONST16(.25f, DB_SHIFT));
   1603          }
   1604       }
   1605       mask_avg += QCONST16(.2f, DB_SHIFT);
   1606       /* Convert to 1/64th units used for the trim */
   1607       surround_trim = 64*diff;
   1608       /*printf("%d %d ", mask_avg, surround_trim);*/
   1609       surround_masking = mask_avg;
   1610    }
   1611    /* Temporal VBR (but not for LFE) */
   1612    if (!st->lfe)
   1613    {
   1614       opus_val16 follow=-QCONST16(10.0f,DB_SHIFT);
   1615       float frame_avg=0;
   1616       opus_val16 offset = shortBlocks?HALF16(SHL16(LM, DB_SHIFT)):0;
   1617       for(i=st->start;i<st->end;i++)
   1618       {
   1619          follow = MAX16(follow-QCONST16(1.f, DB_SHIFT), bandLogE[i]-offset);
   1620          if (C==2)
   1621             follow = MAX16(follow, bandLogE[i+nbEBands]-offset);
   1622          frame_avg += follow;
   1623       }
   1624       frame_avg /= (st->end-st->start);
   1625       temporal_vbr = SUB16(frame_avg,st->spec_avg);
   1626       temporal_vbr = MIN16(QCONST16(3.f, DB_SHIFT), MAX16(-QCONST16(1.5f, DB_SHIFT), temporal_vbr));
   1627       st->spec_avg += MULT16_16_Q15(QCONST16(.02f, 15), temporal_vbr);
   1628    }
   1629    /*for (i=0;i<21;i++)
   1630       printf("%f ", bandLogE[i]);
   1631    printf("\n");*/
   1632 
   1633    if (!secondMdct)
   1634    {
   1635       for (i=0;i<C*nbEBands;i++)
   1636          bandLogE2[i] = bandLogE[i];
   1637    }
   1638 
   1639    /* Last chance to catch any transient we might have missed in the
   1640       time-domain analysis */
   1641    if (LM>0 && ec_tell(enc)+3<=total_bits && !isTransient && st->complexity>=5 && !st->lfe)
   1642    {
   1643       if (patch_transient_decision(bandLogE, oldBandE, nbEBands, st->end, C))
   1644       {
   1645          isTransient = 1;
   1646          shortBlocks = M;
   1647          compute_mdcts(mode, shortBlocks, in, freq, C, CC, LM, st->upsample);
   1648          compute_band_energies(mode, freq, bandE, effEnd, C, M);
   1649          amp2Log2(mode, effEnd, st->end, bandE, bandLogE, C);
   1650          /* Compensate for the scaling of short vs long mdcts */
   1651          for (i=0;i<C*nbEBands;i++)
   1652             bandLogE2[i] += HALF16(SHL16(LM, DB_SHIFT));
   1653          tf_estimate = QCONST16(.2f,14);
   1654       }
   1655    }
   1656 
   1657    if (LM>0 && ec_tell(enc)+3<=total_bits)
   1658       ec_enc_bit_logp(enc, isTransient, 3);
   1659 
   1660    ALLOC(X, C*N, celt_norm);         /**< Interleaved normalised MDCTs */
   1661 
   1662    /* Band normalisation */
   1663    normalise_bands(mode, freq, X, bandE, effEnd, C, M);
   1664 
   1665    ALLOC(tf_res, nbEBands, int);
   1666    /* Disable variable tf resolution for hybrid and at very low bitrate */
   1667    if (effectiveBytes>=15*C && st->start==0 && st->complexity>=2 && !st->lfe)
   1668    {
   1669       int lambda;
   1670       if (effectiveBytes<40)
   1671          lambda = 12;
   1672       else if (effectiveBytes<60)
   1673          lambda = 6;
   1674       else if (effectiveBytes<100)
   1675          lambda = 4;
   1676       else
   1677          lambda = 3;
   1678       lambda*=2;
   1679       tf_select = tf_analysis(mode, effEnd, isTransient, tf_res, lambda, X, N, LM, &tf_sum, tf_estimate, tf_chan);
   1680       for (i=effEnd;i<st->end;i++)
   1681          tf_res[i] = tf_res[effEnd-1];
   1682    } else {
   1683       tf_sum = 0;
   1684       for (i=0;i<st->end;i++)
   1685          tf_res[i] = isTransient;
   1686       tf_select=0;
   1687    }
   1688 
   1689    ALLOC(error, C*nbEBands, opus_val16);
   1690    quant_coarse_energy(mode, st->start, st->end, effEnd, bandLogE,
   1691          oldBandE, total_bits, error, enc,
   1692          C, LM, nbAvailableBytes, st->force_intra,
   1693          &st->delayedIntra, st->complexity >= 4, st->loss_rate, st->lfe);
   1694 
   1695    tf_encode(st->start, st->end, isTransient, tf_res, LM, tf_select, enc);
   1696 
   1697    if (ec_tell(enc)+4<=total_bits)
   1698    {
   1699       if (st->lfe)
   1700       {
   1701          st->tapset_decision = 0;
   1702          st->spread_decision = SPREAD_NORMAL;
   1703       } else if (shortBlocks || st->complexity < 3 || nbAvailableBytes < 10*C || st->start != 0)
   1704       {
   1705          if (st->complexity == 0)
   1706             st->spread_decision = SPREAD_NONE;
   1707          else
   1708             st->spread_decision = SPREAD_NORMAL;
   1709       } else {
   1710          /* Disable new spreading+tapset estimator until we can show it works
   1711             better than the old one. So far it seems like spreading_decision()
   1712             works best. */
   1713          if (0&&st->analysis.valid)
   1714          {
   1715             static const opus_val16 spread_thresholds[3] = {-QCONST16(.6f, 15), -QCONST16(.2f, 15), -QCONST16(.07f, 15)};
   1716             static const opus_val16 spread_histeresis[3] = {QCONST16(.15f, 15), QCONST16(.07f, 15), QCONST16(.02f, 15)};
   1717             static const opus_val16 tapset_thresholds[2] = {QCONST16(.0f, 15), QCONST16(.15f, 15)};
   1718             static const opus_val16 tapset_histeresis[2] = {QCONST16(.1f, 15), QCONST16(.05f, 15)};
   1719             st->spread_decision = hysteresis_decision(-st->analysis.tonality, spread_thresholds, spread_histeresis, 3, st->spread_decision);
   1720             st->tapset_decision = hysteresis_decision(st->analysis.tonality_slope, tapset_thresholds, tapset_histeresis, 2, st->tapset_decision);
   1721          } else {
   1722             st->spread_decision = spreading_decision(mode, X,
   1723                   &st->tonal_average, st->spread_decision, &st->hf_average,
   1724                   &st->tapset_decision, pf_on&&!shortBlocks, effEnd, C, M);
   1725          }
   1726          /*printf("%d %d\n", st->tapset_decision, st->spread_decision);*/
   1727          /*printf("%f %d %f %d\n\n", st->analysis.tonality, st->spread_decision, st->analysis.tonality_slope, st->tapset_decision);*/
   1728       }
   1729       ec_enc_icdf(enc, st->spread_decision, spread_icdf, 5);
   1730    }
   1731 
   1732    ALLOC(offsets, nbEBands, int);
   1733 
   1734    maxDepth = dynalloc_analysis(bandLogE, bandLogE2, nbEBands, st->start, st->end, C, offsets,
   1735          st->lsb_depth, mode->logN, isTransient, st->vbr, st->constrained_vbr,
   1736          eBands, LM, effectiveBytes, &tot_boost, st->lfe, surround_dynalloc);
   1737    /* For LFE, everything interesting is in the first band */
   1738    if (st->lfe)
   1739       offsets[0] = IMIN(8, effectiveBytes/3);
   1740    ALLOC(cap, nbEBands, int);
   1741    init_caps(mode,cap,LM,C);
   1742 
   1743    dynalloc_logp = 6;
   1744    total_bits<<=BITRES;
   1745    total_boost = 0;
   1746    tell = ec_tell_frac(enc);
   1747    for (i=st->start;i<st->end;i++)
   1748    {
   1749       int width, quanta;
   1750       int dynalloc_loop_logp;
   1751       int boost;
   1752       int j;
   1753       width = C*(eBands[i+1]-eBands[i])<<LM;
   1754       /* quanta is 6 bits, but no more than 1 bit/sample
   1755          and no less than 1/8 bit/sample */
   1756       quanta = IMIN(width<<BITRES, IMAX(6<<BITRES, width));
   1757       dynalloc_loop_logp = dynalloc_logp;
   1758       boost = 0;
   1759       for (j = 0; tell+(dynalloc_loop_logp<<BITRES) < total_bits-total_boost
   1760             && boost < cap[i]; j++)
   1761       {
   1762          int flag;
   1763          flag = j<offsets[i];
   1764          ec_enc_bit_logp(enc, flag, dynalloc_loop_logp);
   1765          tell = ec_tell_frac(enc);
   1766          if (!flag)
   1767             break;
   1768          boost += quanta;
   1769          total_boost += quanta;
   1770          dynalloc_loop_logp = 1;
   1771       }
   1772       /* Making dynalloc more likely */
   1773       if (j)
   1774          dynalloc_logp = IMAX(2, dynalloc_logp-1);
   1775       offsets[i] = boost;
   1776    }
   1777 
   1778    if (C==2)
   1779    {
   1780       int effectiveRate;
   1781 
   1782       static const opus_val16 intensity_thresholds[21]=
   1783       /* 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19  20  off*/
   1784         { 16,21,23,25,27,29,31,33,35,38,42,46,50,54,58,63,68,75,84,102,130};
   1785       static const opus_val16 intensity_histeresis[21]=
   1786         {  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 4, 5, 6,  8, 12};
   1787 
   1788       /* Always use MS for 2.5 ms frames until we can do a better analysis */
   1789       if (LM!=0)
   1790          dual_stereo = stereo_analysis(mode, X, LM, N);
   1791 
   1792       /* Account for coarse energy */
   1793       effectiveRate = (8*effectiveBytes - 80)>>LM;
   1794 
   1795       /* effectiveRate in kb/s */
   1796       effectiveRate = 2*effectiveRate/5;
   1797 
   1798       st->intensity = hysteresis_decision((opus_val16)effectiveRate, intensity_thresholds, intensity_histeresis, 21, st->intensity);
   1799       st->intensity = IMIN(st->end,IMAX(st->start, st->intensity));
   1800    }
   1801 
   1802    alloc_trim = 5;
   1803    if (tell+(6<<BITRES) <= total_bits - total_boost)
   1804    {
   1805       if (st->lfe)
   1806          alloc_trim = 5;
   1807       else
   1808          alloc_trim = alloc_trim_analysis(mode, X, bandLogE,
   1809             st->end, LM, C, N, &st->analysis, &st->stereo_saving, tf_estimate, st->intensity, surround_trim);
   1810       ec_enc_icdf(enc, alloc_trim, trim_icdf, 7);
   1811       tell = ec_tell_frac(enc);
   1812    }
   1813 
   1814    /* Variable bitrate */
   1815    if (vbr_rate>0)
   1816    {
   1817      opus_val16 alpha;
   1818      opus_int32 delta;
   1819      /* The target rate in 8th bits per frame */
   1820      opus_int32 target, base_target;
   1821      opus_int32 min_allowed;
   1822      int lm_diff = mode->maxLM - LM;
   1823 
   1824      /* Don't attempt to use more than 510 kb/s, even for frames smaller than 20 ms.
   1825         The CELT allocator will just not be able to use more than that anyway. */
   1826      nbCompressedBytes = IMIN(nbCompressedBytes,1275>>(3-LM));
   1827      base_target = vbr_rate - ((40*C+20)<<BITRES);
   1828 
   1829      if (st->constrained_vbr)
   1830         base_target += (st->vbr_offset>>lm_diff);
   1831 
   1832      target = compute_vbr(mode, &st->analysis, base_target, LM, st->bitrate,
   1833            st->lastCodedBands, C, st->intensity, st->constrained_vbr,
   1834            st->stereo_saving, tot_boost, tf_estimate, pitch_change, maxDepth,
   1835            st->variable_duration, st->lfe, st->energy_mask!=NULL, surround_masking,
   1836            temporal_vbr);
   1837 
   1838      /* The current offset is removed from the target and the space used
   1839         so far is added*/
   1840      target=target+tell;
   1841      /* In VBR mode the frame size must not be reduced so much that it would
   1842          result in the encoder running out of bits.
   1843         The margin of 2 bytes ensures that none of the bust-prevention logic
   1844          in the decoder will have triggered so far. */
   1845      min_allowed = ((tell+total_boost+(1<<(BITRES+3))-1)>>(BITRES+3)) + 2 - nbFilledBytes;
   1846 
   1847      nbAvailableBytes = (target+(1<<(BITRES+2)))>>(BITRES+3);
   1848      nbAvailableBytes = IMAX(min_allowed,nbAvailableBytes);
   1849      nbAvailableBytes = IMIN(nbCompressedBytes,nbAvailableBytes+nbFilledBytes) - nbFilledBytes;
   1850 
   1851      /* By how much did we "miss" the target on that frame */
   1852      delta = target - vbr_rate;
   1853 
   1854      target=nbAvailableBytes<<(BITRES+3);
   1855 
   1856      /*If the frame is silent we don't adjust our drift, otherwise
   1857        the encoder will shoot to very high rates after hitting a
   1858        span of silence, but we do allow the bitres to refill.
   1859        This means that we'll undershoot our target in CVBR/VBR modes
   1860        on files with lots of silence. */
   1861      if(silence)
   1862      {
   1863        nbAvailableBytes = 2;
   1864        target = 2*8<<BITRES;
   1865        delta = 0;
   1866      }
   1867 
   1868      if (st->vbr_count < 970)
   1869      {
   1870         st->vbr_count++;
   1871         alpha = celt_rcp(SHL32(EXTEND32(st->vbr_count+20),16));
   1872      } else
   1873         alpha = QCONST16(.001f,15);
   1874      /* How many bits have we used in excess of what we're allowed */
   1875      if (st->constrained_vbr)
   1876         st->vbr_reservoir += target - vbr_rate;
   1877      /*printf ("%d\n", st->vbr_reservoir);*/
   1878 
   1879      /* Compute the offset we need to apply in order to reach the target */
   1880      if (st->constrained_vbr)
   1881      {
   1882         st->vbr_drift += (opus_int32)MULT16_32_Q15(alpha,(delta*(1<<lm_diff))-st->vbr_offset-st->vbr_drift);
   1883         st->vbr_offset = -st->vbr_drift;
   1884      }
   1885      /*printf ("%d\n", st->vbr_drift);*/
   1886 
   1887      if (st->constrained_vbr && st->vbr_reservoir < 0)
   1888      {
   1889         /* We're under the min value -- increase rate */
   1890         int adjust = (-st->vbr_reservoir)/(8<<BITRES);
   1891         /* Unless we're just coding silence */
   1892         nbAvailableBytes += silence?0:adjust;
   1893         st->vbr_reservoir = 0;
   1894         /*printf ("+%d\n", adjust);*/
   1895      }
   1896      nbCompressedBytes = IMIN(nbCompressedBytes,nbAvailableBytes+nbFilledBytes);
   1897      /*printf("%d\n", nbCompressedBytes*50*8);*/
   1898      /* This moves the raw bits to take into account the new compressed size */
   1899      ec_enc_shrink(enc, nbCompressedBytes);
   1900    }
   1901 
   1902    /* Bit allocation */
   1903    ALLOC(fine_quant, nbEBands, int);
   1904    ALLOC(pulses, nbEBands, int);
   1905    ALLOC(fine_priority, nbEBands, int);
   1906 
   1907    /* bits =           packet size                    - where we are - safety*/
   1908    bits = (((opus_int32)nbCompressedBytes*8)<<BITRES) - ec_tell_frac(enc) - 1;
   1909    anti_collapse_rsv = isTransient&&LM>=2&&bits>=((LM+2)<<BITRES) ? (1<<BITRES) : 0;
   1910    bits -= anti_collapse_rsv;
   1911    signalBandwidth = st->end-1;
   1912 #ifndef DISABLE_FLOAT_API
   1913    if (st->analysis.valid)
   1914    {
   1915       int min_bandwidth;
   1916       if (st->bitrate < (opus_int32)32000*C)
   1917          min_bandwidth = 13;
   1918       else if (st->bitrate < (opus_int32)48000*C)
   1919          min_bandwidth = 16;
   1920       else if (st->bitrate < (opus_int32)60000*C)
   1921          min_bandwidth = 18;
   1922       else  if (st->bitrate < (opus_int32)80000*C)
   1923          min_bandwidth = 19;
   1924       else
   1925          min_bandwidth = 20;
   1926       signalBandwidth = IMAX(st->analysis.bandwidth, min_bandwidth);
   1927    }
   1928 #endif
   1929    if (st->lfe)
   1930       signalBandwidth = 1;
   1931    codedBands = compute_allocation(mode, st->start, st->end, offsets, cap,
   1932          alloc_trim, &st->intensity, &dual_stereo, bits, &balance, pulses,
   1933          fine_quant, fine_priority, C, LM, enc, 1, st->lastCodedBands, signalBandwidth);
   1934    if (st->lastCodedBands)
   1935       st->lastCodedBands = IMIN(st->lastCodedBands+1,IMAX(st->lastCodedBands-1,codedBands));
   1936    else
   1937       st->lastCodedBands = codedBands;
   1938 
   1939    quant_fine_energy(mode, st->start, st->end, oldBandE, error, fine_quant, enc, C);
   1940 
   1941    /* Residual quantisation */
   1942    ALLOC(collapse_masks, C*nbEBands, unsigned char);
   1943    quant_all_bands(1, mode, st->start, st->end, X, C==2 ? X+N : NULL, collapse_masks,
   1944          bandE, pulses, shortBlocks, st->spread_decision, dual_stereo, st->intensity, tf_res,
   1945          nbCompressedBytes*(8<<BITRES)-anti_collapse_rsv, balance, enc, LM, codedBands, &st->rng);
   1946 
   1947    if (anti_collapse_rsv > 0)
   1948    {
   1949       anti_collapse_on = st->consec_transient<2;
   1950 #ifdef FUZZING
   1951       anti_collapse_on = rand()&0x1;
   1952 #endif
   1953       ec_enc_bits(enc, anti_collapse_on, 1);
   1954    }
   1955    quant_energy_finalise(mode, st->start, st->end, oldBandE, error, fine_quant, fine_priority, nbCompressedBytes*8-ec_tell(enc), enc, C);
   1956 
   1957    if (silence)
   1958    {
   1959       for (i=0;i<C*nbEBands;i++)
   1960          oldBandE[i] = -QCONST16(28.f,DB_SHIFT);
   1961    }
   1962 
   1963 #ifdef RESYNTH
   1964    /* Re-synthesis of the coded audio if required */
   1965    {
   1966       celt_sig *out_mem[2];
   1967 
   1968       if (anti_collapse_on)
   1969       {
   1970          anti_collapse(mode, X, collapse_masks, LM, C, N,
   1971                st->start, st->end, oldBandE, oldLogE, oldLogE2, pulses, st->rng);
   1972       }
   1973 
   1974       if (silence)
   1975       {
   1976          for (i=0;i<C*N;i++)
   1977             freq[i] = 0;
   1978       } else {
   1979          /* Synthesis */
   1980          denormalise_bands(mode, X, freq, oldBandE, st->start, effEnd, C, M);
   1981       }
   1982 
   1983       c=0; do {
   1984          OPUS_MOVE(st->syn_mem[c], st->syn_mem[c]+N, 2*MAX_PERIOD-N+overlap/2);
   1985       } while (++c<CC);
   1986 
   1987       if (CC==2&&C==1)
   1988       {
   1989          for (i=0;i<N;i++)
   1990             freq[N+i] = freq[i];
   1991       }
   1992 
   1993       c=0; do {
   1994          out_mem[c] = st->syn_mem[c]+2*MAX_PERIOD-N;
   1995       } while (++c<CC);
   1996 
   1997       compute_inv_mdcts(mode, shortBlocks, freq, out_mem, CC, LM);
   1998 
   1999       c=0; do {
   2000          st->prefilter_period=IMAX(st->prefilter_period, COMBFILTER_MINPERIOD);
   2001          st->prefilter_period_old=IMAX(st->prefilter_period_old, COMBFILTER_MINPERIOD);
   2002          comb_filter(out_mem[c], out_mem[c], st->prefilter_period_old, st->prefilter_period, mode->shortMdctSize,
   2003                st->prefilter_gain_old, st->prefilter_gain, st->prefilter_tapset_old, st->prefilter_tapset,
   2004                mode->window, st->overlap);
   2005          if (LM!=0)
   2006             comb_filter(out_mem[c]+mode->shortMdctSize, out_mem[c]+mode->shortMdctSize, st->prefilter_period, pitch_index, N-mode->shortMdctSize,
   2007                   st->prefilter_gain, gain1, st->prefilter_tapset, prefilter_tapset,
   2008                   mode->window, overlap);
   2009       } while (++c<CC);
   2010 
   2011       /* We reuse freq[] as scratch space for the de-emphasis */
   2012       deemphasis(out_mem, (opus_val16*)pcm, N, CC, st->upsample, mode->preemph, st->preemph_memD, freq);
   2013       st->prefilter_period_old = st->prefilter_period;
   2014       st->prefilter_gain_old = st->prefilter_gain;
   2015       st->prefilter_tapset_old = st->prefilter_tapset;
   2016    }
   2017 #endif
   2018 
   2019    st->prefilter_period = pitch_index;
   2020    st->prefilter_gain = gain1;
   2021    st->prefilter_tapset = prefilter_tapset;
   2022 #ifdef RESYNTH
   2023    if (LM!=0)
   2024    {
   2025       st->prefilter_period_old = st->prefilter_period;
   2026       st->prefilter_gain_old = st->prefilter_gain;
   2027       st->prefilter_tapset_old = st->prefilter_tapset;
   2028    }
   2029 #endif
   2030 
   2031    if (CC==2&&C==1) {
   2032       for (i=0;i<nbEBands;i++)
   2033          oldBandE[nbEBands+i]=oldBandE[i];
   2034    }
   2035 
   2036    if (!isTransient)
   2037    {
   2038       for (i=0;i<CC*nbEBands;i++)
   2039          oldLogE2[i] = oldLogE[i];
   2040       for (i=0;i<CC*nbEBands;i++)
   2041          oldLogE[i] = oldBandE[i];
   2042    } else {
   2043       for (i=0;i<CC*nbEBands;i++)
   2044          oldLogE[i] = MIN16(oldLogE[i], oldBandE[i]);
   2045    }
   2046    /* In case start or end were to change */
   2047    c=0; do
   2048    {
   2049       for (i=0;i<st->start;i++)
   2050       {
   2051          oldBandE[c*nbEBands+i]=0;
   2052          oldLogE[c*nbEBands+i]=oldLogE2[c*nbEBands+i]=-QCONST16(28.f,DB_SHIFT);
   2053       }
   2054       for (i=st->end;i<nbEBands;i++)
   2055       {
   2056          oldBandE[c*nbEBands+i]=0;
   2057          oldLogE[c*nbEBands+i]=oldLogE2[c*nbEBands+i]=-QCONST16(28.f,DB_SHIFT);
   2058       }
   2059    } while (++c<CC);
   2060 
   2061    if (isTransient || transient_got_disabled)
   2062       st->consec_transient++;
   2063    else
   2064       st->consec_transient=0;
   2065    st->rng = enc->rng;
   2066 
   2067    /* If there's any room left (can only happen for very high rates),
   2068       it's already filled with zeros */
   2069    ec_enc_done(enc);
   2070 
   2071 #ifdef CUSTOM_MODES
   2072    if (st->signalling)
   2073       nbCompressedBytes++;
   2074 #endif
   2075 
   2076    RESTORE_STACK;
   2077    if (ec_get_error(enc))
   2078       return OPUS_INTERNAL_ERROR;
   2079    else
   2080       return nbCompressedBytes;
   2081 }
   2082 
   2083 
   2084 #ifdef CUSTOM_MODES
   2085 
   2086 #ifdef FIXED_POINT
   2087 int opus_custom_encode(CELTEncoder * OPUS_RESTRICT st, const opus_int16 * pcm, int frame_size, unsigned char *compressed, int nbCompressedBytes)
   2088 {
   2089    return celt_encode_with_ec(st, pcm, frame_size, compressed, nbCompressedBytes, NULL);
   2090 }
   2091 
   2092 #ifndef DISABLE_FLOAT_API
   2093 int opus_custom_encode_float(CELTEncoder * OPUS_RESTRICT st, const float * pcm, int frame_size, unsigned char *compressed, int nbCompressedBytes)
   2094 {
   2095    int j, ret, C, N;
   2096    VARDECL(opus_int16, in);
   2097    ALLOC_STACK;
   2098 
   2099    if (pcm==NULL)
   2100       return OPUS_BAD_ARG;
   2101 
   2102    C = st->channels;
   2103    N = frame_size;
   2104    ALLOC(in, C*N, opus_int16);
   2105 
   2106    for (j=0;j<C*N;j++)
   2107      in[j] = FLOAT2INT16(pcm[j]);
   2108 
   2109    ret=celt_encode_with_ec(st,in,frame_size,compressed,nbCompressedBytes, NULL);
   2110 #ifdef RESYNTH
   2111    for (j=0;j<C*N;j++)
   2112       ((float*)pcm)[j]=in[j]*(1.f/32768.f);
   2113 #endif
   2114    RESTORE_STACK;
   2115    return ret;
   2116 }
   2117 #endif /* DISABLE_FLOAT_API */
   2118 #else
   2119 
   2120 int opus_custom_encode(CELTEncoder * OPUS_RESTRICT st, const opus_int16 * pcm, int frame_size, unsigned char *compressed, int nbCompressedBytes)
   2121 {
   2122    int j, ret, C, N;
   2123    VARDECL(celt_sig, in);
   2124    ALLOC_STACK;
   2125 
   2126    if (pcm==NULL)
   2127       return OPUS_BAD_ARG;
   2128 
   2129    C=st->channels;
   2130    N=frame_size;
   2131    ALLOC(in, C*N, celt_sig);
   2132    for (j=0;j<C*N;j++) {
   2133      in[j] = SCALEOUT(pcm[j]);
   2134    }
   2135 
   2136    ret = celt_encode_with_ec(st,in,frame_size,compressed,nbCompressedBytes, NULL);
   2137 #ifdef RESYNTH
   2138    for (j=0;j<C*N;j++)
   2139       ((opus_int16*)pcm)[j] = FLOAT2INT16(in[j]);
   2140 #endif
   2141    RESTORE_STACK;
   2142    return ret;
   2143 }
   2144 
   2145 int opus_custom_encode_float(CELTEncoder * OPUS_RESTRICT st, const float * pcm, int frame_size, unsigned char *compressed, int nbCompressedBytes)
   2146 {
   2147    return celt_encode_with_ec(st, pcm, frame_size, compressed, nbCompressedBytes, NULL);
   2148 }
   2149 
   2150 #endif
   2151 
   2152 #endif /* CUSTOM_MODES */
   2153 
   2154 int opus_custom_encoder_ctl(CELTEncoder * OPUS_RESTRICT st, int request, ...)
   2155 {
   2156    va_list ap;
   2157 
   2158    va_start(ap, request);
   2159    switch (request)
   2160    {
   2161       case OPUS_SET_COMPLEXITY_REQUEST:
   2162       {
   2163          int value = va_arg(ap, opus_int32);
   2164          if (value<0 || value>10)
   2165             goto bad_arg;
   2166          st->complexity = value;
   2167       }
   2168       break;
   2169       case CELT_SET_START_BAND_REQUEST:
   2170       {
   2171          opus_int32 value = va_arg(ap, opus_int32);
   2172          if (value<0 || value>=st->mode->nbEBands)
   2173             goto bad_arg;
   2174          st->start = value;
   2175       }
   2176       break;
   2177       case CELT_SET_END_BAND_REQUEST:
   2178       {
   2179          opus_int32 value = va_arg(ap, opus_int32);
   2180          if (value<1 || value>st->mode->nbEBands)
   2181             goto bad_arg;
   2182          st->end = value;
   2183       }
   2184       break;
   2185       case CELT_SET_PREDICTION_REQUEST:
   2186       {
   2187          int value = va_arg(ap, opus_int32);
   2188          if (value<0 || value>2)
   2189             goto bad_arg;
   2190          st->disable_pf = value<=1;
   2191          st->force_intra = value==0;
   2192       }
   2193       break;
   2194       case OPUS_SET_PACKET_LOSS_PERC_REQUEST:
   2195       {
   2196          int value = va_arg(ap, opus_int32);
   2197          if (value<0 || value>100)
   2198             goto bad_arg;
   2199          st->loss_rate = value;
   2200       }
   2201       break;
   2202       case OPUS_SET_VBR_CONSTRAINT_REQUEST:
   2203       {
   2204          opus_int32 value = va_arg(ap, opus_int32);
   2205          st->constrained_vbr = value;
   2206       }
   2207       break;
   2208       case OPUS_SET_VBR_REQUEST:
   2209       {
   2210          opus_int32 value = va_arg(ap, opus_int32);
   2211          st->vbr = value;
   2212       }
   2213       break;
   2214       case OPUS_SET_BITRATE_REQUEST:
   2215       {
   2216          opus_int32 value = va_arg(ap, opus_int32);
   2217          if (value<=500 && value!=OPUS_BITRATE_MAX)
   2218             goto bad_arg;
   2219          value = IMIN(value, 260000*st->channels);
   2220          st->bitrate = value;
   2221       }
   2222       break;
   2223       case CELT_SET_CHANNELS_REQUEST:
   2224       {
   2225          opus_int32 value = va_arg(ap, opus_int32);
   2226          if (value<1 || value>2)
   2227             goto bad_arg;
   2228          st->stream_channels = value;
   2229       }
   2230       break;
   2231       case OPUS_SET_LSB_DEPTH_REQUEST:
   2232       {
   2233           opus_int32 value = va_arg(ap, opus_int32);
   2234           if (value<8 || value>24)
   2235              goto bad_arg;
   2236           st->lsb_depth=value;
   2237       }
   2238       break;
   2239       case OPUS_GET_LSB_DEPTH_REQUEST:
   2240       {
   2241           opus_int32 *value = va_arg(ap, opus_int32*);
   2242           *value=st->lsb_depth;
   2243       }
   2244       break;
   2245       case OPUS_SET_EXPERT_FRAME_DURATION_REQUEST:
   2246       {
   2247           opus_int32 value = va_arg(ap, opus_int32);
   2248           st->variable_duration = value;
   2249       }
   2250       break;
   2251       case OPUS_RESET_STATE:
   2252       {
   2253          int i;
   2254          opus_val16 *oldBandE, *oldLogE, *oldLogE2;
   2255          oldBandE = (opus_val16*)(st->in_mem+st->channels*(st->overlap+COMBFILTER_MAXPERIOD));
   2256          oldLogE = oldBandE + st->channels*st->mode->nbEBands;
   2257          oldLogE2 = oldLogE + st->channels*st->mode->nbEBands;
   2258          OPUS_CLEAR((char*)&st->ENCODER_RESET_START,
   2259                opus_custom_encoder_get_size(st->mode, st->channels)-
   2260                ((char*)&st->ENCODER_RESET_START - (char*)st));
   2261          for (i=0;i<st->channels*st->mode->nbEBands;i++)
   2262             oldLogE[i]=oldLogE2[i]=-QCONST16(28.f,DB_SHIFT);
   2263          st->vbr_offset = 0;
   2264          st->delayedIntra = 1;
   2265          st->spread_decision = SPREAD_NORMAL;
   2266          st->tonal_average = 256;
   2267          st->hf_average = 0;
   2268          st->tapset_decision = 0;
   2269       }
   2270       break;
   2271 #ifdef CUSTOM_MODES
   2272       case CELT_SET_INPUT_CLIPPING_REQUEST:
   2273       {
   2274          opus_int32 value = va_arg(ap, opus_int32);
   2275          st->clip = value;
   2276       }
   2277       break;
   2278 #endif
   2279       case CELT_SET_SIGNALLING_REQUEST:
   2280       {
   2281          opus_int32 value = va_arg(ap, opus_int32);
   2282          st->signalling = value;
   2283       }
   2284       break;
   2285       case CELT_SET_ANALYSIS_REQUEST:
   2286       {
   2287          AnalysisInfo *info = va_arg(ap, AnalysisInfo *);
   2288          if (info)
   2289             OPUS_COPY(&st->analysis, info, 1);
   2290       }
   2291       break;
   2292       case CELT_GET_MODE_REQUEST:
   2293       {
   2294          const CELTMode ** value = va_arg(ap, const CELTMode**);
   2295          if (value==0)
   2296             goto bad_arg;
   2297          *value=st->mode;
   2298       }
   2299       break;
   2300       case OPUS_GET_FINAL_RANGE_REQUEST:
   2301       {
   2302          opus_uint32 * value = va_arg(ap, opus_uint32 *);
   2303          if (value==0)
   2304             goto bad_arg;
   2305          *value=st->rng;
   2306       }
   2307       break;
   2308       case OPUS_SET_LFE_REQUEST:
   2309       {
   2310           opus_int32 value = va_arg(ap, opus_int32);
   2311           st->lfe = value;
   2312       }
   2313       break;
   2314       case OPUS_SET_ENERGY_MASK_REQUEST:
   2315       {
   2316           opus_val16 *value = va_arg(ap, opus_val16*);
   2317           st->energy_mask = value;
   2318       }
   2319       break;
   2320       default:
   2321          goto bad_request;
   2322    }
   2323    va_end(ap);
   2324    return OPUS_OK;
   2325 bad_arg:
   2326    va_end(ap);
   2327    return OPUS_BAD_ARG;
   2328 bad_request:
   2329    va_end(ap);
   2330    return OPUS_UNIMPLEMENTED;
   2331 }
   2332