Merge branch 'exp_api_change'
authorJean-Marc Valin <jean-marc.valin@usherbrooke.ca>
Sun, 30 Jan 2011 17:15:12 +0000 (12:15 -0500)
committerJean-Marc Valin <jean-marc.valin@usherbrooke.ca>
Sun, 30 Jan 2011 18:39:56 +0000 (13:39 -0500)
1  2 
libcelt/celt.c
libcelt/dump_modes.c
libcelt/modes.c
libcelt/modes.h
libcelt/rate.c
libcelt/static_modes_fixed.c
libcelt/static_modes_float.c
tests/dft-test.c
tests/mdct-test.c

diff --combined libcelt/celt.c
@@@ -63,6 -63,32 +63,32 @@@ static const unsigned char tapset_icdf[
  #define COMBFILTER_MAXPERIOD 1024
  #define COMBFILTER_MINPERIOD 15
  
+ static int resampling_factor(celt_int32 rate)
+ {
+    int ret;
+    switch (rate)
+    {
+    case 48000:
+       ret = 1;
+       break;
+    case 24000:
+       ret = 2;
+       break;
+    case 16000:
+       ret = 3;
+       break;
+    case 12000:
+       ret = 4;
+       break;
+    case 8000:
+       ret = 6;
+       break;
+    default:
+       ret = 0;
+    }
+    return ret;
+ }
  /** Encoder state 
   @brief Encoder state
   */
@@@ -73,6 -99,7 +99,7 @@@ struct CELTEncoder 
     
     int force_intra;
     int complexity;
+    int upsample;
     int start, end;
  
     celt_int32 vbr_rate_norm; /* Target number of 8th bits per frame */
@@@ -127,14 -154,44 +154,44 @@@ int celt_encoder_get_size(const CELTMod
     return size;
  }
  
- CELTEncoder *celt_encoder_create(const CELTMode *mode, int channels, int *error)
+ CELTEncoder *celt_encoder_create(int sampling_rate, int channels, int *error)
+ {
+    CELTEncoder *st;
+    CELTMode *mode = celt_mode_create(48000, 960, NULL);
+    st = (CELTEncoder *)celt_alloc(celt_encoder_get_size(mode, channels));
+    if (st!=NULL && celt_encoder_init(st, sampling_rate, channels, error)==NULL)
+    {
+       celt_encoder_destroy(st);
+       st = NULL;
+    }
+    return st;
+ }
+ CELTEncoder *celt_encoder_create_custom(const CELTMode *mode, int channels, int *error)
  {
-    return celt_encoder_init(
-          (CELTEncoder *)celt_alloc(celt_encoder_get_size(mode, channels)),
-          mode, channels, error);
+    CELTEncoder *st = (CELTEncoder *)celt_alloc(celt_encoder_get_size(mode, channels));
+    if (st!=NULL && celt_encoder_init_custom(st, mode, channels, error)==NULL)
+    {
+       celt_encoder_destroy(st);
+       st = NULL;
+    }
+    return st;
  }
  
- CELTEncoder *celt_encoder_init(CELTEncoder *st, const CELTMode *mode, int channels, int *error)
+ CELTEncoder *celt_encoder_init(CELTEncoder *st, int sampling_rate, int channels, int *error)
+ {
+    celt_encoder_init_custom(st, celt_mode_create(48000, 960, NULL), channels, error);
+    st->upsample = resampling_factor(sampling_rate);
+    if (st->upsample==0)
+    {
+       if (error)
+          *error = CELT_BAD_ARG;
+       return NULL;
+    }
+    return st;
+ }
+ CELTEncoder *celt_encoder_init_custom(CELTEncoder *st, const CELTMode *mode, int channels, int *error)
  {
     if (channels < 0 || channels > 2)
     {
        return NULL;
     }
  
-    if (st==NULL)
+    if (st==NULL || mode==NULL)
     {
        if (error)
           *error = CELT_ALLOC_FAIL;
     st->overlap = mode->overlap;
     st->channels = channels;
  
+    st->upsample = 1;
     st->start = 0;
     st->end = st->mode->effEBands;
     st->constrained_vbr = 1;
@@@ -372,10 -430,11 +430,11 @@@ static void compute_inv_mdcts(const CEL
     } while (++c<C);
  }
  
- static void deemphasis(celt_sig *in[], celt_word16 *pcm, int N, int _C, const celt_word16 *coef, celt_sig *mem)
+ static void deemphasis(celt_sig *in[], celt_word16 *pcm, int N, int _C, int downsample, const celt_word16 *coef, celt_sig *mem)
  {
     const int C = CHANNELS(_C);
     int c;
+    int count=0;
     c=0; do {
        int j;
        celt_sig * restrict x;
           m = MULT16_32_Q15(coef[0], tmp)
             - MULT16_32_Q15(coef[1], *x);
           tmp = SHL32(MULT16_32_Q15(coef[3], tmp), 2);
-          *y = SCALEOUT(SIG2WORD16(tmp));
           x++;
-          y+=C;
+          /* Technically the store could be moved outside of the if because
+             the stores we don't want will just be overwritten */
+          if (++count==downsample)
+          {
+             *y = SCALEOUT(SIG2WORD16(tmp));
+             y+=C;
+             count=0;
+          }
        }
        mem[c] = m;
     } while (++c<C);
@@@ -789,7 -854,6 +854,7 @@@ int celt_encode_with_ec_float(CELTEncod
     VARDECL(int, fine_quant);
     VARDECL(celt_word16, error);
     VARDECL(int, pulses);
 +   VARDECL(int, cap);
     VARDECL(int, offsets);
     VARDECL(int, fine_priority);
     VARDECL(int, tf_res);
     if (nbCompressedBytes<2 || pcm==NULL)
       return CELT_BAD_ARG;
  
+    frame_size *= st->upsample;
     for (LM=0;LM<4;LM++)
        if (st->mode->shortMdctSize<<LM==frame_size)
           break;
  
        silence = 1;
        c=0; do {
+          int count = 0;
           const celt_word16 * restrict pcmp = pcm+c;
           celt_sig * restrict inp = in+c*(N+st->overlap)+st->overlap;
  
           for (i=0;i<N;i++)
           {
+             celt_sig x, tmp;
+             x = SCALEIN(*pcmp);
+             if (++count==st->upsample)
+             {
+                count=0;
+                pcmp+=C;
+             } else {
+                x = 0;
+             }
              /* Apply pre-emphasis */
-             celt_sig tmp = MULT16_16(st->mode->preemph[2], SCALEIN(*pcmp));
+             tmp = MULT16_16(st->mode->preemph[2], x);
              *inp = tmp + st->preemph_memE[c];
              st->preemph_memE[c] = MULT16_32_Q15(st->mode->preemph[1], *inp)
                                     - MULT16_32_Q15(st->mode->preemph[0], tmp);
              silence = silence && *inp == 0;
              inp++;
-             pcmp+=C;
           }
           CELT_COPY(pre[c], prefilter_mem+c*COMBFILTER_MAXPERIOD, COMBFILTER_MAXPERIOD);
           CELT_COPY(pre[c]+COMBFILTER_MAXPERIOD, in+c*(N+st->overlap)+st->overlap, N);
     /* Compute MDCTs */
     compute_mdcts(st->mode, shortBlocks, in, freq, C, LM);
  
+    if (st->upsample != 1)
+    {
+       c=0; do
+       {
+          int bound = N/st->upsample;
+          for (i=0;i<bound;i++)
+             freq[c*N+i] *= st->upsample;
+          for (;i<N;i++)
+             freq[c*N+i] = 0;
+       } while (++c<C);
+    }
     ALLOC(X, C*N, celt_norm);         /**< Interleaved normalised MDCTs */
  
     compute_band_energies(st->mode, freq, bandE, effEnd, C, M);
        ec_enc_icdf(enc, st->spread_decision, spread_icdf, 5);
     }
  
 +   ALLOC(cap, st->mode->nbEBands, int);
     ALLOC(offsets, st->mode->nbEBands, int);
  
     for (i=0;i<st->mode->nbEBands;i++)
 +      cap[i] = st->mode->cache.caps[st->mode->nbEBands*(2*LM+C-1)+i]
 +            << C+LM+BITRES-2;
 +   for (i=0;i<st->mode->nbEBands;i++)
        offsets[i] = 0;
     /* Dynamic allocation code */
     /* Make sure that dynamic allocation can't make us bust the budget */
        dynalloc_loop_logp = dynalloc_logp;
        boost = 0;
        for (j = 0; tell+(dynalloc_loop_logp<<BITRES) < total_bits-total_boost
 -            && boost < (64<<LM)*(C<<BITRES); j++)
 +            && boost < cap[i]; j++)
        {
           int flag;
           flag = j<offsets[i];
     bits = (nbCompressedBytes*8<<BITRES) - ec_enc_tell(enc, BITRES) - 1;
     anti_collapse_rsv = isTransient&&LM>=2&&bits>=(LM+2<<BITRES) ? (1<<BITRES) : 0;
     bits -= anti_collapse_rsv;
 -   codedBands = compute_allocation(st->mode, st->start, st->end, offsets,
 +   codedBands = compute_allocation(st->mode, st->start, st->end, offsets, cap,
           alloc_trim, &intensity, &dual_stereo, bits, pulses, fine_quant,
           fine_priority, C, LM, enc, 1, st->lastCodedBands);
     st->lastCodedBands = codedBands;
        } while (++c<C);
  #endif /* ENABLE_POSTFILTER */
  
-       deemphasis(out_mem, (celt_word16*)pcm, N, C, st->mode->preemph, st->preemph_memD);
+       deemphasis(out_mem, (celt_word16*)pcm, N, C, st->upsample, st->mode->preemph, st->preemph_memD);
        st->prefilter_period_old = st->prefilter_period;
        st->prefilter_gain_old = st->prefilter_gain;
        st->prefilter_tapset_old = st->prefilter_tapset;
@@@ -1643,6 -1725,7 +1730,7 @@@ struct CELTDecoder 
     int overlap;
     int channels;
  
+    int downsample;
     int start, end;
  
     /* Everything beyond this point gets cleared on a reset */
@@@ -1677,14 -1760,44 +1765,44 @@@ int celt_decoder_get_size(const CELTMod
     return size;
  }
  
- CELTDecoder *celt_decoder_create(const CELTMode *mode, int channels, int *error)
+ CELTDecoder *celt_decoder_create(int sampling_rate, int channels, int *error)
+ {
+    CELTDecoder *st;
+    const CELTMode *mode = celt_mode_create(48000, 960, NULL);
+    st = (CELTDecoder *)celt_alloc(celt_decoder_get_size(mode, channels));
+    if (st!=NULL && celt_decoder_init(st, sampling_rate, channels, error)==NULL)
+    {
+       celt_decoder_destroy(st);
+       st = NULL;
+    }
+    return st;
+ }
+ CELTDecoder *celt_decoder_create_custom(const CELTMode *mode, int channels, int *error)
+ {
+    CELTDecoder *st = (CELTDecoder *)celt_alloc(celt_decoder_get_size(mode, channels));
+    if (st!=NULL && celt_decoder_init_custom(st, mode, channels, error)==NULL)
+    {
+       celt_decoder_destroy(st);
+       st = NULL;
+    }
+    return st;
+ }
+ CELTDecoder *celt_decoder_init(CELTDecoder *st, int sampling_rate, int channels, int *error)
  {
-    return celt_decoder_init(
-          (CELTDecoder *)celt_alloc(celt_decoder_get_size(mode, channels)),
-          mode, channels, error);
+    celt_decoder_init_custom(st, celt_mode_create(48000, 960, NULL), channels, error);
+    st->downsample = resampling_factor(sampling_rate);
+    if (st->downsample==0)
+    {
+       if (error)
+          *error = CELT_BAD_ARG;
+       return NULL;
+    }
+    return st;
  }
  
- CELTDecoder *celt_decoder_init(CELTDecoder *st, const CELTMode *mode, int channels, int *error)
+ CELTDecoder *celt_decoder_init_custom(CELTDecoder *st, const CELTMode *mode, int channels, int *error)
  {
     if (channels < 0 || channels > 2)
     {
     st->overlap = mode->overlap;
     st->channels = channels;
  
+    st->downsample = 1;
     st->start = 0;
     st->end = st->mode->effEBands;
  
@@@ -1934,7 -2048,7 +2053,7 @@@ static void celt_decode_lost(CELTDecode
           out_mem[c][MAX_PERIOD+i] = e[i];
     } while (++c<C);
  
-    deemphasis(out_syn, pcm, N, C, st->mode->preemph, st->preemph_memD);
+    deemphasis(out_syn, pcm, N, C, st->downsample, st->mode->preemph, st->preemph_memD);
     
     st->loss_count++;
  
@@@ -1958,7 -2072,6 +2077,7 @@@ int celt_decode_with_ec_float(CELTDecod
     VARDECL(celt_ener, bandE);
     VARDECL(int, fine_quant);
     VARDECL(int, pulses);
 +   VARDECL(int, cap);
     VARDECL(int, offsets);
     VARDECL(int, fine_priority);
     VARDECL(int, tf_res);
     if (pcm==NULL)
        return CELT_BAD_ARG;
  
+    frame_size *= st->downsample;
     for (LM=0;LM<4;LM++)
        if (st->mode->shortMdctSize<<LM==frame_size)
           break;
        spread_decision = ec_dec_icdf(dec, spread_icdf, 5);
  
     ALLOC(pulses, st->mode->nbEBands, int);
 +   ALLOC(cap, st->mode->nbEBands, int);
     ALLOC(offsets, st->mode->nbEBands, int);
     ALLOC(fine_priority, st->mode->nbEBands, int);
  
 +   for (i=0;i<st->mode->nbEBands;i++)
 +      cap[i] = st->mode->cache.caps[st->mode->nbEBands*(2*LM+C-1)+i]
 +            << C+LM+BITRES-2;
 +
     dynalloc_logp = 6;
     total_bits<<=BITRES;
     tell = ec_dec_tell(dec, BITRES);
        quanta = IMIN(width<<BITRES, IMAX(6<<BITRES, width));
        dynalloc_loop_logp = dynalloc_logp;
        boost = 0;
 -      while (tell+(dynalloc_loop_logp<<BITRES) < total_bits &&
 -            boost < (64<<LM)*(C<<BITRES))
 +      while (tell+(dynalloc_loop_logp<<BITRES) < total_bits && boost < cap[i])
        {
           int flag;
           flag = ec_dec_bit_logp(dec, dynalloc_loop_logp);
     bits = (len*8<<BITRES) - ec_dec_tell(dec, BITRES) - 1;
     anti_collapse_rsv = isTransient&&LM>=2&&bits>=(LM+2<<BITRES) ? (1<<BITRES) : 0;
     bits -= anti_collapse_rsv;
 -   codedBands = compute_allocation(st->mode, st->start, st->end, offsets,
 +   codedBands = compute_allocation(st->mode, st->start, st->end, offsets, cap,
           alloc_trim, &intensity, &dual_stereo, bits, pulses, fine_quant,
           fine_priority, C, LM, dec, 0, 0);
     
        for (i=0;i<M*st->mode->eBands[st->start];i++)
           freq[c*N+i] = 0;
     while (++c<C);
-    c=0; do
+    c=0; do {
+       int bound = M*st->mode->eBands[effEnd];
+       if (st->downsample!=1)
+          bound = IMIN(bound, N/st->downsample);
        for (i=M*st->mode->eBands[effEnd];i<N;i++)
           freq[c*N+i] = 0;
-    while (++c<C);
+    while (++c<C);
  
     out_syn[0] = out_mem[0]+MAX_PERIOD-N;
     if (C==2)
     }
     st->rng = dec->rng;
  
-    deemphasis(out_syn, pcm, N, C, st->mode->preemph, st->preemph_memD);
+    deemphasis(out_syn, pcm, N, C, st->downsample, st->mode->preemph, st->preemph_memD);
     st->loss_count = 0;
     RESTORE_STACK;
     if (ec_dec_tell(dec,0) > 8*len || ec_dec_get_error(dec))
diff --combined libcelt/dump_modes.c
@@@ -129,11 -129,6 +129,11 @@@ void dump_modes(FILE *file, CELTMode **
        for (j=0;j<mode->cache.size;j++)
           fprintf (file, "%d, ", mode->cache.bits[j]);
        fprintf (file, "};\n");
 +      fprintf (file, "static const unsigned char cache_caps%d[%d] = {\n", mode->Fs/mdctSize, (mode->maxLM+1)*2*mode->nbEBands);
 +      for (j=0;j<(mode->maxLM+1)*2*mode->nbEBands;j++)
 +         fprintf (file, "%d, ", mode->cache.caps[j]);
 +      fprintf (file, "};\n");
 +
        fprintf(file, "#endif\n");
        fprintf(file, "\n");
  
        fprintf(file, "%d,\t/* nbShortMdcts */\n", mode->nbShortMdcts);
        fprintf(file, "%d,\t/* shortMdctSize */\n", mode->shortMdctSize);
        fprintf(file, "logN%d,\t/* logN */\n", framerate);
 -      fprintf(file, "{%d, cache_index%d, cache_bits%d},\t/* cache */\n",
 -            mode->cache.size, mode->Fs/mdctSize, mode->Fs/mdctSize);
 +      fprintf(file, "{%d, cache_index%d, cache_bits%d, cache_caps%d},\t/* cache */\n",
 +            mode->cache.size, mode->Fs/mdctSize, mode->Fs/mdctSize, mode->Fs/mdctSize);
        fprintf(file, "};\n");
     }
     fprintf(file, "\n");
@@@ -312,9 -307,9 +312,9 @@@ int main(int argc, char **argv
     file = fopen(BASENAME ".c", "w");
     dump_modes(file, m, nb);
     fclose(file);
-    file = fopen(BASENAME ".h", "w");
+    /*file = fopen(BASENAME ".h", "w");
     dump_header(file, m, nb);
-    fclose(file);
+    fclose(file);*/
     for (i=0;i<nb;i++)
        celt_mode_destroy(m[i]);
     free(m);
diff --combined libcelt/modes.c
@@@ -85,13 -85,11 +85,13 @@@ static const unsigned char band_allocat
  };
  #endif
  
- #ifdef STATIC_MODES
--#ifdef FIXED_POINT
--#include "static_modes_fixed.c"
--#else
--#include "static_modes_float.c"
- #endif
--#endif
++#ifndef CUSTOM_MODES_ONLY
++ #ifdef FIXED_POINT
++  #include "static_modes_fixed.c"
++ #else
++  #include "static_modes_float.c"
++ #endif
++#endif /* CUSTOM_MODES_ONLY */
  
  #ifndef M_PI
  #define M_PI 3.141592653
@@@ -117,7 -115,7 +117,7 @@@ int celt_mode_info(const CELTMode *mode
     return CELT_OK;
  }
  
- #ifndef STATIC_MODES
+ #ifdef CUSTOM_MODES
  
  /* Defining 25 critical bands for the full 0-20 kHz audio bandwidth
     Taken from http://ccrma.stanford.edu/~jos/bbt/Bark_Frequency_Scale.html */
@@@ -253,24 -251,11 +253,11 @@@ static void compute_allocation_table(CE
     mode->allocVectors = allocVectors;
  }
  
- #endif /* STATIC_MODES */
+ #endif /* CUSTOM_MODES */
  
  CELTMode *celt_mode_create(celt_int32 Fs, int frame_size, int *error)
  {
     int i;
- #ifdef STATIC_MODES
-    for (i=0;i<TOTAL_MODES;i++)
-    {
-       if (Fs == static_mode_list[i]->Fs &&
-           frame_size == static_mode_list[i]->shortMdctSize*static_mode_list[i]->nbShortMdcts)
-       {
-          return (CELTMode*)static_mode_list[i];
-       }
-    }
-    if (error)
-       *error = CELT_BAD_ARG;
-    return NULL;
- #else
     int res;
     CELTMode *mode=NULL;
     celt_word16 *window;
        goto failure;
  #endif 
  
++#ifndef CUSTOM_MODES_ONLY
+    for (i=0;i<TOTAL_MODES;i++)
+    {
+       int j;
+       for (j=0;j<4;j++)
+       {
+          if (Fs == static_mode_list[i]->Fs &&
+                (frame_size<<j) == static_mode_list[i]->shortMdctSize*static_mode_list[i]->nbShortMdcts)
+          {
+             if (error)
+                *error = CELT_OK;
+             return (CELTMode*)static_mode_list[i];
+          }
+       }
+    }
++#endif /* CUSTOM_MODES_ONLY */
++
+ #ifndef CUSTOM_MODES
+    if (error)
+       *error = CELT_BAD_ARG;
+    return NULL;
+ #else
     /* The good thing here is that permutation of the arguments will automatically be invalid */
     
     if (Fs < 8000 || Fs > 96000)
@@@ -415,15 -420,23 +425,24 @@@ failure
     if (mode!=NULL)
        celt_mode_destroy(mode);
     return NULL;
- #endif /* !STATIC_MODES */
+ #endif /* !CUSTOM_MODES */
  }
  
  void celt_mode_destroy(CELTMode *mode)
  {
- #ifndef STATIC_MODES
+ #ifdef CUSTOM_MODES
+    int i;
     if (mode == NULL)
        return;
++#ifndef CUSTOM_MODES_ONLY
+    for (i=0;i<TOTAL_MODES;i++)
+    {
+       if (mode == static_mode_list[i])
+       {
+          return;
+       }
+    }
 -
++#endif /* CUSTOM_MODES_ONLY */
     celt_free((celt_int16*)mode->eBands);
     celt_free((celt_int16*)mode->allocVectors);
     
  
     celt_free((celt_int16*)mode->cache.index);
     celt_free((unsigned char*)mode->cache.bits);
 +   celt_free((unsigned char*)mode->cache.caps);
     clt_mdct_clear(&mode->mdct);
  
     celt_free((CELTMode *)mode);
diff --combined libcelt/modes.h
  
  #define CELT_BITSTREAM_VERSION 0x8000000f
  
- #ifdef STATIC_MODES
- #include "static_modes.h"
- #endif
  #define MAX_PERIOD 1024
  
  #ifndef CHANNELS
@@@ -71,7 -67,6 +67,7 @@@ typedef struct 
     int size;
     const celt_int16 *index;
     const unsigned char *bits;
 +   const unsigned char *caps;
  } PulseCache;
  
  /** Mode definition (opaque)
diff --combined libcelt/rate.c
@@@ -52,7 -52,7 +52,7 @@@ static const unsigned char LOG2_FRAC_TA
    32,33,34,34,35,36,36,37,37
  };
  
- #ifndef STATIC_MODES
+ #ifdef CUSTOM_MODES
  
  /*Determines if V(N,K) fits in a 32-bit unsigned integer.
    N and K are themselves limited to 15 bits.*/
@@@ -77,9 -77,7 +77,9 @@@ static int fits_in32(int _n, int _k
  
  void compute_pulse_cache(CELTMode *m, int LM)
  {
 +   int C;
     int i;
 +   int j;
     int curr=0;
     int nbEntries=0;
     int entryN[100], entryK[100], entryI[100];
@@@ -87,7 -85,6 +87,7 @@@
     PulseCache *cache = &m->cache;
     celt_int16 *cindex;
     unsigned char *bits;
 +   unsigned char *cap;
  
     cindex = celt_alloc(sizeof(cache->index[0])*m->nbEBands*(LM+2));
     cache->index = cindex;
@@@ -95,6 -92,7 +95,6 @@@
     /* Scan for all unique band sizes */
     for (i=0;i<=LM+1;i++)
     {
 -      int j;
        for (j=0;j<m->nbEBands;j++)
        {
           int k;
     /* Compute the cache for all unique sizes */
     for (i=0;i<nbEntries;i++)
     {
 -      int j;
        unsigned char *ptr = bits+entryI[i];
        celt_int16 tmp[MAX_PULSES+1];
        get_required_bits(tmp, entryN[i], get_pulses(entryK[i]), BITRES);
           ptr[j] = tmp[get_pulses(j)]-1;
        ptr[0] = entryK[i];
     }
 +
 +   /* Compute the maximum rate for each band at which we'll reliably use as
 +       many bits as we ask for. */
 +   cache->caps = cap = celt_alloc(sizeof(cache->caps[0])*(LM+1)*2*m->nbEBands);
 +   for (i=0;i<=LM;i++)
 +   {
 +      for (C=1;C<=2;C++)
 +      {
 +         int shift;
 +         shift = C+i+BITRES-2;
 +         for (j=0;j<m->nbEBands;j++)
 +         {
 +            int N0;
 +            int max_bits;
 +            int rmask;
 +            N0 = m->eBands[j+1]-m->eBands[j];
 +            rmask = N0==1 ? (1<<shift)-1 : 0;
 +            /* N=1 bands only have a sign bit and fine bits. */
 +            if (N0<<i == 1)
 +              max_bits = C*(1+MAX_FINE_BITS)<<BITRES;
 +            else
 +            {
 +               const unsigned char *pcache;
 +               celt_int32           num;
 +               celt_int32           den;
 +               int                  LM0;
 +               int                  N;
 +               int                  offset;
 +               int                  ndof;
 +               int                  qb;
 +               int                  k;
 +               LM0 = 0;
 +               /* Even-sized bands bigger than N=4 can be split one more
 +                   time (N=4 also _can_ be split, but not without waste: the
 +                   result can only use 26 bits, but requires an allocation
 +                   of 32 to trigger the split). */
 +               if (N0 > 4 && !(N0&1))
 +               {
 +                  N0>>=1;
 +                  LM0--;
 +               }
 +               /* N0=1 and N0=2 bands can't be split down to N=2. */
 +               else if (N0 <= 2)
 +               {
 +                  LM0=IMIN(i,3-N0);
 +                  N0<<=LM0;
 +               }
 +               /* Compute the cost for the lowest-level PVQ of a fully split
 +                   band. */
 +               pcache = bits + cindex[(LM0+1)*m->nbEBands+j];
 +               max_bits = pcache[pcache[0]]+1;
 +               /* Add in the cost of coding regular splits. */
 +               N = N0;
 +               for(k=0;k<i-LM0;k++){
 +                  max_bits <<= 1;
 +                  /* Offset the number of qtheta bits by log2(N)/2
 +                      + QTHETA_OFFSET compared to their "fair share" of
 +                      total/N */
 +                  offset = (m->logN[j]+(LM0+k<<BITRES)>>1)-QTHETA_OFFSET;
 +                  /* The number of qtheta bits we'll allocate if the remainder
 +                      is to be max_bits. */
 +                  num=(celt_int32)((2*N-1)*offset+max_bits)<<9;
 +                  den=((celt_int32)(2*N-1)<<9)-495;
 +                  qb = IMIN((num+(den>>1))/den, 8<<BITRES);
 +                  celt_assert(qb >= 0);
 +                  /* The average cost for theta when qn==256 is
 +                      7.73246 bits for the triangular PDF. */
 +                  max_bits += qb*495+256>>9;
 +                  N <<= 1;
 +               }
 +               /* Add in the cost of a stereo split, if necessary. */
 +               if (C==2)
 +               {
 +                  max_bits <<= 1;
 +                  offset = (m->logN[j]+(i<<BITRES)>>1)-QTHETA_OFFSET_STEREO;
 +                  ndof = 2*N-1-(N==2);
 +                  num = (celt_int32)(max_bits+ndof*offset)<<7;
 +                  den = ((celt_int32)ndof<<7)-(N==2?128:125);
 +                  qb = IMIN((num+(den>>1))/den, 8<<BITRES);
 +                  celt_assert(qb >= 0);
 +                  /* The average cost for theta when qn==256, N>2 is
 +                      7.8174 bits for the step PDF. */
 +                  max_bits += N==2 ? qb : (qb*125+64>>7);
 +               }
 +               /* Add the fine bits we'll use. */
 +               /* Compensate for the extra DoF in stereo */
 +               ndof = C*N + ((C==2 && N>2) ? 1 : 0);
 +               /* Offset the number of fine bits by log2(N)/2 + FINE_OFFSET
 +                   compared to their "fair share" of total/N */
 +               offset = (m->logN[j] + (i<<BITRES)>>1)-FINE_OFFSET;
 +               /* N=2 is the only point that doesn't match the curve */
 +               if (N==2)
 +                  offset += 1<<BITRES>>2;
 +               /* The number of fine bits we'll allocate if the remainder is
 +                   to be max_bits. */
 +               num = max_bits+ndof*offset;
 +               den = ndof-1<<BITRES;
 +               qb = IMIN((num+(den>>1))/den, MAX_FINE_BITS);
 +               celt_assert(qb >= 0);
 +               max_bits += C*qb<<BITRES;
 +            }
 +            celt_assert(max_bits+rmask>>shift < 256);
 +            *cap++ = (unsigned char)(max_bits+rmask>>shift);
 +         }
 +      }
 +   }
  }
  
- #endif /* !STATIC_MODES */
+ #endif /* !CUSTOM_MODES */
  
  
  #define ALLOC_STEPS 6
  
  static inline int interp_bits2pulses(const CELTMode *m, int start, int end, int skip_start,
 -      const int *bits1, const int *bits2, const int *thresh, int total, int skip_rsv,
 +      const int *bits1, const int *bits2, const int *thresh, const int *cap, int total, int skip_rsv,
        int *intensity, int intensity_rsv, int *dual_stereo, int dual_stereo_rsv, int *bits,
        int *ebits, int *fine_priority, int _C, int LM, void *ec, int encode, int prev)
  {
           {
              done = 1;
              /* Don't allocate more than we can actually use */
 -            psum += IMIN(tmp, 64*C<<BITRES<<LM);
 +            psum += IMIN(tmp, cap[j]);
           } else {
              if (tmp >= alloc_floor)
                 psum += alloc_floor;
        } else
           done = 1;
        /* Don't allocate more than we can actually use */
 -      tmp = IMIN(tmp, 64*C<<BITRES<<LM);
 +      tmp = IMIN(tmp, cap[j]);
        bits[j] = tmp;
        psum += tmp;
     }
           }
        }
  
 -      /* The other bits are assigned to PVQ */
 +      /* Sweep any bits over the cap into the first band.
 +         They'll be reallocated by the normal rebalancing code, which gives
 +          them the best chance to be used _somewhere_. */
 +      {
 +         int tmp = IMAX(bits[j]-cap[j],0);
 +         bits[j] -= tmp;
 +         bits[start] += tmp;
 +      }
 +
 +      /* Remove the allocated fine bits; the other bits are assigned to PVQ */
        bits[j] -= C*ebits[j]<<BITRES;
        celt_assert(bits[j] >= 0);
        celt_assert(ebits[j] >= 0);
     return codedBands;
  }
  
 -int compute_allocation(const CELTMode *m, int start, int end, const int *offsets, int alloc_trim, int *intensity, int *dual_stereo,
 +int compute_allocation(const CELTMode *m, int start, int end, const int *offsets, const int *cap, int alloc_trim, int *intensity, int *dual_stereo,
        int total, int *pulses, int *ebits, int *fine_priority, int _C, int LM, void *ec, int encode, int prev)
  {
     int lo, hi, len, j;
           {
              done = 1;
              /* Don't allocate more than we can actually use */
 -            psum += IMIN(bits1[j], 64*C<<BITRES<<LM);
 +            psum += IMIN(bits1[j], cap[j]);
           } else {
              if (bits1[j] >= C<<BITRES)
                 psum += C<<BITRES;
           skip_start = j;
        bits2[j] -= bits1[j];
     }
 -   codedBands = interp_bits2pulses(m, start, end, skip_start, bits1, bits2, thresh,
 +   codedBands = interp_bits2pulses(m, start, end, skip_start, bits1, bits2, thresh, cap,
           total, skip_rsv, intensity, intensity_rsv, dual_stereo, dual_stereo_rsv,
           pulses, ebits, fine_priority, C, LM, ec, encode, prev);
     RESTORE_STACK;
index 0000000,5e8da29..41c9805
mode 000000,100644..100644
--- /dev/null
@@@ -1,0 -1,128 +1,130 @@@
 -{392, cache_index50, cache_bits50},   /* cache */
+ /* The contents of this file is automatically generated and contains static
+    definitions for some pre-defined modes */
+ #include "modes.h"
+ #include "rate.h"
+ #ifndef DEF_WINDOW120
+ #define DEF_WINDOW120
+ static const celt_word16 window120[120] = {
+ 2, 20, 55, 108, 178, 266, 372, 494, 635, 792, 966, 1157, 1365, 1590, 1831, 2089, 2362, 2651, 2956, 3276, 3611, 3961, 4325, 4703, 5094, 5499, 5916, 6346, 6788, 7241, 7705, 8179, 8663, 9156, 9657, 10167, 10684, 11207, 11736, 12271, 12810, 13353, 13899, 14447, 14997, 15547, 16098, 16648, 17197, 17744, 18287, 18827, 19363, 19893, 20418, 20936, 21447, 21950, 22445, 22931, 23407, 23874, 24330, 24774, 25208, 25629, 26039, 26435, 26819, 27190, 27548, 27893, 28224, 28541, 28845, 29135, 29411, 29674, 29924, 30160, 30384, 30594, 30792, 30977, 31151, 31313, 31463, 31602, 31731, 31849, 31958, 32057, 32148, 32229, 32303, 32370, 32429, 32481, 32528, 32568, 32604, 32634, 32661, 32683, 32701, 32717, 32729, 32740, 32748, 32754, 32758, 32762, 32764, 32766, 32767, 32767, 32767, 32767, 32767, 32767, };
+ #endif
+ #ifndef DEF_LOGN400
+ #define DEF_LOGN400
+ static const celt_int16 logN400[21] = {
+ 0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 8, 8, 16, 16, 16, 21, 21, 24, 29, 34, 36, };
+ #endif
+ #ifndef DEF_PULSE_CACHE50
+ #define DEF_PULSE_CACHE50
+ static const celt_int16 cache_index50[105] = {
+ -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 41, 41, 41, 82, 82, 123, 164, 200, 222, 0, 0, 0, 0, 0, 0, 0, 0, 41, 41, 41, 41, 123, 123, 123, 164, 164, 240, 266, 283, 295, 41, 41, 41, 41, 41, 41, 41, 41, 123, 123, 123, 123, 240, 240, 240, 266, 266, 305, 318, 328, 336, 123, 123, 123, 123, 123, 123, 123, 123, 240, 240, 240, 240, 305, 305, 305, 318, 318, 343, 351, 358, 364, 240, 240, 240, 240, 240, 240, 240, 240, 305, 305, 305, 305, 343, 343, 343, 351, 351, 370, 376, 382, 387, };
+ static const unsigned char cache_bits50[392] = {
+ 40, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 40, 15, 23, 28, 31, 34, 36, 38, 39, 41, 42, 43, 44, 45, 46, 47, 47, 49, 50, 51, 52, 53, 54, 55, 55, 57, 58, 59, 60, 61, 62, 63, 63, 65, 66, 67, 68, 69, 70, 71, 71, 40, 20, 33, 41, 48, 53, 57, 61, 64, 66, 69, 71, 73, 75, 76, 78, 80, 82, 85, 87, 89, 91, 92, 94, 96, 98, 101, 103, 105, 107, 108, 110, 112, 114, 117, 119, 121, 123, 124, 126, 128, 40, 23, 39, 51, 60, 67, 73, 79, 83, 87, 91, 94, 97, 100, 102, 105, 107, 111, 115, 118, 121, 124, 126, 129, 131, 135, 139, 142, 145, 148, 150, 153, 155, 159, 163, 166, 169, 172, 174, 177, 179, 35, 28, 49, 65, 78, 89, 99, 107, 114, 120, 126, 132, 136, 141, 145, 149, 153, 159, 165, 171, 176, 180, 185, 189, 192, 199, 205, 211, 216, 220, 225, 229, 232, 239, 245, 251, 21, 33, 58, 79, 97, 112, 125, 137, 148, 157, 166, 174, 182, 189, 195, 201, 207, 217, 227, 235, 243, 251, 17, 35, 63, 86, 106, 123, 139, 152, 165, 177, 187, 197, 206, 214, 222, 230, 237, 250, 25, 31, 55, 75, 91, 105, 117, 128, 138, 146, 154, 161, 168, 174, 180, 185, 190, 200, 208, 215, 222, 229, 235, 240, 245, 255, 16, 36, 65, 89, 110, 128, 144, 159, 173, 185, 196, 207, 217, 226, 234, 242, 250, 11, 41, 74, 103, 128, 151, 172, 191, 209, 225, 241, 255, 9, 43, 79, 110, 138, 163, 186, 207, 227, 246, 12, 39, 71, 99, 123, 144, 164, 182, 198, 214, 228, 241, 253, 9, 44, 81, 113, 142, 168, 192, 214, 235, 255, 7, 49, 90, 127, 160, 191, 220, 247, 6, 51, 95, 134, 170, 203, 234, 7, 47, 87, 123, 155, 184, 212, 237, 6, 52, 97, 137, 174, 208, 240, 5, 57, 106, 151, 192, 231, 5, 59, 111, 158, 202, 243, 5, 55, 103, 147, 187, 224, 5, 60, 113, 161, 206, 248, 4, 65, 122, 175, 224, 4, 67, 127, 182, 234, };
++static const unsigned char cache_caps50[168] = {
++18, 18, 18, 18, 18, 18, 18, 18, 28, 28, 28, 28, 55, 55, 55, 92, 92, 117, 149, 142, 140, 18, 18, 18, 18, 18, 18, 18, 18, 38, 38, 38, 38, 62, 62, 62, 99, 99, 125, 157, 147, 145, 14, 14, 14, 14, 14, 14, 14, 14, 27, 27, 27, 27, 58, 58, 58, 94, 94, 120, 153, 145, 142, 19, 19, 19, 19, 19, 19, 19, 19, 31, 31, 31, 31, 62, 62, 62, 98, 98, 124, 157, 148, 144, 14, 14, 14, 14, 14, 14, 14, 14, 29, 29, 29, 29, 60, 60, 60, 95, 95, 120, 154, 147, 143, 16, 16, 16, 16, 16, 16, 16, 16, 31, 31, 31, 31, 62, 62, 62, 97, 97, 122, 156, 148, 145, 15, 15, 15, 15, 15, 15, 15, 15, 30, 30, 30, 30, 60, 60, 60, 95, 95, 121, 154, 147, 144, 16, 16, 16, 16, 16, 16, 16, 16, 31, 31, 31, 31, 61, 61, 61, 96, 96, 122, 155, 148, 145, };
+ #endif
+ #ifndef FFT_TWIDDLES48000_960
+ #define FFT_TWIDDLES48000_960
+ static const kiss_twiddle_cpx fft_twiddles48000_960[480] = {
+ {32767, 0}, {32766, -429}, {32757, -858}, {32743, -1287}, {32724, -1715}, {32698, -2143}, {32667, -2570}, {32631, -2998}, {32588, -3425}, {32541, -3851}, {32488, -4277}, {32429, -4701}, {32364, -5125}, {32295, -5548}, {32219, -5971}, {32138, -6393}, {32051, -6813}, {31960, -7231}, {31863, -7650}, {31760, -8067}, {31652, -8481}, {31539, -8895}, {31419, -9306}, {31294, -9716}, {31165, -10126}, {31030, -10532}, {30889, -10937}, {30743, -11340}, {30592, -11741}, {30436, -12141}, {30274, -12540}, {30107, -12935}, {29936, -13328}, {29758, -13718}, {29577, -14107}, {29390, -14493}, {29197, -14875}, {29000, -15257}, {28797, -15635}, {28590, -16010}, {28379, -16384}, {28162, -16753}, {27940, -17119}, {27714, -17484}, {27482, -17845}, {27246, -18205}, {27006, -18560}, {26760, -18911}, {26510, -19260}, {26257, -19606}, {25997, -19947}, {25734, -20286}, {25466, -20621}, {25194, -20952}, {24918, -21281}, {24637, -21605}, {24353, -21926}, {24063, -22242}, {23770, -22555}, {23473, -22865}, {23171, -23171}, {22866, -23472}, {22557, -23769}, {22244, -24063}, {21927, -24352}, {21606, -24636}, {21282, -24917}, {20954, -25194}, {20622, -25465}, {20288, -25733}, {19949, -25997}, {19607, -26255}, {19261, -26509}, {18914, -26760}, {18561, -27004}, {18205, -27246}, {17846, -27481}, {17485, -27713}, {17122, -27940}, {16755, -28162}, {16385, -28378}, {16012, -28590}, {15636, -28797}, {15258, -28999}, {14878, -29197}, {14494, -29389}, {14108, -29576}, {13720, -29757}, {13329, -29934}, {12937, -30107}, {12540, -30274}, {12142, -30435}, {11744, -30592}, {11342, -30743}, {10939, -30889}, {10534, -31030}, {10127, -31164}, {9718, -31294}, {9307, -31418}, {8895, -31537}, {8482, -31652}, {8067, -31759}, {7650, -31862}, {7233, -31960}, {6815, -32051}, {6393, -32138}, {5973, -32219}, {5549, -32294}, {5127, -32364}, {4703, -32429}, {4278, -32487}, {3852, -32541}, {3426, -32588}, {2999, -32630}, {2572, -32667}, {2144, -32698}, {1716, -32724}, {1287, -32742}, {860, -32757}, {430, -32766}, {0, -32767}, {-429, -32766}, {-858, -32757}, {-1287, -32743}, {-1715, -32724}, {-2143, -32698}, {-2570, -32667}, {-2998, -32631}, {-3425, -32588}, {-3851, -32541}, {-4277, -32488}, {-4701, -32429}, {-5125, -32364}, {-5548, -32295}, {-5971, -32219}, {-6393, -32138}, {-6813, -32051}, {-7231, -31960}, {-7650, -31863}, {-8067, -31760}, {-8481, -31652}, {-8895, -31539}, {-9306, -31419}, {-9716, -31294}, {-10126, -31165}, {-10532, -31030}, {-10937, -30889}, {-11340, -30743}, {-11741, -30592}, {-12141, -30436}, {-12540, -30274}, {-12935, -30107}, {-13328, -29936}, {-13718, -29758}, {-14107, -29577}, {-14493, -29390}, {-14875, -29197}, {-15257, -29000}, {-15635, -28797}, {-16010, -28590}, {-16384, -28379}, {-16753, -28162}, {-17119, -27940}, {-17484, -27714}, {-17845, -27482}, {-18205, -27246}, {-18560, -27006}, {-18911, -26760}, {-19260, -26510}, {-19606, -26257}, {-19947, -25997}, {-20286, -25734}, {-20621, -25466}, {-20952, -25194}, {-21281, -24918}, {-21605, -24637}, {-21926, -24353}, {-22242, -24063}, {-22555, -23770}, {-22865, -23473}, {-23171, -23171}, {-23472, -22866}, {-23769, -22557}, {-24063, -22244}, {-24352, -21927}, {-24636, -21606}, {-24917, -21282}, {-25194, -20954}, {-25465, -20622}, {-25733, -20288}, {-25997, -19949}, {-26255, -19607}, {-26509, -19261}, {-26760, -18914}, {-27004, -18561}, {-27246, -18205}, {-27481, -17846}, {-27713, -17485}, {-27940, -17122}, {-28162, -16755}, {-28378, -16385}, {-28590, -16012}, {-28797, -15636}, {-28999, -15258}, {-29197, -14878}, {-29389, -14494}, {-29576, -14108}, {-29757, -13720}, {-29934, -13329}, {-30107, -12937}, {-30274, -12540}, {-30435, -12142}, {-30592, -11744}, {-30743, -11342}, {-30889, -10939}, {-31030, -10534}, {-31164, -10127}, {-31294, -9718}, {-31418, -9307}, {-31537, -8895}, {-31652, -8482}, {-31759, -8067}, {-31862, -7650}, {-31960, -7233}, {-32051, -6815}, {-32138, -6393}, {-32219, -5973}, {-32294, -5549}, {-32364, -5127}, {-32429, -4703}, {-32487, -4278}, {-32541, -3852}, {-32588, -3426}, {-32630, -2999}, {-32667, -2572}, {-32698, -2144}, {-32724, -1716}, {-32742, -1287}, {-32757, -860}, {-32766, -430}, {-32767, 0}, {-32766, 429}, {-32757, 858}, {-32743, 1287}, {-32724, 1715}, {-32698, 2143}, {-32667, 2570}, {-32631, 2998}, {-32588, 3425}, {-32541, 3851}, {-32488, 4277}, {-32429, 4701}, {-32364, 5125}, {-32295, 5548}, {-32219, 5971}, {-32138, 6393}, {-32051, 6813}, {-31960, 7231}, {-31863, 7650}, {-31760, 8067}, {-31652, 8481}, {-31539, 8895}, {-31419, 9306}, {-31294, 9716}, {-31165, 10126}, {-31030, 10532}, {-30889, 10937}, {-30743, 11340}, {-30592, 11741}, {-30436, 12141}, {-30274, 12540}, {-30107, 12935}, {-29936, 13328}, {-29758, 13718}, {-29577, 14107}, {-29390, 14493}, {-29197, 14875}, {-29000, 15257}, {-28797, 15635}, {-28590, 16010}, {-28379, 16384}, {-28162, 16753}, {-27940, 17119}, {-27714, 17484}, {-27482, 17845}, {-27246, 18205}, {-27006, 18560}, {-26760, 18911}, {-26510, 19260}, {-26257, 19606}, {-25997, 19947}, {-25734, 20286}, {-25466, 20621}, {-25194, 20952}, {-24918, 21281}, {-24637, 21605}, {-24353, 21926}, {-24063, 22242}, {-23770, 22555}, {-23473, 22865}, {-23171, 23171}, {-22866, 23472}, {-22557, 23769}, {-22244, 24063}, {-21927, 24352}, {-21606, 24636}, {-21282, 24917}, {-20954, 25194}, {-20622, 25465}, {-20288, 25733}, {-19949, 25997}, {-19607, 26255}, {-19261, 26509}, {-18914, 26760}, {-18561, 27004}, {-18205, 27246}, {-17846, 27481}, {-17485, 27713}, {-17122, 27940}, {-16755, 28162}, {-16385, 28378}, {-16012, 28590}, {-15636, 28797}, {-15258, 28999}, {-14878, 29197}, {-14494, 29389}, {-14108, 29576}, {-13720, 29757}, {-13329, 29934}, {-12937, 30107}, {-12540, 30274}, {-12142, 30435}, {-11744, 30592}, {-11342, 30743}, {-10939, 30889}, {-10534, 31030}, {-10127, 31164}, {-9718, 31294}, {-9307, 31418}, {-8895, 31537}, {-8482, 31652}, {-8067, 31759}, {-7650, 31862}, {-7233, 31960}, {-6815, 32051}, {-6393, 32138}, {-5973, 32219}, {-5549, 32294}, {-5127, 32364}, {-4703, 32429}, {-4278, 32487}, {-3852, 32541}, {-3426, 32588}, {-2999, 32630}, {-2572, 32667}, {-2144, 32698}, {-1716, 32724}, {-1287, 32742}, {-860, 32757}, {-430, 32766}, {0, 32767}, {429, 32766}, {858, 32757}, {1287, 32743}, {1715, 32724}, {2143, 32698}, {2570, 32667}, {2998, 32631}, {3425, 32588}, {3851, 32541}, {4277, 32488}, {4701, 32429}, {5125, 32364}, {5548, 32295}, {5971, 32219}, {6393, 32138}, {6813, 32051}, {7231, 31960}, {7650, 31863}, {8067, 31760}, {8481, 31652}, {8895, 31539}, {9306, 31419}, {9716, 31294}, {10126, 31165}, {10532, 31030}, {10937, 30889}, {11340, 30743}, {11741, 30592}, {12141, 30436}, {12540, 30274}, {12935, 30107}, {13328, 29936}, {13718, 29758}, {14107, 29577}, {14493, 29390}, {14875, 29197}, {15257, 29000}, {15635, 28797}, {16010, 28590}, {16384, 28379}, {16753, 28162}, {17119, 27940}, {17484, 27714}, {17845, 27482}, {18205, 27246}, {18560, 27006}, {18911, 26760}, {19260, 26510}, {19606, 26257}, {19947, 25997}, {20286, 25734}, {20621, 25466}, {20952, 25194}, {21281, 24918}, {21605, 24637}, {21926, 24353}, {22242, 24063}, {22555, 23770}, {22865, 23473}, {23171, 23171}, {23472, 22866}, {23769, 22557}, {24063, 22244}, {24352, 21927}, {24636, 21606}, {24917, 21282}, {25194, 20954}, {25465, 20622}, {25733, 20288}, {25997, 19949}, {26255, 19607}, {26509, 19261}, {26760, 18914}, {27004, 18561}, {27246, 18205}, {27481, 17846}, {27713, 17485}, {27940, 17122}, {28162, 16755}, {28378, 16385}, {28590, 16012}, {28797, 15636}, {28999, 15258}, {29197, 14878}, {29389, 14494}, {29576, 14108}, {29757, 13720}, {29934, 13329}, {30107, 12937}, {30274, 12540}, {30435, 12142}, {30592, 11744}, {30743, 11342}, {30889, 10939}, {31030, 10534}, {31164, 10127}, {31294, 9718}, {31418, 9307}, {31537, 8895}, {31652, 8482}, {31759, 8067}, {31862, 7650}, {31960, 7233}, {32051, 6815}, {32138, 6393}, {32219, 5973}, {32294, 5549}, {32364, 5127}, {32429, 4703}, {32487, 4278}, {32541, 3852}, {32588, 3426}, {32630, 2999}, {32667, 2572}, {32698, 2144}, {32724, 1716}, {32742, 1287}, {32757, 860}, {32766, 430}, };
+ #ifndef FFT_BITREV480
+ #define FFT_BITREV480
+ static const celt_int16 fft_bitrev480[480] = {
+ 0, 120, 240, 360, 30, 150, 270, 390, 60, 180, 300, 420, 90, 210, 330, 450, 15, 135, 255, 375, 45, 165, 285, 405, 75, 195, 315, 435, 105, 225, 345, 465, 5, 125, 245, 365, 35, 155, 275, 395, 65, 185, 305, 425, 95, 215, 335, 455, 20, 140, 260, 380, 50, 170, 290, 410, 80, 200, 320, 440, 110, 230, 350, 470, 10, 130, 250, 370, 40, 160, 280, 400, 70, 190, 310, 430, 100, 220, 340, 460, 25, 145, 265, 385, 55, 175, 295, 415, 85, 205, 325, 445, 115, 235, 355, 475, 1, 121, 241, 361, 31, 151, 271, 391, 61, 181, 301, 421, 91, 211, 331, 451, 16, 136, 256, 376, 46, 166, 286, 406, 76, 196, 316, 436, 106, 226, 346, 466, 6, 126, 246, 366, 36, 156, 276, 396, 66, 186, 306, 426, 96, 216, 336, 456, 21, 141, 261, 381, 51, 171, 291, 411, 81, 201, 321, 441, 111, 231, 351, 471, 11, 131, 251, 371, 41, 161, 281, 401, 71, 191, 311, 431, 101, 221, 341, 461, 26, 146, 266, 386, 56, 176, 296, 416, 86, 206, 326, 446, 116, 236, 356, 476, 2, 122, 242, 362, 32, 152, 272, 392, 62, 182, 302, 422, 92, 212, 332, 452, 17, 137, 257, 377, 47, 167, 287, 407, 77, 197, 317, 437, 107, 227, 347, 467, 7, 127, 247, 367, 37, 157, 277, 397, 67, 187, 307, 427, 97, 217, 337, 457, 22, 142, 262, 382, 52, 172, 292, 412, 82, 202, 322, 442, 112, 232, 352, 472, 12, 132, 252, 372, 42, 162, 282, 402, 72, 192, 312, 432, 102, 222, 342, 462, 27, 147, 267, 387, 57, 177, 297, 417, 87, 207, 327, 447, 117, 237, 357, 477, 3, 123, 243, 363, 33, 153, 273, 393, 63, 183, 303, 423, 93, 213, 333, 453, 18, 138, 258, 378, 48, 168, 288, 408, 78, 198, 318, 438, 108, 228, 348, 468, 8, 128, 248, 368, 38, 158, 278, 398, 68, 188, 308, 428, 98, 218, 338, 458, 23, 143, 263, 383, 53, 173, 293, 413, 83, 203, 323, 443, 113, 233, 353, 473, 13, 133, 253, 373, 43, 163, 283, 403, 73, 193, 313, 433, 103, 223, 343, 463, 28, 148, 268, 388, 58, 178, 298, 418, 88, 208, 328, 448, 118, 238, 358, 478, 4, 124, 244, 364, 34, 154, 274, 394, 64, 184, 304, 424, 94, 214, 334, 454, 19, 139, 259, 379, 49, 169, 289, 409, 79, 199, 319, 439, 109, 229, 349, 469, 9, 129, 249, 369, 39, 159, 279, 399, 69, 189, 309, 429, 99, 219, 339, 459, 24, 144, 264, 384, 54, 174, 294, 414, 84, 204, 324, 444, 114, 234, 354, 474, 14, 134, 254, 374, 44, 164, 284, 404, 74, 194, 314, 434, 104, 224, 344, 464, 29, 149, 269, 389, 59, 179, 299, 419, 89, 209, 329, 449, 119, 239, 359, 479, };
+ #endif
+ #ifndef FFT_BITREV240
+ #define FFT_BITREV240
+ static const celt_int16 fft_bitrev240[240] = {
+ 0, 60, 120, 180, 15, 75, 135, 195, 30, 90, 150, 210, 45, 105, 165, 225, 5, 65, 125, 185, 20, 80, 140, 200, 35, 95, 155, 215, 50, 110, 170, 230, 10, 70, 130, 190, 25, 85, 145, 205, 40, 100, 160, 220, 55, 115, 175, 235, 1, 61, 121, 181, 16, 76, 136, 196, 31, 91, 151, 211, 46, 106, 166, 226, 6, 66, 126, 186, 21, 81, 141, 201, 36, 96, 156, 216, 51, 111, 171, 231, 11, 71, 131, 191, 26, 86, 146, 206, 41, 101, 161, 221, 56, 116, 176, 236, 2, 62, 122, 182, 17, 77, 137, 197, 32, 92, 152, 212, 47, 107, 167, 227, 7, 67, 127, 187, 22, 82, 142, 202, 37, 97, 157, 217, 52, 112, 172, 232, 12, 72, 132, 192, 27, 87, 147, 207, 42, 102, 162, 222, 57, 117, 177, 237, 3, 63, 123, 183, 18, 78, 138, 198, 33, 93, 153, 213, 48, 108, 168, 228, 8, 68, 128, 188, 23, 83, 143, 203, 38, 98, 158, 218, 53, 113, 173, 233, 13, 73, 133, 193, 28, 88, 148, 208, 43, 103, 163, 223, 58, 118, 178, 238, 4, 64, 124, 184, 19, 79, 139, 199, 34, 94, 154, 214, 49, 109, 169, 229, 9, 69, 129, 189, 24, 84, 144, 204, 39, 99, 159, 219, 54, 114, 174, 234, 14, 74, 134, 194, 29, 89, 149, 209, 44, 104, 164, 224, 59, 119, 179, 239, };
+ #endif
+ #ifndef FFT_BITREV120
+ #define FFT_BITREV120
+ static const celt_int16 fft_bitrev120[120] = {
+ 0, 30, 60, 90, 15, 45, 75, 105, 5, 35, 65, 95, 20, 50, 80, 110, 10, 40, 70, 100, 25, 55, 85, 115, 1, 31, 61, 91, 16, 46, 76, 106, 6, 36, 66, 96, 21, 51, 81, 111, 11, 41, 71, 101, 26, 56, 86, 116, 2, 32, 62, 92, 17, 47, 77, 107, 7, 37, 67, 97, 22, 52, 82, 112, 12, 42, 72, 102, 27, 57, 87, 117, 3, 33, 63, 93, 18, 48, 78, 108, 8, 38, 68, 98, 23, 53, 83, 113, 13, 43, 73, 103, 28, 58, 88, 118, 4, 34, 64, 94, 19, 49, 79, 109, 9, 39, 69, 99, 24, 54, 84, 114, 14, 44, 74, 104, 29, 59, 89, 119, };
+ #endif
+ #ifndef FFT_BITREV60
+ #define FFT_BITREV60
+ static const celt_int16 fft_bitrev60[60] = {
+ 0, 15, 30, 45, 5, 20, 35, 50, 10, 25, 40, 55, 1, 16, 31, 46, 6, 21, 36, 51, 11, 26, 41, 56, 2, 17, 32, 47, 7, 22, 37, 52, 12, 27, 42, 57, 3, 18, 33, 48, 8, 23, 38, 53, 13, 28, 43, 58, 4, 19, 34, 49, 9, 24, 39, 54, 14, 29, 44, 59, };
+ #endif
+ #ifndef FFT_STATE48000_960_0
+ #define FFT_STATE48000_960_0
+ static const kiss_fft_state fft_state48000_960_0 = {
+ 480,  /* nfft */
+ -1,   /* shift */
+ {4, 120, 4, 30, 2, 15, 3, 5, 5, 1, 0, 0, 0, 0, 0, 0, },       /* factors */
+ fft_bitrev480,        /* bitrev */
+ fft_twiddles48000_960,        /* bitrev */
+ };
+ #endif
+ #ifndef FFT_STATE48000_960_1
+ #define FFT_STATE48000_960_1
+ static const kiss_fft_state fft_state48000_960_1 = {
+ 240,  /* nfft */
+ 1,    /* shift */
+ {4, 60, 4, 15, 3, 5, 5, 1, 0, 0, 0, 0, 0, 0, 0, 0, }, /* factors */
+ fft_bitrev240,        /* bitrev */
+ fft_twiddles48000_960,        /* bitrev */
+ };
+ #endif
+ #ifndef FFT_STATE48000_960_2
+ #define FFT_STATE48000_960_2
+ static const kiss_fft_state fft_state48000_960_2 = {
+ 120,  /* nfft */
+ 2,    /* shift */
+ {4, 30, 2, 15, 3, 5, 5, 1, 0, 0, 0, 0, 0, 0, 0, 0, }, /* factors */
+ fft_bitrev120,        /* bitrev */
+ fft_twiddles48000_960,        /* bitrev */
+ };
+ #endif
+ #ifndef FFT_STATE48000_960_3
+ #define FFT_STATE48000_960_3
+ static const kiss_fft_state fft_state48000_960_3 = {
+ 60,   /* nfft */
+ 3,    /* shift */
+ {4, 15, 3, 5, 5, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, },  /* factors */
+ fft_bitrev60, /* bitrev */
+ fft_twiddles48000_960,        /* bitrev */
+ };
+ #endif
+ #endif
+ #ifndef MDCT_TWIDDLES960
+ #define MDCT_TWIDDLES960
+ static const celt_word16 mdct_twiddles960[481] = {
+ 32767, 32767, 32767, 32767, 32766, 32763, 32762, 32759, 32757, 32753, 32751, 32747, 32743, 32738, 32733, 32729, 32724, 32717, 32711, 32705, 32698, 32690, 32683, 32676, 32667, 32658, 32650, 32640, 32631, 32620, 32610, 32599, 32588, 32577, 32566, 32554, 32541, 32528, 32515, 32502, 32487, 32474, 32459, 32444, 32429, 32413, 32397, 32381, 32364, 32348, 32331, 32313, 32294, 32277, 32257, 32239, 32219, 32200, 32180, 32159, 32138, 32118, 32096, 32074, 32051, 32029, 32006, 31984, 31960, 31936, 31912, 31888, 31863, 31837, 31812, 31786, 31760, 31734, 31707, 31679, 31652, 31624, 31596, 31567, 31539, 31508, 31479, 31450, 31419, 31388, 31357, 31326, 31294, 31262, 31230, 31198, 31164, 31131, 31097, 31063, 31030, 30994, 30959, 30924, 30889, 30853, 30816, 30779, 30743, 30705, 30668, 30629, 30592, 30553, 30515, 30475, 30435, 30396, 30356, 30315, 30274, 30233, 30191, 30149, 30107, 30065, 30022, 29979, 29936, 29891, 29847, 29803, 29758, 29713, 29668, 29622, 29577, 29529, 29483, 29436, 29390, 29341, 29293, 29246, 29197, 29148, 29098, 29050, 29000, 28949, 28899, 28848, 28797, 28746, 28694, 28642, 28590, 28537, 28485, 28432, 28378, 28324, 28271, 28217, 28162, 28106, 28051, 27995, 27940, 27884, 27827, 27770, 27713, 27657, 27598, 27540, 27481, 27423, 27365, 27305, 27246, 27187, 27126, 27066, 27006, 26945, 26883, 26822, 26760, 26698, 26636, 26574, 26510, 26448, 26383, 26320, 26257, 26191, 26127, 26062, 25997, 25931, 25866, 25800, 25734, 25667, 25601, 25533, 25466, 25398, 25330, 25262, 25194, 25125, 25056, 24987, 24917, 24848, 24778, 24707, 24636, 24566, 24495, 24424, 24352, 24280, 24208, 24135, 24063, 23990, 23917, 23842, 23769, 23695, 23622, 23546, 23472, 23398, 23322, 23246, 23171, 23095, 23018, 22942, 22866, 22788, 22711, 22634, 22557, 22478, 22400, 22322, 22244, 22165, 22085, 22006, 21927, 21846, 21766, 21687, 21606, 21524, 21443, 21363, 21282, 21199, 21118, 21035, 20954, 20870, 20788, 20705, 20621, 20538, 20455, 20371, 20286, 20202, 20118, 20034, 19947, 19863, 19777, 19692, 19606, 19520, 19434, 19347, 19260, 19174, 19088, 18999, 18911, 18825, 18737, 18648, 18560, 18472, 18384, 18294, 18205, 18116, 18025, 17936, 17846, 17757, 17666, 17576, 17485, 17395, 17303, 17212, 17122, 17030, 16937, 16846, 16755, 16662, 16569, 16477, 16385, 16291, 16198, 16105, 16012, 15917, 15824, 15730, 15636, 15541, 15447, 15352, 15257, 15162, 15067, 14973, 14875, 14781, 14685, 14589, 14493, 14396, 14300, 14204, 14107, 14010, 13914, 13815, 13718, 13621, 13524, 13425, 13328, 13230, 13133, 13033, 12935, 12836, 12738, 12638, 12540, 12441, 12341, 12241, 12142, 12044, 11943, 11843, 11744, 11643, 11542, 11442, 11342, 11241, 11139, 11039, 10939, 10836, 10736, 10635, 10534, 10431, 10330, 10228, 10127, 10024, 9921, 9820, 9718, 9614, 9512, 9410, 9306, 9204, 9101, 8998, 8895, 8791, 8689, 8585, 8481, 8377, 8274, 8171, 8067, 7962, 7858, 7753, 7650, 7545, 7441, 7336, 7231, 7129, 7023, 6917, 6813, 6709, 6604, 6498, 6393, 6288, 6182, 6077, 5973, 5867, 5760, 5656, 5549, 5445, 5339, 5232, 5127, 5022, 4914, 4809, 4703, 4596, 4490, 4384, 4278, 4171, 4065, 3958, 3852, 3745, 3640, 3532, 3426, 3318, 3212, 3106, 2998, 2891, 2786, 2679, 2570, 2465, 2358, 2251, 2143, 2037, 1929, 1823, 1715, 1609, 1501, 1393, 1287, 1180, 1073, 964, 858, 751, 644, 535, 429, 322, 214, 107, 0, };
+ #endif
+ static const CELTMode mode48000_960_120 = {
+ 48000,        /* Fs */
+ 120,  /* overlap */
+ 21,   /* nbEBands */
+ 21,   /* effEBands */
+ {27853, 0, 4096, 8192, },     /* preemph */
+ eband5ms,     /* eBands */
+ 12,   /* nbAllocVectors */
+ band_allocation,      /* allocVectors */
+ {1920, 3, {&fft_state48000_960_0, &fft_state48000_960_1, &fft_state48000_960_2, &fft_state48000_960_3, }, mdct_twiddles960},  /* mdct */
+ window120,    /* window */
+ 3,    /* maxLM */
+ 8,    /* nbShortMdcts */
+ 120,  /* shortMdctSize */
+ logN400,      /* logN */
++{392, cache_index50, cache_bits50, cache_caps50},     /* cache */
+ };
+ /* List of all the available modes */
+ #define TOTAL_MODES 1
+ static const CELTMode * const static_mode_list[TOTAL_MODES] = {
+ &mode48000_960_120,
+ };
index 0000000,ba11056..07733f8
mode 000000,100644..100644
--- /dev/null
@@@ -1,0 -1,132 +1,134 @@@
 -{392, cache_index50, cache_bits50},   /* cache */
+ /* The contents of this file is automatically generated and contains static
+    definitions for some pre-defined modes */
+ #include "modes.h"
+ #include "rate.h"
+ #ifndef DEF_WINDOW120
+ #define DEF_WINDOW120
+ static const celt_word16 window120[120] = {
+ 0.000067, 0.000606, 0.001682, 0.003295, 0.005444, 0.008128, 0.011344, 0.015091, 0.019365, 0.024164, 0.029483, 0.035320, 0.041669, 0.048525, 0.055884, 0.063738, 0.072082, 0.080907, 0.090208, 0.099974, 0.110198, 0.120869, 0.131977, 0.143512, 0.155462, 0.167814, 0.180555, 0.193673, 0.207152, 0.220977, 0.235132, 0.249602, 0.264369, 0.279414, 0.294720, 0.310268, 0.326038, 0.342009, 0.358162, 0.374474, 0.390925, 0.407491, 0.424152, 0.440884, 0.457665, 0.474471, 0.491280, 0.508068, 0.524813, 0.541491, 0.558080, 0.574557, 0.590900, 0.607088, 0.623100, 0.638913, 0.654509, 0.669868, 0.684971, 0.699800, 0.714339, 0.728571, 0.742480, 0.756054, 0.769279, 0.782143, 0.794634, 0.806744, 0.818465, 0.829787, 0.840707, 0.851218, 0.861317, 0.871002, 0.880271, 0.889125, 0.897564, 0.905591, 0.913209, 0.920423, 0.927237, 0.933660, 0.939697, 0.945357, 0.950649, 0.955584, 0.960171, 0.964422, 0.968349, 0.971963, 0.975279, 0.978309, 0.981066, 0.983565, 0.985819, 0.987842, 0.989649, 0.991253, 0.992669, 0.993910, 0.994990, 0.995923, 0.996722, 0.997399, 0.997967, 0.998437, 0.998822, 0.999132, 0.999376, 0.999565, 0.999708, 0.999812, 0.999886, 0.999936, 0.999967, 0.999985, 0.999995, 0.999999, 1.000000, 1.000000, };
+ #endif
+ #ifndef DEF_LOGN400
+ #define DEF_LOGN400
+ static const celt_int16 logN400[21] = {
+ 0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 8, 8, 16, 16, 16, 21, 21, 24, 29, 34, 36, };
+ #endif
+ #ifndef DEF_PULSE_CACHE50
+ #define DEF_PULSE_CACHE50
+ static const celt_int16 cache_index50[105] = {
+ -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 41, 41, 41, 82, 82, 123, 164, 200, 222, 0, 0, 0, 0, 0, 0, 0, 0, 41, 41, 41, 41, 123, 123, 123, 164, 164, 240, 266, 283, 295, 41, 41, 41, 41, 41, 41, 41, 41, 123, 123, 123, 123, 240, 240, 240, 266, 266, 305, 318, 328, 336, 123, 123, 123, 123, 123, 123, 123, 123, 240, 240, 240, 240, 305, 305, 305, 318, 318, 343, 351, 358, 364, 240, 240, 240, 240, 240, 240, 240, 240, 305, 305, 305, 305, 343, 343, 343, 351, 351, 370, 376, 382, 387, };
+ static const unsigned char cache_bits50[392] = {
+ 40, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 40, 15, 23, 28, 31, 34, 36, 38, 39, 41, 42, 43, 44, 45, 46, 47, 47, 49, 50, 51, 52, 53, 54, 55, 55, 57, 58, 59, 60, 61, 62, 63, 63, 65, 66, 67, 68, 69, 70, 71, 71, 40, 20, 33, 41, 48, 53, 57, 61, 64, 66, 69, 71, 73, 75, 76, 78, 80, 82, 85, 87, 89, 91, 92, 94, 96, 98, 101, 103, 105, 107, 108, 110, 112, 114, 117, 119, 121, 123, 124, 126, 128, 40, 23, 39, 51, 60, 67, 73, 79, 83, 87, 91, 94, 97, 100, 102, 105, 107, 111, 115, 118, 121, 124, 126, 129, 131, 135, 139, 142, 145, 148, 150, 153, 155, 159, 163, 166, 169, 172, 174, 177, 179, 35, 28, 49, 65, 78, 89, 99, 107, 114, 120, 126, 132, 136, 141, 145, 149, 153, 159, 165, 171, 176, 180, 185, 189, 192, 199, 205, 211, 216, 220, 225, 229, 232, 239, 245, 251, 21, 33, 58, 79, 97, 112, 125, 137, 148, 157, 166, 174, 182, 189, 195, 201, 207, 217, 227, 235, 243, 251, 17, 35, 63, 86, 106, 123, 139, 152, 165, 177, 187, 197, 206, 214, 222, 230, 237, 250, 25, 31, 55, 75, 91, 105, 117, 128, 138, 146, 154, 161, 168, 174, 180, 185, 190, 200, 208, 215, 222, 229, 235, 240, 245, 255, 16, 36, 65, 89, 110, 128, 144, 159, 173, 185, 196, 207, 217, 226, 234, 242, 250, 11, 41, 74, 103, 128, 151, 172, 191, 209, 225, 241, 255, 9, 43, 79, 110, 138, 163, 186, 207, 227, 246, 12, 39, 71, 99, 123, 144, 164, 182, 198, 214, 228, 241, 253, 9, 44, 81, 113, 142, 168, 192, 214, 235, 255, 7, 49, 90, 127, 160, 191, 220, 247, 6, 51, 95, 134, 170, 203, 234, 7, 47, 87, 123, 155, 184, 212, 237, 6, 52, 97, 137, 174, 208, 240, 5, 57, 106, 151, 192, 231, 5, 59, 111, 158, 202, 243, 5, 55, 103, 147, 187, 224, 5, 60, 113, 161, 206, 248, 4, 65, 122, 175, 224, 4, 67, 127, 182, 234, };
++static const unsigned char cache_caps50[168] = {
++18, 18, 18, 18, 18, 18, 18, 18, 28, 28, 28, 28, 55, 55, 55, 92, 92, 117, 149, 142, 140, 18, 18, 18, 18, 18, 18, 18, 18, 38, 38, 38, 38, 62, 62, 62, 99, 99, 125, 157, 147, 145, 14, 14, 14, 14, 14, 14, 14, 14, 27, 27, 27, 27, 58, 58, 58, 94, 94, 120, 153, 145, 142, 19, 19, 19, 19, 19, 19, 19, 19, 31, 31, 31, 31, 62, 62, 62, 98, 98, 124, 157, 148, 144, 14, 14, 14, 14, 14, 14, 14, 14, 29, 29, 29, 29, 60, 60, 60, 95, 95, 120, 154, 147, 143, 16, 16, 16, 16, 16, 16, 16, 16, 31, 31, 31, 31, 62, 62, 62, 97, 97, 122, 156, 148, 145, 15, 15, 15, 15, 15, 15, 15, 15, 30, 30, 30, 30, 60, 60, 60, 95, 95, 121, 154, 147, 144, 16, 16, 16, 16, 16, 16, 16, 16, 31, 31, 31, 31, 61, 61, 61, 96, 96, 122, 155, 148, 145, };
+ #endif
+ #ifndef FFT_TWIDDLES48000_960
+ #define FFT_TWIDDLES48000_960
+ static const kiss_twiddle_cpx fft_twiddles48000_960[480] = {
+ {1.000000, -0.000000}, {0.999914, -0.013090}, {0.999657, -0.026177}, {0.999229, -0.039260}, {0.998630, -0.052336}, {0.997859, -0.065403}, {0.996917, -0.078459}, {0.995805, -0.091502}, {0.994522, -0.104528}, {0.993068, -0.117537}, {0.991445, -0.130526}, {0.989651, -0.143493}, {0.987688, -0.156434}, {0.985556, -0.169350}, {0.983255, -0.182236}, {0.980785, -0.195090}, {0.978148, -0.207912}, {0.975342, -0.220697}, {0.972370, -0.233445}, {0.969231, -0.246153}, {0.965926, -0.258819}, {0.962455, -0.271440}, {0.958820, -0.284015}, {0.955020, -0.296542}, {0.951057, -0.309017}, {0.946930, -0.321439}, {0.942641, -0.333807}, {0.938191, -0.346117}, {0.933580, -0.358368}, {0.928810, -0.370557}, {0.923880, -0.382683}, {0.918791, -0.394744}, {0.913545, -0.406737}, {0.908143, -0.418660}, {0.902585, -0.430511}, {0.896873, -0.442289}, {0.891007, -0.453990}, {0.884988, -0.465615}, {0.878817, -0.477159}, {0.872496, -0.488621}, {0.866025, -0.500000}, {0.859406, -0.511293}, {0.852640, -0.522499}, {0.845728, -0.533615}, {0.838671, -0.544639}, {0.831470, -0.555570}, {0.824126, -0.566406}, {0.816642, -0.577145}, {0.809017, -0.587785}, {0.801254, -0.598325}, {0.793353, -0.608761}, {0.785317, -0.619094}, {0.777146, -0.629320}, {0.768842, -0.639439}, {0.760406, -0.649448}, {0.751840, -0.659346}, {0.743145, -0.669131}, {0.734322, -0.678801}, {0.725374, -0.688355}, {0.716302, -0.697790}, {0.707107, -0.707107}, {0.697790, -0.716302}, {0.688355, -0.725374}, {0.678801, -0.734322}, {0.669131, -0.743145}, {0.659346, -0.751840}, {0.649448, -0.760406}, {0.639439, -0.768842}, {0.629320, -0.777146}, {0.619094, -0.785317}, {0.608761, -0.793353}, {0.598325, -0.801254}, {0.587785, -0.809017}, {0.577145, -0.816642}, {0.566406, -0.824126}, {0.555570, -0.831470}, {0.544639, -0.838671}, {0.533615, -0.845728}, {0.522499, -0.852640}, {0.511293, -0.859406}, {0.500000, -0.866025}, {0.488621, -0.872496}, {0.477159, -0.878817}, {0.465615, -0.884988}, {0.453990, -0.891007}, {0.442289, -0.896873}, {0.430511, -0.902585}, {0.418660, -0.908143}, {0.406737, -0.913545}, {0.394744, -0.918791}, {0.382683, -0.923880}, {0.370557, -0.928810}, {0.358368, -0.933580}, {0.346117, -0.938191}, {0.333807, -0.942641}, {0.321439, -0.946930}, {0.309017, -0.951057}, {0.296542, -0.955020}, {0.284015, -0.958820}, {0.271440, -0.962455}, {0.258819, -0.965926}, {0.246153, -0.969231}, {0.233445, -0.972370}, {0.220697, -0.975342}, {0.207912, -0.978148}, {0.195090, -0.980785}, {0.182236, -0.983255}, {0.169350, -0.985556}, {0.156434, -0.987688}, {0.143493, -0.989651}, {0.130526, -0.991445}, {0.117537, -0.993068}, {0.104528, -0.994522}, {0.091502, -0.995805}, {0.078459, -0.996917}, {0.065403, -0.997859}, {0.052336, -0.998630}, {0.039260, -0.999229}, {0.026177, -0.999657}, {0.013090, -0.999914}, {0.000000, -1.000000}, {-0.013090, -0.999914}, {-0.026177, -0.999657}, {-0.039260, -0.999229}, {-0.052336, -0.998630}, {-0.065403, -0.997859}, {-0.078459, -0.996917}, {-0.091502, -0.995805}, {-0.104528, -0.994522}, {-0.117537, -0.993068}, {-0.130526, -0.991445}, {-0.143493, -0.989651}, {-0.156434, -0.987688}, {-0.169350, -0.985556}, {-0.182236, -0.983255}, {-0.195090, -0.980785}, {-0.207912, -0.978148}, {-0.220697, -0.975342}, {-0.233445, -0.972370}, {-0.246153, -0.969231}, {-0.258819, -0.965926}, {-0.271440, -0.962455}, {-0.284015, -0.958820}, {-0.296542, -0.955020}, {-0.309017, -0.951057}, {-0.321439, -0.946930}, {-0.333807, -0.942641}, {-0.346117, -0.938191}, {-0.358368, -0.933580}, {-0.370557, -0.928810}, {-0.382683, -0.923880}, {-0.394744, -0.918791}, {-0.406737, -0.913545}, {-0.418660, -0.908143}, {-0.430511, -0.902585}, {-0.442289, -0.896873}, {-0.453990, -0.891007}, {-0.465615, -0.884988}, {-0.477159, -0.878817}, {-0.488621, -0.872496}, {-0.500000, -0.866025}, {-0.511293, -0.859406}, {-0.522499, -0.852640}, {-0.533615, -0.845728}, {-0.544639, -0.838671}, {-0.555570, -0.831470}, {-0.566406, -0.824126}, {-0.577145, -0.816642}, {-0.587785, -0.809017}, {-0.598325, -0.801254}, {-0.608761, -0.793353}, {-0.619094, -0.785317}, {-0.629320, -0.777146}, {-0.639439, -0.768842}, {-0.649448, -0.760406}, {-0.659346, -0.751840}, {-0.669131, -0.743145}, {-0.678801, -0.734322}, {-0.688355, -0.725374}, {-0.697790, -0.716302}, {-0.707107, -0.707107}, {-0.716302, -0.697790}, {-0.725374, -0.688355}, {-0.734322, -0.678801}, {-0.743145, -0.669131}, {-0.751840, -0.659346}, {-0.760406, -0.649448}, {-0.768842, -0.639439}, {-0.777146, -0.629320}, {-0.785317, -0.619094}, {-0.793353, -0.608761}, {-0.801254, -0.598325}, {-0.809017, -0.587785}, {-0.816642, -0.577145}, {-0.824126, -0.566406}, {-0.831470, -0.555570}, {-0.838671, -0.544639}, {-0.845728, -0.533615}, {-0.852640, -0.522499}, {-0.859406, -0.511293}, {-0.866025, -0.500000}, {-0.872496, -0.488621}, {-0.878817, -0.477159}, {-0.884988, -0.465615}, {-0.891007, -0.453990}, {-0.896873, -0.442289}, {-0.902585, -0.430511}, {-0.908143, -0.418660}, {-0.913545, -0.406737}, {-0.918791, -0.394744}, {-0.923880, -0.382683}, {-0.928810, -0.370557}, {-0.933580, -0.358368}, {-0.938191, -0.346117}, {-0.942641, -0.333807}, {-0.946930, -0.321439}, {-0.951057, -0.309017}, {-0.955020, -0.296542}, {-0.958820, -0.284015}, {-0.962455, -0.271440}, {-0.965926, -0.258819}, {-0.969231, -0.246153}, {-0.972370, -0.233445}, {-0.975342, -0.220697}, {-0.978148, -0.207912}, {-0.980785, -0.195090}, {-0.983255, -0.182236}, {-0.985556, -0.169350}, {-0.987688, -0.156434}, {-0.989651, -0.143493}, {-0.991445, -0.130526}, {-0.993068, -0.117537}, {-0.994522, -0.104528}, {-0.995805, -0.091502}, {-0.996917, -0.078459}, {-0.997859, -0.065403}, {-0.998630, -0.052336}, {-0.999229, -0.039260}, {-0.999657, -0.026177}, {-0.999914, -0.013090}, {-1.000000, -0.000000}, {-0.999914, 0.013090}, {-0.999657, 0.026177}, {-0.999229, 0.039260}, {-0.998630, 0.052336}, {-0.997859, 0.065403}, {-0.996917, 0.078459}, {-0.995805, 0.091502}, {-0.994522, 0.104528}, {-0.993068, 0.117537}, {-0.991445, 0.130526}, {-0.989651, 0.143493}, {-0.987688, 0.156434}, {-0.985556, 0.169350}, {-0.983255, 0.182236}, {-0.980785, 0.195090}, {-0.978148, 0.207912}, {-0.975342, 0.220697}, {-0.972370, 0.233445}, {-0.969231, 0.246153}, {-0.965926, 0.258819}, {-0.962455, 0.271440}, {-0.958820, 0.284015}, {-0.955020, 0.296542}, {-0.951057, 0.309017}, {-0.946930, 0.321439}, {-0.942641, 0.333807}, {-0.938191, 0.346117}, {-0.933580, 0.358368}, {-0.928810, 0.370557}, {-0.923880, 0.382683}, {-0.918791, 0.394744}, {-0.913545, 0.406737}, {-0.908143, 0.418660}, {-0.902585, 0.430511}, {-0.896873, 0.442289}, {-0.891007, 0.453990}, {-0.884988, 0.465615}, {-0.878817, 0.477159}, {-0.872496, 0.488621}, {-0.866025, 0.500000}, {-0.859406, 0.511293}, {-0.852640, 0.522499}, {-0.845728, 0.533615}, {-0.838671, 0.544639}, {-0.831470, 0.555570}, {-0.824126, 0.566406}, {-0.816642, 0.577145}, {-0.809017, 0.587785}, {-0.801254, 0.598325}, {-0.793353, 0.608761}, {-0.785317, 0.619094}, {-0.777146, 0.629320}, {-0.768842, 0.639439}, {-0.760406, 0.649448}, {-0.751840, 0.659346}, {-0.743145, 0.669131}, {-0.734322, 0.678801}, {-0.725374, 0.688355}, {-0.716302, 0.697790}, {-0.707107, 0.707107}, {-0.697790, 0.716302}, {-0.688355, 0.725374}, {-0.678801, 0.734322}, {-0.669131, 0.743145}, {-0.659346, 0.751840}, {-0.649448, 0.760406}, {-0.639439, 0.768842}, {-0.629320, 0.777146}, {-0.619094, 0.785317}, {-0.608761, 0.793353}, {-0.598325, 0.801254}, {-0.587785, 0.809017}, {-0.577145, 0.816642}, {-0.566406, 0.824126}, {-0.555570, 0.831470}, {-0.544639, 0.838671}, {-0.533615, 0.845728}, {-0.522499, 0.852640}, {-0.511293, 0.859406}, {-0.500000, 0.866025}, {-0.488621, 0.872496}, {-0.477159, 0.878817}, {-0.465615, 0.884988}, {-0.453990, 0.891007}, {-0.442289, 0.896873}, {-0.430511, 0.902585}, {-0.418660, 0.908143}, {-0.406737, 0.913545}, {-0.394744, 0.918791}, {-0.382683, 0.923880}, {-0.370557, 0.928810}, {-0.358368, 0.933580}, {-0.346117, 0.938191}, {-0.333807, 0.942641}, {-0.321439, 0.946930}, {-0.309017, 0.951057}, {-0.296542, 0.955020}, {-0.284015, 0.958820}, {-0.271440, 0.962455}, {-0.258819, 0.965926}, {-0.246153, 0.969231}, {-0.233445, 0.972370}, {-0.220697, 0.975342}, {-0.207912, 0.978148}, {-0.195090, 0.980785}, {-0.182236, 0.983255}, {-0.169350, 0.985556}, {-0.156434, 0.987688}, {-0.143493, 0.989651}, {-0.130526, 0.991445}, {-0.117537, 0.993068}, {-0.104528, 0.994522}, {-0.091502, 0.995805}, {-0.078459, 0.996917}, {-0.065403, 0.997859}, {-0.052336, 0.998630}, {-0.039260, 0.999229}, {-0.026177, 0.999657}, {-0.013090, 0.999914}, {-0.000000, 1.000000}, {0.013090, 0.999914}, {0.026177, 0.999657}, {0.039260, 0.999229}, {0.052336, 0.998630}, {0.065403, 0.997859}, {0.078459, 0.996917}, {0.091502, 0.995805}, {0.104528, 0.994522}, {0.117537, 0.993068}, {0.130526, 0.991445}, {0.143493, 0.989651}, {0.156434, 0.987688}, {0.169350, 0.985556}, {0.182236, 0.983255}, {0.195090, 0.980785}, {0.207912, 0.978148}, {0.220697, 0.975342}, {0.233445, 0.972370}, {0.246153, 0.969231}, {0.258819, 0.965926}, {0.271440, 0.962455}, {0.284015, 0.958820}, {0.296542, 0.955020}, {0.309017, 0.951057}, {0.321439, 0.946930}, {0.333807, 0.942641}, {0.346117, 0.938191}, {0.358368, 0.933580}, {0.370557, 0.928810}, {0.382683, 0.923880}, {0.394744, 0.918791}, {0.406737, 0.913545}, {0.418660, 0.908143}, {0.430511, 0.902585}, {0.442289, 0.896873}, {0.453990, 0.891007}, {0.465615, 0.884988}, {0.477159, 0.878817}, {0.488621, 0.872496}, {0.500000, 0.866025}, {0.511293, 0.859406}, {0.522499, 0.852640}, {0.533615, 0.845728}, {0.544639, 0.838671}, {0.555570, 0.831470}, {0.566406, 0.824126}, {0.577145, 0.816642}, {0.587785, 0.809017}, {0.598325, 0.801254}, {0.608761, 0.793353}, {0.619094, 0.785317}, {0.629320, 0.777146}, {0.639439, 0.768842}, {0.649448, 0.760406}, {0.659346, 0.751840}, {0.669131, 0.743145}, {0.678801, 0.734322}, {0.688355, 0.725374}, {0.697790, 0.716302}, {0.707107, 0.707107}, {0.716302, 0.697790}, {0.725374, 0.688355}, {0.734322, 0.678801}, {0.743145, 0.669131}, {0.751840, 0.659346}, {0.760406, 0.649448}, {0.768842, 0.639439}, {0.777146, 0.629320}, {0.785317, 0.619094}, {0.793353, 0.608761}, {0.801254, 0.598325}, {0.809017, 0.587785}, {0.816642, 0.577145}, {0.824126, 0.566406}, {0.831470, 0.555570}, {0.838671, 0.544639}, {0.845728, 0.533615}, {0.852640, 0.522499}, {0.859406, 0.511293}, {0.866025, 0.500000}, {0.872496, 0.488621}, {0.878817, 0.477159}, {0.884988, 0.465615}, {0.891007, 0.453990}, {0.896873, 0.442289}, {0.902585, 0.430511}, {0.908143, 0.418660}, {0.913545, 0.406737}, {0.918791, 0.394744}, {0.923880, 0.382683}, {0.928810, 0.370557}, {0.933580, 0.358368}, {0.938191, 0.346117}, {0.942641, 0.333807}, {0.946930, 0.321439}, {0.951057, 0.309017}, {0.955020, 0.296542}, {0.958820, 0.284015}, {0.962455, 0.271440}, {0.965926, 0.258819}, {0.969231, 0.246153}, {0.972370, 0.233445}, {0.975342, 0.220697}, {0.978148, 0.207912}, {0.980785, 0.195090}, {0.983255, 0.182236}, {0.985556, 0.169350}, {0.987688, 0.156434}, {0.989651, 0.143493}, {0.991445, 0.130526}, {0.993068, 0.117537}, {0.994522, 0.104528}, {0.995805, 0.091502}, {0.996917, 0.078459}, {0.997859, 0.065403}, {0.998630, 0.052336}, {0.999229, 0.039260}, {0.999657, 0.026177}, {0.999914, 0.013090}, };
+ #ifndef FFT_BITREV480
+ #define FFT_BITREV480
+ static const celt_int16 fft_bitrev480[480] = {
+ 0, 120, 240, 360, 30, 150, 270, 390, 60, 180, 300, 420, 90, 210, 330, 450, 15, 135, 255, 375, 45, 165, 285, 405, 75, 195, 315, 435, 105, 225, 345, 465, 5, 125, 245, 365, 35, 155, 275, 395, 65, 185, 305, 425, 95, 215, 335, 455, 20, 140, 260, 380, 50, 170, 290, 410, 80, 200, 320, 440, 110, 230, 350, 470, 10, 130, 250, 370, 40, 160, 280, 400, 70, 190, 310, 430, 100, 220, 340, 460, 25, 145, 265, 385, 55, 175, 295, 415, 85, 205, 325, 445, 115, 235, 355, 475, 1, 121, 241, 361, 31, 151, 271, 391, 61, 181, 301, 421, 91, 211, 331, 451, 16, 136, 256, 376, 46, 166, 286, 406, 76, 196, 316, 436, 106, 226, 346, 466, 6, 126, 246, 366, 36, 156, 276, 396, 66, 186, 306, 426, 96, 216, 336, 456, 21, 141, 261, 381, 51, 171, 291, 411, 81, 201, 321, 441, 111, 231, 351, 471, 11, 131, 251, 371, 41, 161, 281, 401, 71, 191, 311, 431, 101, 221, 341, 461, 26, 146, 266, 386, 56, 176, 296, 416, 86, 206, 326, 446, 116, 236, 356, 476, 2, 122, 242, 362, 32, 152, 272, 392, 62, 182, 302, 422, 92, 212, 332, 452, 17, 137, 257, 377, 47, 167, 287, 407, 77, 197, 317, 437, 107, 227, 347, 467, 7, 127, 247, 367, 37, 157, 277, 397, 67, 187, 307, 427, 97, 217, 337, 457, 22, 142, 262, 382, 52, 172, 292, 412, 82, 202, 322, 442, 112, 232, 352, 472, 12, 132, 252, 372, 42, 162, 282, 402, 72, 192, 312, 432, 102, 222, 342, 462, 27, 147, 267, 387, 57, 177, 297, 417, 87, 207, 327, 447, 117, 237, 357, 477, 3, 123, 243, 363, 33, 153, 273, 393, 63, 183, 303, 423, 93, 213, 333, 453, 18, 138, 258, 378, 48, 168, 288, 408, 78, 198, 318, 438, 108, 228, 348, 468, 8, 128, 248, 368, 38, 158, 278, 398, 68, 188, 308, 428, 98, 218, 338, 458, 23, 143, 263, 383, 53, 173, 293, 413, 83, 203, 323, 443, 113, 233, 353, 473, 13, 133, 253, 373, 43, 163, 283, 403, 73, 193, 313, 433, 103, 223, 343, 463, 28, 148, 268, 388, 58, 178, 298, 418, 88, 208, 328, 448, 118, 238, 358, 478, 4, 124, 244, 364, 34, 154, 274, 394, 64, 184, 304, 424, 94, 214, 334, 454, 19, 139, 259, 379, 49, 169, 289, 409, 79, 199, 319, 439, 109, 229, 349, 469, 9, 129, 249, 369, 39, 159, 279, 399, 69, 189, 309, 429, 99, 219, 339, 459, 24, 144, 264, 384, 54, 174, 294, 414, 84, 204, 324, 444, 114, 234, 354, 474, 14, 134, 254, 374, 44, 164, 284, 404, 74, 194, 314, 434, 104, 224, 344, 464, 29, 149, 269, 389, 59, 179, 299, 419, 89, 209, 329, 449, 119, 239, 359, 479, };
+ #endif
+ #ifndef FFT_BITREV240
+ #define FFT_BITREV240
+ static const celt_int16 fft_bitrev240[240] = {
+ 0, 60, 120, 180, 15, 75, 135, 195, 30, 90, 150, 210, 45, 105, 165, 225, 5, 65, 125, 185, 20, 80, 140, 200, 35, 95, 155, 215, 50, 110, 170, 230, 10, 70, 130, 190, 25, 85, 145, 205, 40, 100, 160, 220, 55, 115, 175, 235, 1, 61, 121, 181, 16, 76, 136, 196, 31, 91, 151, 211, 46, 106, 166, 226, 6, 66, 126, 186, 21, 81, 141, 201, 36, 96, 156, 216, 51, 111, 171, 231, 11, 71, 131, 191, 26, 86, 146, 206, 41, 101, 161, 221, 56, 116, 176, 236, 2, 62, 122, 182, 17, 77, 137, 197, 32, 92, 152, 212, 47, 107, 167, 227, 7, 67, 127, 187, 22, 82, 142, 202, 37, 97, 157, 217, 52, 112, 172, 232, 12, 72, 132, 192, 27, 87, 147, 207, 42, 102, 162, 222, 57, 117, 177, 237, 3, 63, 123, 183, 18, 78, 138, 198, 33, 93, 153, 213, 48, 108, 168, 228, 8, 68, 128, 188, 23, 83, 143, 203, 38, 98, 158, 218, 53, 113, 173, 233, 13, 73, 133, 193, 28, 88, 148, 208, 43, 103, 163, 223, 58, 118, 178, 238, 4, 64, 124, 184, 19, 79, 139, 199, 34, 94, 154, 214, 49, 109, 169, 229, 9, 69, 129, 189, 24, 84, 144, 204, 39, 99, 159, 219, 54, 114, 174, 234, 14, 74, 134, 194, 29, 89, 149, 209, 44, 104, 164, 224, 59, 119, 179, 239, };
+ #endif
+ #ifndef FFT_BITREV120
+ #define FFT_BITREV120
+ static const celt_int16 fft_bitrev120[120] = {
+ 0, 30, 60, 90, 15, 45, 75, 105, 5, 35, 65, 95, 20, 50, 80, 110, 10, 40, 70, 100, 25, 55, 85, 115, 1, 31, 61, 91, 16, 46, 76, 106, 6, 36, 66, 96, 21, 51, 81, 111, 11, 41, 71, 101, 26, 56, 86, 116, 2, 32, 62, 92, 17, 47, 77, 107, 7, 37, 67, 97, 22, 52, 82, 112, 12, 42, 72, 102, 27, 57, 87, 117, 3, 33, 63, 93, 18, 48, 78, 108, 8, 38, 68, 98, 23, 53, 83, 113, 13, 43, 73, 103, 28, 58, 88, 118, 4, 34, 64, 94, 19, 49, 79, 109, 9, 39, 69, 99, 24, 54, 84, 114, 14, 44, 74, 104, 29, 59, 89, 119, };
+ #endif
+ #ifndef FFT_BITREV60
+ #define FFT_BITREV60
+ static const celt_int16 fft_bitrev60[60] = {
+ 0, 15, 30, 45, 5, 20, 35, 50, 10, 25, 40, 55, 1, 16, 31, 46, 6, 21, 36, 51, 11, 26, 41, 56, 2, 17, 32, 47, 7, 22, 37, 52, 12, 27, 42, 57, 3, 18, 33, 48, 8, 23, 38, 53, 13, 28, 43, 58, 4, 19, 34, 49, 9, 24, 39, 54, 14, 29, 44, 59, };
+ #endif
+ #ifndef FFT_STATE48000_960_0
+ #define FFT_STATE48000_960_0
+ static const kiss_fft_state fft_state48000_960_0 = {
+ 480,  /* nfft */
+ 0.002083,     /* scale */
+ -1,   /* shift */
+ {4, 120, 4, 30, 2, 15, 3, 5, 5, 1, 0, 0, 0, 0, 0, 0, },       /* factors */
+ fft_bitrev480,        /* bitrev */
+ fft_twiddles48000_960,        /* bitrev */
+ };
+ #endif
+ #ifndef FFT_STATE48000_960_1
+ #define FFT_STATE48000_960_1
+ static const kiss_fft_state fft_state48000_960_1 = {
+ 240,  /* nfft */
+ 0.004167,     /* scale */
+ 1,    /* shift */
+ {4, 60, 4, 15, 3, 5, 5, 1, 0, 0, 0, 0, 0, 0, 0, 0, }, /* factors */
+ fft_bitrev240,        /* bitrev */
+ fft_twiddles48000_960,        /* bitrev */
+ };
+ #endif
+ #ifndef FFT_STATE48000_960_2
+ #define FFT_STATE48000_960_2
+ static const kiss_fft_state fft_state48000_960_2 = {
+ 120,  /* nfft */
+ 0.008333,     /* scale */
+ 2,    /* shift */
+ {4, 30, 2, 15, 3, 5, 5, 1, 0, 0, 0, 0, 0, 0, 0, 0, }, /* factors */
+ fft_bitrev120,        /* bitrev */
+ fft_twiddles48000_960,        /* bitrev */
+ };
+ #endif
+ #ifndef FFT_STATE48000_960_3
+ #define FFT_STATE48000_960_3
+ static const kiss_fft_state fft_state48000_960_3 = {
+ 60,   /* nfft */
+ 0.016667,     /* scale */
+ 3,    /* shift */
+ {4, 15, 3, 5, 5, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, },  /* factors */
+ fft_bitrev60, /* bitrev */
+ fft_twiddles48000_960,        /* bitrev */
+ };
+ #endif
+ #endif
+ #ifndef MDCT_TWIDDLES960
+ #define MDCT_TWIDDLES960
+ static const celt_word16 mdct_twiddles960[481] = {
+ 1.000000, 0.999995, 0.999979, 0.999952, 0.999914, 0.999866, 0.999807, 0.999738, 0.999657, 0.999566, 0.999465, 0.999352, 0.999229, 0.999095, 0.998951, 0.998795, 0.998630, 0.998453, 0.998266, 0.998068, 0.997859, 0.997640, 0.997409, 0.997169, 0.996917, 0.996655, 0.996382, 0.996099, 0.995805, 0.995500, 0.995185, 0.994859, 0.994522, 0.994174, 0.993816, 0.993448, 0.993068, 0.992679, 0.992278, 0.991867, 0.991445, 0.991012, 0.990569, 0.990116, 0.989651, 0.989177, 0.988691, 0.988195, 0.987688, 0.987171, 0.986643, 0.986105, 0.985556, 0.984997, 0.984427, 0.983846, 0.983255, 0.982653, 0.982041, 0.981418, 0.980785, 0.980142, 0.979487, 0.978823, 0.978148, 0.977462, 0.976766, 0.976059, 0.975342, 0.974615, 0.973877, 0.973129, 0.972370, 0.971601, 0.970821, 0.970031, 0.969231, 0.968420, 0.967599, 0.966768, 0.965926, 0.965074, 0.964211, 0.963338, 0.962455, 0.961562, 0.960658, 0.959744, 0.958820, 0.957885, 0.956940, 0.955985, 0.955020, 0.954044, 0.953059, 0.952063, 0.951057, 0.950040, 0.949014, 0.947977, 0.946930, 0.945873, 0.944806, 0.943729, 0.942641, 0.941544, 0.940437, 0.939319, 0.938191, 0.937054, 0.935906, 0.934748, 0.933580, 0.932403, 0.931215, 0.930017, 0.928810, 0.927592, 0.926364, 0.925127, 0.923880, 0.922622, 0.921355, 0.920078, 0.918791, 0.917494, 0.916188, 0.914872, 0.913545, 0.912210, 0.910864, 0.909508, 0.908143, 0.906768, 0.905384, 0.903989, 0.902585, 0.901172, 0.899748, 0.898315, 0.896873, 0.895421, 0.893959, 0.892487, 0.891007, 0.889516, 0.888016, 0.886507, 0.884988, 0.883459, 0.881921, 0.880374, 0.878817, 0.877251, 0.875675, 0.874090, 0.872496, 0.870892, 0.869279, 0.867657, 0.866025, 0.864385, 0.862734, 0.861075, 0.859406, 0.857729, 0.856042, 0.854345, 0.852640, 0.850926, 0.849202, 0.847470, 0.845728, 0.843977, 0.842217, 0.840448, 0.838671, 0.836884, 0.835088, 0.833283, 0.831470, 0.829647, 0.827816, 0.825975, 0.824126, 0.822268, 0.820401, 0.818526, 0.816642, 0.814748, 0.812847, 0.810936, 0.809017, 0.807089, 0.805153, 0.803208, 0.801254, 0.799291, 0.797321, 0.795341, 0.793353, 0.791357, 0.789352, 0.787339, 0.785317, 0.783287, 0.781248, 0.779201, 0.777146, 0.775082, 0.773010, 0.770930, 0.768842, 0.766745, 0.764640, 0.762527, 0.760406, 0.758277, 0.756139, 0.753994, 0.751840, 0.749678, 0.747508, 0.745331, 0.743145, 0.740951, 0.738750, 0.736540, 0.734322, 0.732097, 0.729864, 0.727623, 0.725374, 0.723118, 0.720854, 0.718582, 0.716302, 0.714015, 0.711720, 0.709417, 0.707107, 0.704789, 0.702464, 0.700131, 0.697790, 0.695443, 0.693087, 0.690725, 0.688355, 0.685977, 0.683592, 0.681200, 0.678801, 0.676394, 0.673980, 0.671559, 0.669131, 0.666695, 0.664252, 0.661803, 0.659346, 0.656882, 0.654411, 0.651933, 0.649448, 0.646956, 0.644457, 0.641952, 0.639439, 0.636920, 0.634393, 0.631860, 0.629320, 0.626774, 0.624221, 0.621661, 0.619094, 0.616521, 0.613941, 0.611354, 0.608761, 0.606162, 0.603556, 0.600944, 0.598325, 0.595699, 0.593068, 0.590430, 0.587785, 0.585135, 0.582478, 0.579815, 0.577145, 0.574470, 0.571788, 0.569100, 0.566406, 0.563706, 0.561000, 0.558288, 0.555570, 0.552846, 0.550116, 0.547381, 0.544639, 0.541892, 0.539138, 0.536379, 0.533615, 0.530844, 0.528068, 0.525286, 0.522499, 0.519706, 0.516907, 0.514103, 0.511293, 0.508478, 0.505657, 0.502831, 0.500000, 0.497163, 0.494321, 0.491474, 0.488621, 0.485763, 0.482900, 0.480032, 0.477159, 0.474280, 0.471397, 0.468508, 0.465615, 0.462716, 0.459812, 0.456904, 0.453990, 0.451072, 0.448149, 0.445221, 0.442289, 0.439351, 0.436409, 0.433463, 0.430511, 0.427555, 0.424595, 0.421629, 0.418660, 0.415686, 0.412707, 0.409724, 0.406737, 0.403745, 0.400749, 0.397748, 0.394744, 0.391735, 0.388722, 0.385705, 0.382683, 0.379658, 0.376628, 0.373595, 0.370557, 0.367516, 0.364471, 0.361421, 0.358368, 0.355311, 0.352250, 0.349185, 0.346117, 0.343045, 0.339969, 0.336890, 0.333807, 0.330720, 0.327630, 0.324537, 0.321439, 0.318339, 0.315235, 0.312128, 0.309017, 0.305903, 0.302786, 0.299665, 0.296542, 0.293415, 0.290285, 0.287152, 0.284015, 0.280876, 0.277734, 0.274589, 0.271440, 0.268289, 0.265135, 0.261979, 0.258819, 0.255657, 0.252492, 0.249324, 0.246153, 0.242980, 0.239804, 0.236626, 0.233445, 0.230262, 0.227076, 0.223888, 0.220697, 0.217504, 0.214309, 0.211112, 0.207912, 0.204710, 0.201505, 0.198299, 0.195090, 0.191880, 0.188667, 0.185452, 0.182236, 0.179017, 0.175796, 0.172574, 0.169350, 0.166123, 0.162895, 0.159666, 0.156434, 0.153201, 0.149967, 0.146730, 0.143493, 0.140253, 0.137012, 0.133770, 0.130526, 0.127281, 0.124034, 0.120787, 0.117537, 0.114287, 0.111035, 0.107782, 0.104528, 0.101273, 0.098017, 0.094760, 0.091502, 0.088242, 0.084982, 0.081721, 0.078459, 0.075196, 0.071933, 0.068668, 0.065403, 0.062137, 0.058871, 0.055604, 0.052336, 0.049068, 0.045799, 0.042530, 0.039260, 0.035990, 0.032719, 0.029448, 0.026177, 0.022905, 0.019634, 0.016362, 0.013090, 0.009817, 0.006545, 0.003272, 0.000000, };
+ #endif
+ static const CELTMode mode48000_960_120 = {
+ 48000,        /* Fs */
+ 120,  /* overlap */
+ 21,   /* nbEBands */
+ 21,   /* effEBands */
+ {0.850006, 0.000000, 1.000000, 1.000000, },   /* preemph */
+ eband5ms,     /* eBands */
+ 12,   /* nbAllocVectors */
+ band_allocation,      /* allocVectors */
+ {1920, 3, {&fft_state48000_960_0, &fft_state48000_960_1, &fft_state48000_960_2, &fft_state48000_960_3, }, mdct_twiddles960},  /* mdct */
+ window120,    /* window */
+ 3,    /* maxLM */
+ 8,    /* nbShortMdcts */
+ 120,  /* shortMdctSize */
+ logN400,      /* logN */
++{392, cache_index50, cache_bits50, cache_caps50},     /* cache */
+ };
+ /* List of all the available modes */
+ #define TOTAL_MODES 1
+ static const CELTMode * const static_mode_list[TOTAL_MODES] = {
+ &mode48000_960_120,
+ };
diff --combined tests/dft-test.c
@@@ -4,8 -4,8 +4,8 @@@
  
  #define SKIP_CONFIG_H
  
--#ifdef STATIC_MODES
--#undef STATIC_MODES
++#ifndef CUSTOM_MODES
++#define CUSTOM_MODES
  #endif
  
  #include <stdio.h>
diff --combined tests/mdct-test.c
@@@ -4,8 -4,8 +4,8 @@@
  
  #define SKIP_CONFIG_H
  
--#ifdef STATIC_MODES
--#undef STATIC_MODES
++#ifndef CUSTOM_MODES
++#define CUSTOM_MODES
  #endif
  
  #include <stdio.h>