Stereo decoding working again (fixed a few issues in the encoder at the same
time)
diff --git a/libcelt/celt.c b/libcelt/celt.c
index c165762..f01ac1e 100644
--- a/libcelt/celt.c
+++ b/libcelt/celt.c
@@ -107,7 +107,7 @@
             = sin(.5*M_PI* sin(.5*M_PI*(i+.5)/st->overlap) * sin(.5*M_PI*(i+.5)/st->overlap));
    for (i=0;i<2*N4;i++)
       st->window[N-N4+i] = 1;
-   st->oldBandE = celt_alloc(mode->nbEBands*sizeof(float));
+   st->oldBandE = celt_alloc(C*mode->nbEBands*sizeof(float));
 
    st->preemph = 0.8;
    st->preemph_memE = celt_alloc(C*sizeof(float));;
@@ -318,7 +318,6 @@
    time_dct(X, N, B, C);
    time_dct(P, N, B, C);
 
-
    quant_energy(st->mode, bandE, st->oldBandE, &st->enc);
 
    /* Pitch prediction */
@@ -447,7 +446,7 @@
    for (i=0;i<2*N4;i++)
       st->window[N-N4+i] = 1;
    
-   st->oldBandE = celt_alloc(mode->nbEBands*sizeof(float));
+   st->oldBandE = celt_alloc(C*mode->nbEBands*sizeof(float));
 
    st->preemph = 0.8;
    st->preemph_memD = celt_alloc(C*sizeof(float));;
@@ -518,7 +517,7 @@
    
    float X[C*B*N];         /**< Interleaved signal MDCTs */
    float P[C*B*N];         /**< Interleaved pitch MDCTs*/
-   float bandE[st->mode->nbEBands];
+   float bandE[st->mode->nbEBands*C];
    float gains[st->mode->nbPBands];
    int pitch_index;
    ec_dec dec;
@@ -543,16 +542,16 @@
    /* Pitch MDCT */
    compute_mdcts(&st->mdct_lookup, st->window, st->out_mem+pitch_index*C, P, N, B, C);
 
-   if (C==2)
-      haar1(P, B*N*C, 1);
-   time_dct(P, N, B, C);
-
    {
       float bandEp[st->mode->nbEBands];
       compute_band_energies(st->mode, P, bandEp);
       normalise_bands(st->mode, P, bandEp);
    }
 
+   if (C==2)
+      haar1(P, B*N*C, 1);
+   time_dct(P, N, B, C);
+
    /* Get the pitch gains */
    unquant_pitch(gains, st->mode->nbPBands, &dec);
 
@@ -562,13 +561,16 @@
    /* Decode fixed codebook and merge with pitch */
    unquant_bands(st->mode, X, P, &dec);
 
-   /* Synthesis */
-   denormalise_bands(st->mode, X, bandE);
-
    time_idct(X, N, B, C);
    if (C==2)
       haar1(X, B*N*C, 1);
 
+   renormalise_bands(st->mode, X);
+   
+   /* Synthesis */
+   denormalise_bands(st->mode, X, bandE);
+
+
    CELT_MOVE(st->out_mem, st->out_mem+C*B*N, C*(MAX_PERIOD-B*N));
    /* Compute inverse MDCTs */
    compute_inv_mdcts(&st->mdct_lookup, st->window, X, st->out_mem, st->mdct_overlap, N, st->overlap, B, C);
diff --git a/libcelt/modes.c b/libcelt/modes.c
index 8d8ee69..b354880 100644
--- a/libcelt/modes.c
+++ b/libcelt/modes.c
@@ -77,9 +77,9 @@
 #define NBANDS256 15
 #define PBANDS256 8
 #define PITCH_END256 88
-const int qbank3[NBANDS256+2] = {0, 4, 8, 12, 16, 24, 32, 40, 48, 56, 72, 88, 104, 126, 168, 232, 256};
+const int qbank3[NBANDS256+2] = {0, 4, 8, 12, 16, 24, 32, 40, 48, 56, 72, 88, 104, 136, 168, 232, 256};
 //const int pbank3[PBANDS256+2] = {0, 8, 16, 24, 40, PITCH_END256, 256};
