From 8ea01eed109b3621f3b9e0186ac017119509a5dc Mon Sep 17 00:00:00 2001 From: Jean-Marc Valin <jmvalin@jmvalin.ca> Date: Wed, 13 Nov 2013 09:39:05 -0500 Subject: [PATCH] Making the CELT fixed-point decoder a bit more robust to extreme signals denormalise_bands() can now produce signals close to the max MDCT amplitude. --- celt/bands.c | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/celt/bands.c b/celt/bands.c index f22951b5c..cce56e2f6 100644 --- a/celt/bands.c +++ b/celt/bands.c @@ -214,7 +214,9 @@ void denormalise_bands(const CELTMode *m, const celt_norm * OPUS_RESTRICT X, j=M*eBands[i]; band_end = M*eBands[i+1]; lg = ADD16(bandLogE[i+c*m->nbEBands], SHL16((opus_val16)eMeans[i],6)); -#ifdef FIXED_POINT +#ifndef FIXED_POINT + g = celt_exp2(lg); +#else /* Handle the integer part of the log energy */ shift = 16-(lg>>DB_SHIFT); if (shift>31) @@ -225,9 +227,23 @@ void denormalise_bands(const CELTMode *m, const celt_norm * OPUS_RESTRICT X, /* Handle the fractional part. */ g = celt_exp2_frac(lg&((1<<DB_SHIFT)-1)); } -#else - g = celt_exp2(lg); + /* Handle extreme gains with negative shift. */ + if (shift<0) + { + /* For shift < -2 we'd be likely to overflow, so we're capping + the gain here. This shouldn't happen unless the bitstream is + already corrupted. */ + if (shift < -2) + { + g = 32767; + shift = -2; + } + do { + *f++ = SHL32(MULT16_16(*x++, g), -shift); + } while (++j<band_end); + } else #endif + /* Be careful of the fixed-point "else" just above when changing this code */ do { *f++ = SHR32(MULT16_16(*x++, g), shift); } while (++j<band_end); -- GitLab