Move tf_select before the tf_res bits.
[opus.git] / libcelt / celt.c
index a29d94c..dcce270 100644 (file)
@@ -53,8 +53,8 @@
 #include <stdarg.h>
 #include "plc.h"
 
-static const int trim_cdf[12] = {0, 2, 4, 9, 19, 41, 87, 109, 119, 124, 126, 128};
-static const int spread_cdf[5] = {0, 7, 9, 30, 32};
+static const unsigned trim_cdf[12] = {0, 2, 4, 9, 19, 41, 87, 109, 119, 124, 126, 128};
+static const unsigned spread_cdf[5] = {0, 7, 9, 30, 32};
 
 #define COMBFILTER_MAXPERIOD 1024
 #define COMBFILTER_MINPERIOD 16
@@ -387,7 +387,6 @@ static void deemphasis(celt_sig *in[], celt_word16 *pcm, int N, int _C, const ce
 }
 
 #ifdef ENABLE_POSTFILTER
-/* FIXME: Handle the case where T = maxperiod */
 static void comb_filter(celt_word32 *y, celt_word32 *x, int T0, int T1, int N,
       int C, celt_word16 g0, celt_word16 g1, const celt_word16 *window, int overlap)
 {
@@ -428,9 +427,9 @@ static void comb_filter(celt_word32 *y, celt_word32 *x, int T0, int T1, int N,
 
 static const signed char tf_select_table[4][8] = {
       {0, -1, 0, -1,    0,-1, 0,-1},
-      {0, -1, 0, -2,    1, 0, 1 -1},
-      {0, -2, 0, -3,    2, 0, 1 -1},
-      {0, -2, 0, -3,    2, 0, 1 -1},
+      {0, -1, 0, -2,    1, 0, 1,-1},
+      {0, -2, 0, -3,    2, 0, 1,-1},
+      {0, -2, 0, -3,    2, 0, 1,-1},
 };
 
 static celt_word32 l1_metric(const celt_norm *tmp, int N, int LM, int width)
@@ -473,7 +472,6 @@ static int tf_analysis(const CELTMode *m, celt_word16 *bandLogE, celt_word16 *ol
    int tf_select=0;
    SAVE_STACK;
 
-   /* FIXME: Should check number of bytes *left* */
    if (nbCompressedBytes<15*C)
    {
       *tf_sum = 0;
@@ -504,7 +502,7 @@ static int tf_analysis(const CELTMode *m, celt_word16 *bandLogE, celt_word16 *ol
       N = (m->eBands[i+1]-m->eBands[i])<<LM;
       for (j=0;j<N;j++)
          tmp[j] = X[j+(m->eBands[i]<<LM)];
-      /* FIXME: Do something with the right channel */
+      /* Just add the right channel if we're in stereo */
       if (C==2)
          for (j=0;j<N;j++)
             tmp[j] = ADD16(tmp[j],X[N0+j+(m->eBands[i]<<LM)]);
@@ -592,6 +590,8 @@ static int tf_analysis(const CELTMode *m, celt_word16 *bandLogE, celt_word16 *ol
 static void tf_encode(int start, int end, int isTransient, int *tf_res, int LM, int tf_select, ec_enc *enc)
 {
    int curr, i;
+   if (LM!=0)
+      ec_enc_bit_logp(enc, tf_select, 1);
    ec_enc_bit_logp(enc, tf_res[start], isTransient ? 2 : 4);
    curr = tf_res[start];
    for (i=start+1;i<end;i++)
@@ -599,8 +599,6 @@ static void tf_encode(int start, int end, int isTransient, int *tf_res, int LM,
       ec_enc_bit_logp(enc, tf_res[i] ^ curr, isTransient ? 4 : 5);
       curr = tf_res[i];
    }
-   if (LM!=0)
-      ec_enc_bits(enc, tf_select, 1);
    for (i=start;i<end;i++)
       tf_res[i] = tf_select_table[LM][4*isTransient+2*tf_select+tf_res[i]];
    /*printf("%d %d ", isTransient, tf_select); for(i=0;i<end;i++)printf("%d ", tf_res[i]);printf("\n");*/
@@ -609,19 +607,17 @@ static void tf_encode(int start, int end, int isTransient, int *tf_res, int LM,
 static void tf_decode(int start, int end, int C, int isTransient, int *tf_res, int LM, ec_dec *dec)
 {
    int i, curr, tf_select;
-   tf_res[start] = ec_dec_bit_logp(dec, isTransient ? 2 : 4);
-   curr = tf_res[start];
-   for (i=start+1;i<end;i++)
-   {
-      tf_res[i] = ec_dec_bit_logp(dec, isTransient ? 4 : 5) ^ curr;
-      curr = tf_res[i];
-   }
    if (LM!=0)
-      tf_select = ec_dec_bits(dec, 1);
+      tf_select = ec_dec_bit_logp(dec, 1);
    else
       tf_select = 0;
-   for (i=start;i<end;i++)
-      tf_res[i] = tf_select_table[LM][4*isTransient+2*tf_select+tf_res[i]];
+   curr = ec_dec_bit_logp(dec, isTransient ? 2 : 4);
+   tf_res[start] = tf_select_table[LM][4*isTransient+2*tf_select+curr];
+   for (i=start+1;i<end;i++)
+   {
+      curr = ec_dec_bit_logp(dec, isTransient ? 4 : 5) ^ curr;
+      tf_res[i] = tf_select_table[LM][4*isTransient+2*tf_select+curr];
+   }
 }
 
 static int alloc_trim_analysis(const CELTMode *m, const celt_norm *X,
@@ -824,7 +820,7 @@ int celt_encode_with_ec_float(CELTEncoder * restrict st, const celt_sig * pcm, i
       } while (++c<C);
 
 #ifdef ENABLE_POSTFILTER
-      if (nbAvailableBytes>12*C)
+      if (nbAvailableBytes>12*C && st->start==0)
       {
          VARDECL(celt_word16, pitch_buf);
          ALLOC(pitch_buf, (COMBFILTER_MAXPERIOD+N)>>1, celt_word16);
@@ -1953,7 +1949,7 @@ int celt_decode_with_ec_float(CELTDecoder * restrict st, const unsigned char *da
    deemphasis(out_syn, pcm, N, C, st->mode->preemph, st->preemph_memD);
    st->loss_count = 0;
    RESTORE_STACK;
-   if (ec_dec_get_error(dec))
+   if (ec_dec_tell(dec,0) > 8*len || ec_dec_get_error(dec))
       return CELT_CORRUPTED_DATA;
    else
       return CELT_OK;