-const int pbank3[PBANDS256+2] = {0, 4, 8, 12, 16, 24, 40, 56, PITCH_END128, 128};
+const int pbank3[PBANDS256+2] = {0, 4, 8, 12, 16, 24, 40, 56, PITCH_END256, 256};
 
 const CELTMode mode0 = {
    128,         /**< overlap */
diff --git a/libcelt/quant_bands.c b/libcelt/quant_bands.c
index c07915c..d4dd2ea 100644
--- a/libcelt/quant_bands.c
+++ b/libcelt/quant_bands.c
@@ -35,49 +35,7 @@
 #include <math.h>
 #include "os_support.h"
 
-void quant_energy(const CELTMode *m, float *eBands, float *oldEBands, ec_enc *enc)
-{
-   int C;
-   
-   C = m->nbChannels;
-
-   if (C==1)
-      quant_energy_mono(m, eBands, oldEBands, enc);
-   else if (C==2)
-   {
-      int i;
-      int NB = m->nbEBands;
-      float mid[NB];
-      float side[NB];
-      float left;
-      float right;
-      for (i=0;i<NB;i++)
-      {
-         //left = eBands[C*i];
-         //right = eBands[C*i+1];
-         mid[i] = sqrt(eBands[C*i]*eBands[C*i] + eBands[C*i+1]*eBands[C*i+1]);
-         side[i] = 20*log10((eBands[2*i]+.3)/(eBands[2*i+1]+.3));
-         //printf ("%f %f ", mid[i], side[i]);
-      }
-      //printf ("\n");
-      quant_energy_mono(m, mid, oldEBands, enc);
-      for (i=0;i<NB;i++)
-         side[i] = pow(10.f,floor(.5f+side[i])/10.f);
-         
-      //quant_energy_side(m, side, oldEBands+NB, enc);
-      for (i=0;i<NB;i++)
-      {
-         eBands[C*i] = mid[i]*sqrt(side[i]/(1.f+side[i]));
-         eBands[C*i+1] = mid[i]*sqrt(1.f/(1.f+side[i]));
-         //printf ("%f %f ", mid[i], side[i]);
-      }
-
-   } else {
-      celt_fatal("more than 2 channels not supported");
-   }
-}
-
-void quant_energy_mono(const CELTMode *m, float *eBands, float *oldEBands, ec_enc *enc)
+static void quant_energy_mono(const CELTMode *m, float *eBands, float *oldEBands, ec_enc *enc)
 {
    int i;
    float prev = 0;
@@ -109,7 +67,67 @@
    //printf ("\n");
 }
 
-void unquant_energy(const CELTMode *m, float *eBands, float *oldEBands, ec_dec *dec)
+void quant_energy(const CELTMode *m, float *eBands, float *oldEBands, ec_enc *enc)
+{
+   int C;
+   
+   C = m->nbChannels;
+
+   if (C==1)
+      quant_energy_mono(m, eBands, oldEBands, enc);
+   else 
+#if 1
+   {
+      int c;
+      for (c=0;c<C;c++)
+      {
+         int i;
+         float E[m->nbEBands];
+         for (i=0;i<m->nbEBands;i++)
+            E[i] = eBands[C*i+c];
+         quant_energy_mono(m, E, oldEBands+c*m->nbEBands, enc);
+         for (i=0;i<m->nbEBands;i++)
+            eBands[C*i+c] = E[i];
+      }
+   }
+#else
+      if (C==2)
+   {
+      int i;
+      int NB = m->nbEBands;
+      float mid[NB];
+      float side[NB];
+      float left;
+      float right;
+      for (i=0;i<NB;i++)
+      {
+         //left = eBands[C*i];
+         //right = eBands[C*i+1];
+         mid[i] = sqrt(eBands[C*i]*eBands[C*i] + eBands[C*i+1]*eBands[C*i+1]);
+         side[i] = 20*log10((eBands[2*i]+.3)/(eBands[2*i+1]+.3));
+         //printf ("%f %f ", mid[i], side[i]);
+      }
+      //printf ("\n");
+      quant_energy_mono(m, mid, oldEBands, enc);
+      for (i=0;i<NB;i++)
+         side[i] = pow(10.f,floor(.5f+side[i])/10.f);
+         
+      //quant_energy_side(m, side, oldEBands+NB, enc);
+      for (i=0;i<NB;i++)
+      {
+         eBands[C*i] = mid[i]*sqrt(side[i]/(1.f+side[i]));
+         eBands[C*i+1] = mid[i]*sqrt(1.f/(1.f+side[i]));
+         //printf ("%f %f ", mid[i], side[i]);
+      }
+
+   } else {
+      celt_fatal("more than 2 channels not supported");
+   }
+#endif
+}
+
+
+static void unquant_energy_mono(const CELTMode *m, float *eBands, float *oldEBands, ec_dec *dec)
 {
    int i;
    float prev = 0;
@@ -135,3 +153,23 @@
    }
    //printf ("\n");
 }
+
+void unquant_energy(const CELTMode *m, float *eBands, float *oldEBands, ec_dec *dec)
+{
+   int C;   
+   C = m->nbChannels;
+
+   if (C==1)
+      unquant_energy_mono(m, eBands, oldEBands, dec);
+   else {
+      int c;
+      for (c=0;c<C;c++)
+      {
+         int i;
+         float E[m->nbEBands];
+         unquant_energy_mono(m, E, oldEBands+c*m->nbEBands, dec);
+         for (i=0;i<m->nbEBands;i++)
+            eBands[C*i+c] = E[i];
+      }
+   }
+}
diff --git a/libcelt/vq.c b/libcelt/vq.c
index 9dbb108..e380900 100644
--- a/libcelt/vq.c
+++ b/libcelt/vq.c
@@ -188,8 +188,9 @@
    pulse2comb(N, K, comb, signs, iy[0]); 
    ec_enc_uint64(enc,icwrs64(N, K, comb, signs),ncwrs64(N, K));
    
-   /* Recompute the gain in one pass (to reduce errors) */
-   if (0) {
+   /* Recompute the gain in one pass to reduce the encoder-decoder mismatch
+      due to the recursive computation used in quantisation */
+   if (1) {
       float Ryp=0;
       float Rpp=0;
       float Ryy=0;
@@ -203,7 +204,6 @@
       for (i=0;i<N;i++)
          y[0][i] = iy[0][i] - alpha*Ryp*p[i];
       
-      /* Recompute after the projection (I think it's right) */
       Ryp = 0;
       for (i=0;i<N;i++)
          Ryp += y[0][i]*p[i];