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

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

Generated by: LCOV version 1.13