Typos
[opus.git] / celt / celt.c
index 87d648f..7a3bc22 100644 (file)
 #include "mathops.h"
 #include "float_cast.h"
 #include <stdarg.h>
-#include "plc.h"
+#include "celt_lpc.h"
 #include "vq.h"
 
 #ifndef OPUS_VERSION
 #define OPUS_VERSION "unknown"
 #endif
 
+#ifdef CUSTOM_MODES
+#define OPUS_CUSTOM_NOSTATIC
+#else
+#define OPUS_CUSTOM_NOSTATIC static inline
+#endif
+
 static const unsigned char trim_icdf[11] = {126, 124, 119, 109, 87, 41, 19, 9, 4, 2, 0};
 /* Probs: NONE: 21.875%, LIGHT: 6.25%, NORMAL: 65.625%, AGGRESSIVE: 6.25% */
 static const unsigned char spread_icdf[4] = {25, 23, 2, 0};
 
 static const unsigned char tapset_icdf[3]={2,1,0};
 
+#ifdef CUSTOM_MODES
 static const unsigned char toOpusTable[20] = {
       0xE0, 0xE8, 0xF0, 0xF8,
       0xC0, 0xC8, 0xD0, 0xD8,
@@ -93,6 +100,7 @@ static inline int fromOpus(unsigned char c)
    else
       return fromOpusTable[(c>>3)-16] | (c&0x7);
 }
+#endif /*CUSTOM_MODES*/
 
 #define COMBFILTER_MAXPERIOD 1024
 #define COMBFILTER_MINPERIOD 15
@@ -118,6 +126,9 @@ static int resampling_factor(opus_int32 rate)
       ret = 6;
       break;
    default:
+#ifndef CUSTOM_MODES
+      celt_assert(0);
+#endif
       ret = 0;
       break;
    }
@@ -192,7 +203,7 @@ int celt_encoder_get_size(int channels)
    return opus_custom_encoder_get_size(mode, channels);
 }
 
-int opus_custom_encoder_get_size(const CELTMode *mode, int channels)
+OPUS_CUSTOM_NOSTATIC int opus_custom_encoder_get_size(const CELTMode *mode, int channels)
 {
    int size = sizeof(struct CELTEncoder)
          + (2*channels*mode->overlap-1)*sizeof(celt_sig)
@@ -226,13 +237,10 @@ int celt_encoder_init(CELTEncoder *st, opus_int32 sampling_rate, int channels)
    if (ret != OPUS_OK)
       return ret;
    st->upsample = resampling_factor(sampling_rate);
-   if (st->upsample==0)
-      return OPUS_BAD_ARG;
-   else
-      return OPUS_OK;
+   return OPUS_OK;
 }
 
