Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/quite/celt.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJean-Marc Valin <jean-marc.valin@usherbrooke.ca>2007-12-31 08:12:12 +0300
committerJean-Marc Valin <jean-marc.valin@usherbrooke.ca>2007-12-31 08:12:12 +0300
commit0d227d86e5ae13900d2de570205b77d3097fbc11 (patch)
tree4d24b95f1160b81515571344ed33bbbd5defceb6 /libcelt/bands.c
parent97252d036569c112efa4e46f988c442ca8de0b00 (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.c71
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");
-}