shithub: opus

Download patch

ref: d03162010eeaa5d664b03767142a20e36a6bf4f8
parent: 43b3537d380e50db1acfd7109cfb0c091282c59f
author: Jean-Marc Valin <[email protected]>
date: Thu Feb 28 11:52:44 EST 2008

fixed-point: second check-point on quant_energy_mono()

--- a/libcelt/quant_bands.c
+++ b/libcelt/quant_bands.c
@@ -107,16 +107,22 @@
    for (i=0;i<m->nbEBands;i++)
    {
       int q2;
-      float offset = Q8_1*(error[i]+QCONST16(.5f,8))*frac[i];
+      float offset2;
+      celt_word16_t offset = (error[i]+QCONST16(.5f,8))*frac[i];
       /* FIXME: Instead of giving up without warning, we should degrade everything gracefully */
       if (ec_enc_tell(enc, 0) - bits +EC_ILOG(frac[i])> budget)
          break;
-      q2 = (int)floor(offset);
+#ifdef FIXED_POINT
+      /* Has to be without rounding */
+      q2 = offset>>8;
+#else
+      q2 = (int)floor(Q8_1*offset);
+#endif
       if (q2 > frac[i]-1)
          q2 = frac[i]-1;
       ec_enc_uint(enc, q2, frac[i]);
-      offset = ((q2+.5)/frac[i])-.5;
-      oldEBands[i] += DB_SCALING*6.*offset;
+      offset = (Q8*(q2+.5)/frac[i])-QCONST16(.5f,8);
+      oldEBands[i] += PSHR32(MULT16_16(DB_SCALING*6,offset),8);
       /*printf ("%f ", error[i] - offset);*/
    }
    for (i=0;i<m->nbEBands;i++)