-int opus_custom_encoder_init(CELTEncoder *st, const CELTMode *mode, int channels)
+OPUS_CUSTOM_NOSTATIC int opus_custom_encoder_init(CELTEncoder *st, const CELTMode *mode, int channels)
 {
    if (channels < 0 || channels > 2)
       return OPUS_BAD_ARG;
@@ -952,6 +960,7 @@ int celt_encode_with_ec(CELTEncoder * restrict st, const opus_val16 * pcm, int f
       nbFilledBytes=(tell+4)>>3;
    }
 
+#ifdef CUSTOM_MODES
    if (st->signalling && enc==NULL)
    {
       int tmp = (st->mode->effEBands-st->end)>>1;
@@ -970,6 +979,9 @@ int celt_encode_with_ec(CELTEncoder * restrict st, const opus_val16 * pcm, int f
       compressed++;
       nbCompressedBytes--;
    }
+#else
+   celt_assert(st->signalling==0);
+#endif
 
    /* Can't produce more than 1275 output bytes */
    nbCompressedBytes = IMIN(nbCompressedBytes,1275);
@@ -979,8 +991,10 @@ int celt_encode_with_ec(CELTEncoder * restrict st, const opus_val16 * pcm, int f
    {
       opus_int32 den=st->mode->Fs>>BITRES;
       vbr_rate=(st->bitrate*frame_size+(den>>1))/den;
+#ifdef CUSTOM_MODES
       if (st->signalling)
          vbr_rate -= 8<<BITRES;
+#endif
       effectiveBytes = vbr_rate>>(3+BITRES);
    } else {
       opus_int32 tmp;
@@ -1644,8 +1658,10 @@ int celt_encode_with_ec(CELTEncoder * restrict st, const opus_val16 * pcm, int f
       it's already filled with zeros */
    ec_enc_done(enc);
 
+#ifdef CUSTOM_MODES
    if (st->signalling)
       nbCompressedBytes++;
+#endif
 
    RESTORE_STACK;
    if (ec_get_error(enc))
@@ -1813,13 +1829,14 @@ int opus_custom_encoder_ctl(CELTEncoder * restrict st, int request, ...)
          st->tonal_average = 256;
       }
       break;
+#ifdef CUSTOM_MODES
       case CELT_SET_INPUT_CLIPPING_REQUEST:
       {
          opus_int32 value = va_arg(ap, opus_int32);
          st->clip = value;
       }
       break;
-#ifdef OPUS_BUILD
+#endif
       case CELT_SET_SIGNALLING_REQUEST:
       {
          opus_int32 value = va_arg(ap, opus_int32);
@@ -1842,7 +1859,6 @@ int opus_custom_encoder_ctl(CELTEncoder * restrict st, int request, ...)
          *value=st->rng;
       }
       break;
-#endif
       default:
          goto bad_request;
    }
@@ -1906,7 +1922,7 @@ int celt_decoder_get_size(int channels)
    return opus_custom_decoder_get_size(mode, channels);
 }
 
-int opus_custom_decoder_get_size(const CELTMode *mode, int channels)
+OPUS_CUSTOM_NOSTATIC int opus_custom_decoder_get_size(const CELTMode *mode, int channels)
 {
    int size = sizeof(struct CELTDecoder)
             + (channels*(DECODE_BUFFER_SIZE+mode->overlap)-1)*sizeof(celt_sig)
@@ -1945,7 +1961,7 @@ int celt_decoder_init(CELTDecoder *st, opus_int32 sampling_rate, int channels)
       return OPUS_OK;
 }
 
-int opus_custom_decoder_init(CELTDecoder *st, const CELTMode *mode, int channels)
+OPUS_CUSTOM_NOSTATIC int opus_custom_decoder_init(CELTDecoder *st, const CELTMode *mode, int channels)
 {
    if (channels < 0 || channels > 2)
       return OPUS_BAD_ARG;
@@ -1990,8 +2006,7 @@ static void celt_decode_lost(CELTDecoder * restrict st, opus_val16 * restrict pc
    celt_sig *overlap_mem[2];
    opus_val16 *lpc;
    opus_val32 *out_syn[2];
-   opus_val16 *oldBandE, *oldLogE2, *backgroundLogE;
-   int plc=1;
+   opus_val16 *oldBandE, *oldLogE, *oldLogE2, *backgroundLogE;
    SAVE_STACK;
 
    c=0; do {
@@ -2001,8 +2016,9 @@ static void celt_decode_lost(CELTDecoder * restrict st, opus_val16 * restrict pc
    } while (++c<C);
    lpc = (opus_val16*)(st->_decode_mem+(DECODE_BUFFER_SIZE+st->overlap)*C);
    oldBandE = lpc+C*LPC_ORDER;
-   oldLogE2 = oldBandE + C*st->mode->nbEBands;
-   backgroundLogE = oldLogE2  + C*st->mode->nbEBands;
+   oldLogE = oldBandE + 2*st->mode->nbEBands;
+   oldLogE2 = oldLogE + 2*st->mode->nbEBands;
+   backgroundLogE = oldLogE2  + 2*st->mode->nbEBands;
 
    out_syn[0] = out_mem[0]+MAX_PERIOD-N;
    if (C==2)
@@ -2010,8 +2026,9 @@ static void celt_decode_lost(CELTDecoder * restrict st, opus_val16 * restrict pc
 
    len = N+st->mode->overlap;
 
-   if (st->loss_count >= 5)
+   if (st->loss_count >= 5 || st->start!=0)
    {
+      /* Noise-based PLC/CNG */
       VARDECL(celt_sig, freq);
       VARDECL(celt_norm, X);
       VARDECL(celt_ener, bandE);
@@ -2026,14 +2043,24 @@ static void celt_decode_lost(CELTDecoder * restrict st, opus_val16 * restrict pc
       ALLOC(X, C*N, celt_norm);   /**< Interleaved normalised MDCTs */
       ALLOC(bandE, st->mode->nbEBands*C, celt_ener);
 
-      log2Amp(st->mode, st->start, st->end, bandE, backgroundLogE, C);
-
+      if (st->loss_count >= 5)
+         log2Amp(st->mode, st->start, st->end, bandE, backgroundLogE, C);
+      else {
+         /* Energy decay */
+         opus_val16 decay = st->loss_count==0 ? QCONST16(1.5f, DB_SHIFT) : QCONST16(.5f, DB_SHIFT);
+         c=0; do
+         {
+            for (i=st->start;i<st->end;i++)
+               oldBandE[c*st->mode->nbEBands+i] -= decay;
+         } while (++c<C);
+         log2Amp(st->mode, st->start, st->end, bandE, oldBandE, C);
+      }
       seed = st->rng;
       for (c=0;c<C;c++)
       {
          for (i=0;i<(st->mode->eBands[st->start]<<LM);i++)
             X[c*N+i] = 0;
-         for (i=0;i<st->mode->effEBands;i++)
+         for (i=st->start;i<st->mode->effEBands;i++)
          {
             int j;
             int boffs;
@@ -2066,26 +2093,25 @@ static void celt_decode_lost(CELTDecoder * restrict st, opus_val16 * restrict pc
             freq[c*N+i] = 0;
       } while (++c<C);
       compute_inv_mdcts(st->mode, 0, freq, out_syn, overlap_mem, C, LM);
-      plc = 0;
-   } else if (st->loss_count == 0)
-   {
-      opus_val16 pitch_buf[DECODE_BUFFER_SIZE>>1];
-      /* Corresponds to a min pitch of 67 Hz. It's possible to save CPU in this
-         search by using only part of the decode buffer */
-      int poffset = 720;
-      pitch_downsample(decode_mem, pitch_buf, DECODE_BUFFER_SIZE, C);
-      /* Max pitch is 100 samples (480 Hz) */
-      pitch_search(pitch_buf+((poffset)>>1), pitch_buf, DECODE_BUFFER_SIZE-poffset,
-            poffset-100, &pitch_index);
-      pitch_index = poffset-pitch_index;
-      st->last_pitch_index = pitch_index;
    } else {
-      pitch_index = st->last_pitch_index;
-      fade = QCONST16(.8f,15);
-   }
+      /* Pitch-based PLC */
+      if (st->loss_count == 0)
+      {
+         opus_val16 pitch_buf[DECODE_BUFFER_SIZE>>1];
+         /* Corresponds to a min pitch of 67 Hz. It's possible to save CPU in this
+         search by using only part of the decode buffer */
+         int poffset = 720;
+         pitch_downsample(decode_mem, pitch_buf, DECODE_BUFFER_SIZE, C);
+         /* Max pitch is 100 samples (480 Hz) */
+         pitch_search(pitch_buf+((poffset)>>1), pitch_buf, DECODE_BUFFER_SIZE-poffset,
+               poffset-100, &pitch_index);
+         pitch_index = poffset-pitch_index;
+         st->last_pitch_index = pitch_index;
+      } else {
+         pitch_index = st->last_pitch_index;
+         fade = QCONST16(.8f,15);
+      }
 
-   if (plc)
-   {
       c=0; do {
          VARDECL(opus_val32, e);
          opus_val16 exc[MAX_PERIOD];
@@ -2281,11 +2307,12 @@ int celt_decode_with_ec(CELTDecoder * restrict st, const unsigned char *data, in
       overlap_mem[c] = decode_mem[c]+DECODE_BUFFER_SIZE;
    } while (++c<CC);
    lpc = (opus_val16*)(st->_decode_mem+(DECODE_BUFFER_SIZE+st->overlap)*CC);
-   oldBandE = lpc+LPC_ORDER;
+   oldBandE = lpc+CC*LPC_ORDER;
    oldLogE = oldBandE + 2*st->mode->nbEBands;
    oldLogE2 = oldLogE + 2*st->mode->nbEBands;
    backgroundLogE = oldLogE2  + 2*st->mode->nbEBands;
 
+#ifdef CUSTOM_MODES
    if (st->signalling && data!=NULL)
    {
       int data0=data[0];
@@ -2308,6 +2335,9 @@ int celt_decode_with_ec(CELTDecoder * restrict st, const unsigned char *data, in
       else
          frame_size = st->mode->shortMdctSize<<LM;
    } else {
+#else
+   {
+#endif
       for (LM=0;LM<=st->mode->maxLM;LM++)
          if (st->mode->shortMdctSize<<LM==frame_size)
             break;
@@ -2360,7 +2390,7 @@ int celt_decode_with_ec(CELTDecoder * restrict st, const unsigned char *data, in
    tell = ec_tell(dec);
 
    if (tell >= total_bits)
-          silence = 1;
+      silence = 1;
    else if (tell==1)
       silence = ec_dec_bit_logp(dec, 15);
    else
@@ -2661,7 +2691,6 @@ int opus_custom_decode(CELTDecoder * restrict st, const unsigned char *data, int
 #endif
 #endif /* CUSTOM_MODES */
 
-
 int opus_custom_decoder_ctl(CELTDecoder * restrict st, int request, ...)
 {
    va_list ap;