Preventing encoder-decoder mismatch when energy values are too large to be
authorJean-Marc Valin <jean-marc.valin@usherbrooke.ca>
Tue, 27 May 2008 12:17:13 +0000 (22:17 +1000)
committerJean-Marc Valin <jean-marc.valin@usherbrooke.ca>
Tue, 27 May 2008 12:17:13 +0000 (22:17 +1000)
represented by the laplace encoder (would have a probability of zero due
to finite precision)

libcelt/laplace.c
libcelt/laplace.h
libcelt/quant_bands.c

index b48bfe7..abfe576 100644 (file)
@@ -40,19 +40,20 @@ int ec_laplace_get_start_freq(int decay)
    return (((ec_uint32)32767)*(16384-decay))/(16384+decay);
 }
 
-void ec_laplace_encode_start(ec_enc *enc, int value, int decay, int fs)
+void ec_laplace_encode_start(ec_enc *enc, int *value, int decay, int fs)
 {
    int i;
    int fl, ft;
    int s = 0;
-   if (value < 0)
+   int val = *value;
+   if (val < 0)
    {
       s = 1;
-      value = -value;
+      val = -val;
    }
    ft = 32767;
    fl = -fs;
-   for (i=0;i<value;i++)
+   for (i=0;i<val;i++)
    {
       int tmp_l, tmp_s;
       tmp_l = fl;
@@ -63,6 +64,10 @@ void ec_laplace_encode_start(ec_enc *enc, int value, int decay, int fs)
       {
          fs = tmp_s;
          fl = tmp_l;
+         if (s)
+            *value = -i;
+         else
+            *value = i;
          break;
       }
    }
@@ -75,7 +80,7 @@ void ec_laplace_encode_start(ec_enc *enc, int value, int decay, int fs)
    ec_encode(enc, fl, fl+fs, ft);
 }
 
-void ec_laplace_encode(ec_enc *enc, int value, int decay)
+void ec_laplace_encode(ec_enc *enc, int *value, int decay)
 {
    int fs = ec_laplace_get_start_freq(decay);
    ec_laplace_encode_start(enc, value, decay, fs);
index 7220a3f..34ae905 100644 (file)
@@ -40,9 +40,9 @@ int ec_laplace_get_start_freq(int decay);
  @param value Value to encode
  @param decay Probability of the value +/- 1, multiplied by 16384
 */
-void ec_laplace_encode(ec_enc *enc, int value, int decay);
+void ec_laplace_encode(ec_enc *enc, int *value, int decay);
 
-void ec_laplace_encode_start(ec_enc *enc, int value, int decay, int fs);
+void ec_laplace_encode_start(ec_enc *enc, int *value, int decay, int fs);
 
 /** Decode a value that is assumed to be the realisation of a
     Laplace-distributed random process
index 83a3dd5..0e2b065 100644 (file)
@@ -179,7 +179,7 @@ static void quant_energy_mono(const CELTMode *m, celt_ener_t *eBands, celt_word1
       if (ec_enc_tell(enc, 0) - bits > budget+16)
          qi = -1;
       else
-         ec_laplace_encode_start(enc, qi, prob[2*i], prob[2*i+1]);
+         ec_laplace_encode_start(enc, &qi, prob[2*i], prob[2*i+1]);
       q = qi*base_resolution;
       error[i] = f - SHL16(qi,8);