diff options
author | Jean-Marc Valin <jean-marc.valin@usherbrooke.ca> | 2008-07-21 04:36:54 +0400 |
---|---|---|
committer | Jean-Marc Valin <jean-marc.valin@usherbrooke.ca> | 2008-07-21 04:36:54 +0400 |
commit | df38f2bf013670903fa273153c1beabb5d27a6f9 (patch) | |
tree | 91018b57dd84aeeee89217fb49538f18615349ad | |
parent | 2c733067501cf257cb3b428077a728074ab156d0 (diff) |
Re-enabling folding/intra for transientsend_pre_echo_work
-rw-r--r-- | libcelt/bands.c | 30 | ||||
-rw-r--r-- | libcelt/vq.c | 38 | ||||
-rw-r--r-- | libcelt/vq.h | 6 |
3 files changed, 31 insertions, 43 deletions
diff --git a/libcelt/bands.c b/libcelt/bands.c index 97c4855..f07045a 100644 --- a/libcelt/bands.c +++ b/libcelt/bands.c @@ -377,7 +377,7 @@ void stereo_decision(const CELTMode *m, celt_norm_t * restrict X, int *stereo_mo /* Quantisation of the residual */ -void quant_bands(const CELTMode *m, celt_norm_t * restrict X, celt_norm_t *P, celt_mask_t *W, const celt_ener_t *bandE, const int *stereo_mode, int total_bits, int time_domain, ec_enc *enc) +void quant_bands(const CELTMode *m, celt_norm_t * restrict X, celt_norm_t *P, celt_mask_t *W, const celt_ener_t *bandE, const int *stereo_mode, int total_bits, int shortBlocks, ec_enc *enc) { int i, j, bits; const celt_int16_t * restrict eBands = m->eBands; @@ -386,8 +386,10 @@ void quant_bands(const CELTMode *m, celt_norm_t * restrict X, celt_norm_t *P, ce VARDECL(int, pulses); VARDECL(int, offsets); const int C = CHANNELS(m); + int B; SAVE_STACK; + B = shortBlocks ? m->nbShortMdcts : 1; ALLOC(_norm, C*eBands[m->nbEBands+1], celt_norm_t); ALLOC(pulses, m->nbEBands, int); ALLOC(offsets, m->nbEBands, int); @@ -415,13 +417,10 @@ void quant_bands(const CELTMode *m, celt_norm_t * restrict X, celt_norm_t *P, ce if (eBands[i] >= m->pitchEnd || q<=0) { q -= 1; - if (!time_domain) - { - if (q<0) - intra_fold(m, X+C*eBands[i], eBands[i+1]-eBands[i], norm, P+C*eBands[i], eBands[i], eBands[m->nbEBands+1]); - else - intra_prediction(m, X+C*eBands[i], W+C*eBands[i], eBands[i+1]-eBands[i], q, norm, P+C*eBands[i], eBands[i], eBands[m->nbEBands+1], enc); - } + if (q<0) + intra_fold(m, X+C*eBands[i], eBands[i+1]-eBands[i], norm, P+C*eBands[i], eBands[i], B); + else + intra_prediction(m, X+C*eBands[i], W+C*eBands[i], eBands[i+1]-eBands[i], q, norm, P+C*eBands[i], eBands[i], B, enc); } if (q > 0) @@ -448,7 +447,7 @@ void quant_bands(const CELTMode *m, celt_norm_t * restrict X, celt_norm_t *P, ce } /* Decoding of the residual */ -void unquant_bands(const CELTMode *m, celt_norm_t * restrict X, celt_norm_t *P, const celt_ener_t *bandE, const int *stereo_mode, int total_bits, int time_domain, ec_dec *dec) +void unquant_bands(const CELTMode *m, celt_norm_t * restrict X, celt_norm_t *P, const celt_ener_t *bandE, const int *stereo_mode, int total_bits, int shortBlocks, ec_dec *dec) { int i, j, bits; const celt_int16_t * restrict eBands = m->eBands; @@ -457,8 +456,10 @@ void unquant_bands(const CELTMode *m, celt_norm_t * restrict X, celt_norm_t *P, VARDECL(int, pulses); VARDECL(int, offsets); const int C = CHANNELS(m); + int B; SAVE_STACK; + B = shortBlocks ? m->nbShortMdcts : 1; ALLOC(_norm, C*eBands[m->nbEBands+1], celt_norm_t); ALLOC(pulses, m->nbEBands, int); ALLOC(offsets, m->nbEBands, int); @@ -481,13 +482,10 @@ void unquant_bands(const CELTMode *m, celt_norm_t * restrict X, celt_norm_t *P, if (eBands[i] >= m->pitchEnd || q<=0) { q -= 1; - if (!time_domain) - { - if (q<0) - intra_fold(m, X+C*eBands[i], eBands[i+1]-eBands[i], norm, P+C*eBands[i], eBands[i], eBands[m->nbEBands+1]); - else - intra_unquant(m, X+C*eBands[i], eBands[i+1]-eBands[i], q, norm, P+C*eBands[i], eBands[i], eBands[m->nbEBands+1], dec); - } + if (q<0) + intra_fold(m, X+C*eBands[i], eBands[i+1]-eBands[i], norm, P+C*eBands[i], eBands[i], B); + else + intra_unquant(m, X+C*eBands[i], eBands[i+1]-eBands[i], q, norm, P+C*eBands[i], eBands[i], B, dec); } if (q > 0) diff --git a/libcelt/vq.c b/libcelt/vq.c index d0459be..6556a63 100644 --- a/libcelt/vq.c +++ b/libcelt/vq.c @@ -259,36 +259,26 @@ void alg_unquant(celt_norm_t *X, int N, int K, celt_norm_t *P, ec_dec *dec) RESTORE_STACK; } -static celt_word32_t fold(const CELTMode *m, int N, celt_norm_t *Y, celt_norm_t * restrict P, int N0, int Nmax) +static celt_word32_t fold(const CELTMode *m, int N, celt_norm_t *Y, celt_norm_t * restrict P, int N0, int B) { - int i, j; + int j; celt_word32_t E; const int C = CHANNELS(m); - + int id = N0 % (C*B); + /* Here, we assume that id will never be greater than N0, i.e. that + no band is wider than N0. */ E = EPSILON; - if (N0 >= (Nmax>>1)) + for (j=0;j<C*N;j++) { - for (i=0;i<C;i++) - { - for (j=0;j<N;j++) - { - P[j*C+i] = Y[(Nmax-N0-j-1)*C+i]; - E += P[j*C+i]*P[j*C+i]; - } - } - } else { - for (j=0;j<C*N;j++) - { - P[j] = Y[j]; - E = MAC16_16(E, P[j],P[j]); - } + P[j] = Y[id++]; + E = MAC16_16(E, P[j],P[j]); } return E; } #define KGAIN 6 -void intra_prediction(const CELTMode *m, celt_norm_t * restrict x, celt_mask_t *W, int N, int K, celt_norm_t *Y, celt_norm_t * restrict P, int N0, int Nmax, ec_enc *enc) +void intra_prediction(const CELTMode *m, celt_norm_t * restrict x, celt_mask_t *W, int N, int K, celt_norm_t *Y, celt_norm_t * restrict P, int N0, int B, ec_enc *enc) { int j; celt_word16_t s = 1; @@ -300,7 +290,7 @@ void intra_prediction(const CELTMode *m, celt_norm_t * restrict x, celt_mask_t * pred_gain = celt_div((celt_word32_t)MULT16_16(Q15_ONE,N),(celt_word32_t)(N+KGAIN*K)); - E = fold(m, N, Y, P, N0, Nmax); + E = fold(m, N, Y, P, N0, B); for (j=0;j<C*N;j++) xy = MAC16_16(xy, P[j], x[j]); @@ -320,7 +310,7 @@ void intra_prediction(const CELTMode *m, celt_norm_t * restrict x, celt_mask_t * P[j] = PSHR32(MULT16_16(pred_gain, P[j]),8); } -void intra_unquant(const CELTMode *m, celt_norm_t *x, int N, int K, celt_norm_t *Y, celt_norm_t * restrict P, int N0, int Nmax, ec_dec *dec) +void intra_unquant(const CELTMode *m, celt_norm_t *x, int N, int K, celt_norm_t *Y, celt_norm_t * restrict P, int N0, int B, ec_dec *dec) { int j; celt_word16_t s; @@ -335,7 +325,7 @@ void intra_unquant(const CELTMode *m, celt_norm_t *x, int N, int K, celt_norm_t pred_gain = celt_div((celt_word32_t)MULT16_16(Q15_ONE,N),(celt_word32_t)(N+KGAIN*K)); - E = fold(m, N, Y, P, N0, Nmax); + E = fold(m, N, Y, P, N0, B); /*pred_gain = pred_gain/sqrt(E);*/ pred_gain = s*MULT16_16_Q15(pred_gain,celt_rcp(SHL32(celt_sqrt(E),9))); @@ -343,14 +333,14 @@ void intra_unquant(const CELTMode *m, celt_norm_t *x, int N, int K, celt_norm_t P[j] = PSHR32(MULT16_16(pred_gain, P[j]),8); } -void intra_fold(const CELTMode *m, celt_norm_t *x, int N, celt_norm_t *Y, celt_norm_t * restrict P, int N0, int Nmax) +void intra_fold(const CELTMode *m, celt_norm_t *x, int N, celt_norm_t *Y, celt_norm_t * restrict P, int N0, int B) { int j; celt_word32_t E; celt_word16_t g; const int C = CHANNELS(m); - E = fold(m, N, Y, P, N0, Nmax); + E = fold(m, N, Y, P, N0, B); g = celt_rcp(SHL32(celt_sqrt(E),9)); for (j=0;j<C*N;j++) diff --git a/libcelt/vq.h b/libcelt/vq.h index b142d25..eec85e6 100644 --- a/libcelt/vq.h +++ b/libcelt/vq.h @@ -73,11 +73,11 @@ void alg_unquant(celt_norm_t *X, int N, int K, celt_norm_t *P, ec_dec *dec); * @param N0 Number of valid offsets * @param enc Entropy encoder state */ -void intra_prediction(const CELTMode *m, celt_norm_t * restrict x, celt_mask_t *W, int N, int K, celt_norm_t *Y, celt_norm_t * restrict P, int N0, int Nmax, ec_enc *enc); +void intra_prediction(const CELTMode *m, celt_norm_t * restrict x, celt_mask_t *W, int N, int K, celt_norm_t *Y, celt_norm_t * restrict P, int N0, int B, ec_enc *enc); -void intra_unquant(const CELTMode *m, celt_norm_t *x, int N, int K, celt_norm_t *Y, celt_norm_t *P, int N0, int Nmax, ec_dec *dec); +void intra_unquant(const CELTMode *m, celt_norm_t *x, int N, int K, celt_norm_t *Y, celt_norm_t *P, int N0, int B, ec_dec *dec); /** Encode the entire band as a "fold" from other parts of the spectrum. No bits required (only use is case of an emergency!) */ -void intra_fold(const CELTMode *m, celt_norm_t *x, int N, celt_norm_t *Y, celt_norm_t *P, int N0, int Nmax); +void intra_fold(const CELTMode *m, celt_norm_t *x, int N, celt_norm_t *Y, celt_norm_t *P, int N0, int B); #endif /* VQ_H */ |