No more cheating, everything fully quantised
[opus.git] / libcelt / quant_bands.c
index 33afc04..72b762a 100644 (file)
 
 
 #include "quant_bands.h"
+#include "laplace.h"
 #include <math.h>
 
-int dummy_qi[100];
+/* FIXME: Should be in the mode */
+static const float means[15] = {
+   14.8621, 12.6918, 10.2978, 9.5862, 10.3784, 
+   10.4555, 9.1594, 9.0280, 8.3291, 8.3410,
+    8.5737, 8.5614, 9.0107, 7.6809, 7.0665};
 
-void quant_energy(CELTMode *m, float *eBands, float *oldEBands, ec_enc *enc)
+static const int decay[15] = {
+   14800, 13800, 12600, 12000, 11000, 10000, 9800, 8400, 8000, 7500, 7000, 7000, 7000, 6000, 6000
+};
+
+void quant_energy(const CELTMode *m, float *eBands, float *oldEBands, ec_enc *enc)
 {
    int i;
    float prev = 0;
@@ -45,18 +54,18 @@ void quant_energy(CELTMode *m, float *eBands, float *oldEBands, ec_enc *enc)
       float q;
       float res;
       float x;
-      float pred = .7*oldEBands[i];
+      float pred = .7*oldEBands[i]+means[i];
       
       x = 20*log10(.3+eBands[i]);
       res = .25f*(i+3.f);
       //res = 1;
       qi = (int)floor(.5+(x-pred-prev)/res);
-      dummy_qi[i] = qi;
+      ec_laplace_encode(enc, qi, decay[i]);
       q = qi*res;
       
-      //printf("%f %f ", pred+prev+q, x);
       //printf("%d ", qi);
-      //printf("%f ", x-pred-prev);
+      //printf("%f %f ", pred+prev+q, x);
+      //printf("%f ", x-pred);
       
       oldEBands[i] = pred+prev+q;
       eBands[i] = pow(10, .05*oldEBands[i])-.3;
@@ -67,7 +76,7 @@ void quant_energy(CELTMode *m, float *eBands, float *oldEBands, ec_enc *enc)
    //printf ("\n");
 }
 
-void unquant_energy(CELTMode *m, float *eBands, float *oldEBands, ec_dec *dec)
+void unquant_energy(const CELTMode *m, float *eBands, float *oldEBands, ec_dec *dec)
 {
    int i;
    float prev = 0;
@@ -76,12 +85,11 @@ void unquant_energy(CELTMode *m, float *eBands, float *oldEBands, ec_dec *dec)
       int qi;
       float q;
       float res;
-      float pred = .7*oldEBands[i];
+      float pred = .7*oldEBands[i]+means[i];
       
       res = .25f*(i+3.f);
-      qi = dummy_qi[i];
+      qi = ec_laplace_decode(dec, decay[i]);
       q = qi*res;
-      
       //printf("%f %f ", pred+prev+q, x);
       //printf("%d ", qi);
       //printf("%f ", x-pred-prev);
@@ -92,4 +100,5 @@ void unquant_energy(CELTMode *m, float *eBands, float *oldEBands, ec_dec *dec)
          eBands[i] = 0;
       prev = (prev + .5*q);
    }
+   //printf ("\n");
 }