diff --git a/libcelt/bands.c b/libcelt/bands.c index 2eeff44bc1e064da4304a1c4b69a3d302e4530dd..c06efce436399f2de8c6d0f0e7c24db22428b8b5 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 cc1148343ae8c3c6191e8aab1eb118ca20df30f2..d03798cbe58860945dfdab10685b58ff41a05463 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 1434f8d3e4ffdffc854e5730105f7241461bae8c..1b503e388759f3b692be56993ece388a8790bf08 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 c0c457a743bb00bfc93240d9bd546c0c76e593e9..9b3d66d2301f6bd7eeea872e11ae6a489314198f 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 50769fa02df7f0915bdcffe900e7ae3ed8ee0d70..a2257ee3541e1f9510d9f00a7db4672f057f8d2a 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);