diff --git a/libcelt/celt.c b/libcelt/celt.c index c165762a..f01ac1e3 100644 --- a/libcelt/celt.c +++ b/libcelt/celt.c @@ -107,7 +107,7 @@ CELTEncoder *celt_encoder_new(const CELTMode *mode) = 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 @@ int celt_encode(CELTEncoder *st, short *pcm) 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 @@ CELTDecoder *celt_decoder_new(const CELTMode *mode) 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 @@ int celt_decode(CELTDecoder *st, char *data, int len, short *pcm) 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 @@ int celt_decode(CELTDecoder *st, char *data, int len, short *pcm) /* 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 @@ int celt_decode(CELTDecoder *st, char *data, int len, short *pcm) /* 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 8d8ee695..b354880f 100644 --- a/libcelt/modes.c +++ b/libcelt/modes.c @@ -77,9 +77,9 @@ const int pbank1[PBANDS128+2] = {0, 2, 4, 6, 8, 12, 20, 28, PITCH_END128, 128}; #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 c07915c6..d4dd2eab 100644 --- a/libcelt/quant_bands.c +++ b/libcelt/quant_bands.c @@ -35,49 +35,7 @@ #include #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;inbChannels; + + if (C==1) + quant_energy_mono(m, eBands, oldEBands, enc); + else +#if 1 + { + int c; + for (c=0;cnbEBands]; + for (i=0;inbEBands;i++) + E[i] = eBands[C*i+c]; + quant_energy_mono(m, E, oldEBands+c*m->nbEBands, enc); + for (i=0;inbEBands;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;inbChannels; + + if (C==1) + unquant_energy_mono(m, eBands, oldEBands, dec); + else { + int c; + for (c=0;cnbEBands]; + unquant_energy_mono(m, E, oldEBands+c*m->nbEBands, dec); + for (i=0;inbEBands;i++) + eBands[C*i+c] = E[i]; + } + } +} diff --git a/libcelt/vq.c b/libcelt/vq.c index 9dbb108f..e3809007 100644 --- a/libcelt/vq.c +++ b/libcelt/vq.c @@ -188,8 +188,9 @@ void alg_quant(float *x, float *W, int N, int K, float *p, float alpha, ec_enc * 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 @@ void alg_quant(float *x, float *W, int N, int K, float *p, float alpha, ec_enc * for (i=0;i