From 29ccab8aacdd3a0bb3d8c5b74fc54ece925384fd Mon Sep 17 00:00:00 2001
From: Jean-Marc Valin <Jean-Marc.Valin@csiro.au>
Date: Thu, 6 Dec 2007 15:39:38 +1100
Subject: [PATCH] Some work on index packing

---
 libcelt/bands.c | 7 ++++---
 libcelt/bands.h | 4 +++-
 libcelt/celt.c  | 4 ++--
 libcelt/vq.c    | 7 ++++++-
 libcelt/vq.h    | 2 +-
 5 files changed, 16 insertions(+), 8 deletions(-)

diff --git a/libcelt/bands.c b/libcelt/bands.c
index 2eeff44bc..c06efce43 100644
--- a/libcelt/bands.c
+++ b/libcelt/bands.c
@@ -146,7 +146,7 @@ void pitch_quant_bands(const CELTMode *m, float *X, float *P, float *gains)
       P[i] = 0;
 }
 
-void quant_bands(const CELTMode *m, float *X, float *P)
+void quant_bands(const CELTMode *m, float *X, float *P, ec_enc *enc)
 {
    int i, j, B;
    const int *eBands = m->eBands;
@@ -156,11 +156,12 @@ void quant_bands(const CELTMode *m, float *X, float *P)
    
    for (i=0;i<m->nbEBands;i++)
    {
-      int q;
+      int q, id;
       q = m->nbPulses[i];
       if (q>0) {
          float n = sqrt(B*(eBands[i+1]-eBands[i]));
-         alg_quant2(X+B*eBands[i], B*(eBands[i+1]-eBands[i]), q, P+B*eBands[i]);
+         id = alg_quant2(X+B*eBands[i], B*(eBands[i+1]-eBands[i]), q, P+B*eBands[i]);
+         ec_enc_uint(enc,id,ncwrs(B*(eBands[i+1]-eBands[i]), q));
          for (j=B*eBands[i];j<B*eBands[i+1];j++)
             norm[j] = X[j] * n;
          //bits += log2(ncwrs(B*(eBands[i+1]-eBands[i]), q));
diff --git a/libcelt/bands.h b/libcelt/bands.h
index cc1148343..d03798cbe 100644
--- a/libcelt/bands.h
+++ b/libcelt/bands.h
@@ -32,7 +32,9 @@
 #ifndef BANDS_H
 #define BANDS_H
 
+
 #include "modes.h"
+#include "entenc.h"
 
 void compute_band_energies(const CELTMode *m, float *X, float *bands);
 
@@ -44,7 +46,7 @@ void compute_pitch_gain(const CELTMode *m, float *X, float *P, float *gains, flo
 
 void pitch_quant_bands(const CELTMode *m, float *X, float *P, float *gains);
 
-void quant_bands(const CELTMode *m, float *X, float *P);
+void quant_bands(const CELTMode *m, float *X, float *P, ec_enc *enc);
 
 void pitch_renormalise_bands(const CELTMode *m, float *X, float *P);
 
diff --git a/libcelt/celt.c b/libcelt/celt.c
index 1434f8d3e..1b503e388 100644
--- a/libcelt/celt.c
+++ b/libcelt/celt.c
@@ -235,7 +235,7 @@ int celt_encode(CELTState *st, short *pcm)
       sum += X[i]*X[i];
    printf ("%f\n", sum);*/
    /* Residual quantisation */
-   quant_bands(st->mode, X, P);
+   quant_bands(st->mode, X, P, &st->enc);
    
    /* Synthesis */
    denormalise_bands(st->mode, X, bandE);
@@ -267,7 +267,7 @@ int celt_encode(CELTState *st, short *pcm)
          pcm[i*N+j] = (short)floor(.5+tmp);
       }
    }
-
+   printf ("%d\n", ec_byte_bytes(&st->buf));
    return 0;
 }
 
diff --git a/libcelt/vq.c b/libcelt/vq.c
index c0c457a74..9b3d66d23 100644
--- a/libcelt/vq.c
+++ b/libcelt/vq.c
@@ -31,6 +31,7 @@
 
 #include <math.h>
 #include <stdlib.h>
+#include "cwrs.h"
 
 /* Algebraic pulse-base quantiser. The signal x is replaced by the sum of the pitch 
    a combination of pulses such that its norm is still equal to 1 */
@@ -94,7 +95,7 @@ void alg_quant(float *x, int N, int K, float *p)
 /* Improved algebraic pulse-base quantiser. The signal x is replaced by the sum of the pitch 
    a combination of pulses such that its norm is still equal to 1. The only difference with 
    the quantiser above is that the search is more complete. */
-void alg_quant2(float *x, int N, int K, float *p)
+int alg_quant2(float *x, int N, int K, float *p)
 {
    int L = 5;
    //float tata[200];
@@ -236,6 +237,10 @@ void alg_quant2(float *x, int N, int K, float *p)
       for (i=0;i<N;i++)
          x[i] *= E;
    }
+   int comb[K];
+   int signs[K];
+   pulse2comb(N, K, comb, signs, iy[0]); 
+   return icwrs(N, K, comb, signs);
 }
 
 /* Just replace the band with noise of unit energy */
diff --git a/libcelt/vq.h b/libcelt/vq.h
index 50769fa02..a2257ee35 100644
--- a/libcelt/vq.h
+++ b/libcelt/vq.h
@@ -39,7 +39,7 @@ void alg_quant(float *x, int N, int K, float *p);
 /* Improved algebraic pulse-base quantiser. The signal x is replaced by the sum of the pitch 
    a combination of pulses such that its norm is still equal to 1. The only difference with 
    the quantiser above is that the search is more complete. */
-void alg_quant2(float *x, int N, int K, float *p);
+int alg_quant2(float *x, int N, int K, float *p);
 
 /* Just replace the band with noise of unit energy */
 void noise_quant(float *x, int N, int K, float *p);
-- 
GitLab