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