From d03162010eeaa5d664b03767142a20e36a6bf4f8 Mon Sep 17 00:00:00 2001 From: Jean-Marc Valin Date: Thu, 28 Feb 2008 16:52:44 +1100 Subject: [PATCH] fixed-point: second check-point on quant_energy_mono() --- libcelt/quant_bands.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/libcelt/quant_bands.c b/libcelt/quant_bands.c index 6d3a802b..18eddd35 100644 --- a/libcelt/quant_bands.c +++ b/libcelt/quant_bands.c @@ -107,16 +107,22 @@ static void quant_energy_mono(const CELTMode *m, celt_ener_t *eBands, celt_word1 for (i=0;inbEBands;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;inbEBands;i++)