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++)