diff options
author | Jean-Marc Valin <jean-marc.valin@usherbrooke.ca> | 2007-12-31 08:12:12 +0300 |
---|---|---|
committer | Jean-Marc Valin <jean-marc.valin@usherbrooke.ca> | 2007-12-31 08:12:12 +0300 |
commit | 0d227d86e5ae13900d2de570205b77d3097fbc11 (patch) | |
tree | 4d24b95f1160b81515571344ed33bbbd5defceb6 /libcelt/bands.c | |
parent | 97252d036569c112efa4e46f988c442ca8de0b00 (diff) |
Got the intra-band prediction/copy to work correctly with
pulse spreading (and to work at all).
Diffstat (limited to 'libcelt/bands.c')
-rw-r--r-- | libcelt/bands.c | 71 |
1 files changed, 28 insertions, 43 deletions
diff --git a/libcelt/bands.c b/libcelt/bands.c index 737c064..ac2703f 100644 --- a/libcelt/bands.c +++ b/libcelt/bands.c @@ -207,27 +207,27 @@ void quant_bands(const CELTMode *m, float *X, float *P, float *W, ec_enc *enc) for (i=0;i<m->nbEBands;i++) { int q; + float theta, n; q = m->nbPulses[i]; - if (q>0) { - float theta, n; - n = sqrt(B*(eBands[i+1]-eBands[i])); - theta = .007*(B*(eBands[i+1]-eBands[i]))/(.1f+abs(m->nbPulses[i])); + n = sqrt(B*(eBands[i+1]-eBands[i])); + theta = .007*(B*(eBands[i+1]-eBands[i]))/(.1f+abs(m->nbPulses[i])); + + if (q<=0) { + q = -q; + intra_prediction(X+B*eBands[i], W+B*eBands[i], B*(eBands[i+1]-eBands[i]), q, norm, P+B*eBands[i], B, eBands[i], enc); + } + + if (q != 0) + { exp_rotation(P+B*eBands[i], B*(eBands[i+1]-eBands[i]), theta, -1, B, 8); exp_rotation(X+B*eBands[i], B*(eBands[i+1]-eBands[i]), theta, -1, B, 8); alg_quant(X+B*eBands[i], W+B*eBands[i], B*(eBands[i+1]-eBands[i]), q, P+B*eBands[i], 0.7, enc); exp_rotation(X+B*eBands[i], B*(eBands[i+1]-eBands[i]), theta, 1, B, 8); - for (j=B*eBands[i];j<B*eBands[i+1];j++) - norm[j] = X[j] * n; - //printf ("%f ", log2(ncwrs64(B*(eBands[i+1]-eBands[i]), q))/(B*(eBands[i+1]-eBands[i]))); - //printf ("%f ", log2(ncwrs64(B*(eBands[i+1]-eBands[i]), q))); - } else { - float n = sqrt(B*(eBands[i+1]-eBands[i])); - copy_quant(X+B*eBands[i], W+B*eBands[i], B*(eBands[i+1]-eBands[i]), -q, norm, B, eBands[i], enc); - for (j=B*eBands[i];j<B*eBands[i+1];j++) - norm[j] = X[j] * n; - //printf ("%f ", (1+log2(eBands[i]-(eBands[i+1]-eBands[i]))+log2(ncwrs64(B*(eBands[i+1]-eBands[i]), -q)))/(B*(eBands[i+1]-eBands[i]))); - //printf ("%f ", (1+log2(eBands[i]-(eBands[i+1]-eBands[i]))+log2(ncwrs64(B*(eBands[i+1]-eBands[i]), -q)))); } + for (j=B*eBands[i];j<B*eBands[i+1];j++) + norm[j] = X[j] * n; + //printf ("%f ", log2(ncwrs64(B*(eBands[i+1]-eBands[i]), q))/(B*(eBands[i+1]-eBands[i]))); + //printf ("%f ", log2(ncwrs64(B*(eBands[i+1]-eBands[i]), q))); } //printf ("\n"); for (i=B*eBands[m->nbEBands];i<B*eBands[m->nbEBands+1];i++) @@ -244,40 +244,25 @@ void unquant_bands(const CELTMode *m, float *X, float *P, ec_dec *dec) for (i=0;i<m->nbEBands;i++) { int q; + float theta, n; q = m->nbPulses[i]; - if (q>0) { - float theta, n; - n = sqrt(B*(eBands[i+1]-eBands[i])); - theta = .007*(B*(eBands[i+1]-eBands[i]))/(.1f+abs(m->nbPulses[i])); + n = sqrt(B*(eBands[i+1]-eBands[i])); + theta = .007*(B*(eBands[i+1]-eBands[i]))/(.1f+abs(m->nbPulses[i])); + + if (q<=0) { + q = -q; + intra_unquant(X+B*eBands[i], B*(eBands[i+1]-eBands[i]), q, norm, P+B*eBands[i], B, eBands[i], dec); + } + + if (q != 0) + { exp_rotation(P+B*eBands[i], B*(eBands[i+1]-eBands[i]), theta, -1, B, 8); alg_unquant(X+B*eBands[i], B*(eBands[i+1]-eBands[i]), q, P+B*eBands[i], 0.7, dec); exp_rotation(X+B*eBands[i], B*(eBands[i+1]-eBands[i]), theta, 1, B, 8); - for (j=B*eBands[i];j<B*eBands[i+1];j++) - norm[j] = X[j] * n; - } else { - float n = sqrt(B*(eBands[i+1]-eBands[i])); - for (j=B*eBands[i];j<B*eBands[i+1];j++) - X[j] = 0; - copy_unquant(X+B*eBands[i], B*(eBands[i+1]-eBands[i]), -q, norm, B, eBands[i], dec); - for (j=B*eBands[i];j<B*eBands[i+1];j++) - norm[j] = X[j] * n; } + for (j=B*eBands[i];j<B*eBands[i+1];j++) + norm[j] = X[j] * n; } for (i=B*eBands[m->nbEBands];i<B*eBands[m->nbEBands+1];i++) X[i] = 0; } - -void band_rotation(const CELTMode *m, float *X, int dir) -{ - return; - int i, B; - const int *eBands = m->eBands; - B = m->nbMdctBlocks*m->nbChannels; - for (i=0;i<m->nbEBands;i++) - { - float theta; - theta = .007*(B*(eBands[i+1]-eBands[i]))/(.1f+abs(m->nbPulses[i])); - exp_rotation(X+B*eBands[i], B*(eBands[i+1]-eBands[i]), theta, dir, B, 8); - } - //printf ("\n"); -} |