diff options
author | Jean-Marc Valin <jmvalin@jmvalin.ca> | 2016-07-24 22:06:08 -0400 |
---|---|---|
committer | Jean-Marc Valin <jmvalin@jmvalin.ca> | 2016-07-24 22:06:38 -0400 |
commit | c544b1238cf4f07b02f8f30ea761f41c1389a594 (patch) | |
tree | 718696bd24b19c93e59d2a891174ad40aabc5cc7 | |
parent | 72d89fd7f93e9ac6d1fbd4aac762a959217b6230 (diff) | |
download | opus-c544b1238cf4f07b02f8f30ea761f41c1389a594.tar.gz |
Fixes an overflow in amp2Log2() for very large encoder input
-rw-r--r-- | celt/quant_bands.c | 8 |
1 files changed, 7 insertions, 1 deletions
diff --git a/celt/quant_bands.c b/celt/quant_bands.c index 46777b38..6333f1b0 100644 --- a/celt/quant_bands.c +++ b/celt/quant_bands.c @@ -548,9 +548,15 @@ void amp2Log2(const CELTMode *m, int effEnd, int end, c=0; do { for (i=0;i<effEnd;i++) + { bandLogE[i+c*m->nbEBands] = - celt_log2(SHL32(bandE[i+c*m->nbEBands],2)) + celt_log2(bandE[i+c*m->nbEBands]) - SHL16((opus_val16)eMeans[i],6); +#ifdef FIXED_POINT + /* Compensate for bandLogE[] being Q12 but celt_log2() taking a Q14 input. */ + bandLogE[i+c*m->nbEBands] += QCONST16(2.f, DB_SHIFT); +#endif + } for (i=effEnd;i<end;i++) bandLogE[c*m->nbEBands+i] = -QCONST16(14.f,DB_SHIFT); } while (++c < C); |