Index: celt/bands.c |
diff --git a/celt/bands.c b/celt/bands.c |
index 93bd0bc7220a86ed86f174fe02e5c2698d380df2..cce56e2f6ebe5978fbdae8bff75a74da3f1c7ba8 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); |
@@ -492,7 +508,7 @@ int spreading_decision(const CELTMode *m, celt_norm *X, int *average, |
*tapset_decision=0; |
} |
/*printf("%d %d %d\n", hf_sum, *hf_average, *tapset_decision);*/ |
- celt_assert(nbBands>0); /*M*(eBands[end]-eBands[end-1]) <= 8 assures this*/ |
+ celt_assert(nbBands>0); /* end has to be non-zero */ |
sum /= nbBands; |
/* Recursive averaging */ |
sum = (sum+*average)>>1; |
@@ -869,7 +885,6 @@ static unsigned quant_partition(struct band_ctx *ctx, celt_norm *X, |
int q; |
int curr_bits; |
int imid=0, iside=0; |
- int N_B=N; |
int B0=B; |
opus_val16 mid=0, side=0; |
unsigned cm=0; |
@@ -891,8 +906,6 @@ static unsigned quant_partition(struct band_ctx *ctx, celt_norm *X, |
spread = ctx->spread; |
ec = ctx->ec; |
- N_B /= B; |
- |
/* If we need 1.5 more bit than we can produce, split the band in two. */ |
cache = m->cache.bits + m->cache.index[(LM+1)*m->nbEBands+i]; |
if (LM != -1 && b > cache[cache[0]]+12 && N>2) |
@@ -1072,7 +1085,6 @@ static unsigned quant_band(struct band_ctx *ctx, celt_norm *X, |
longBlocks = B0==1; |
N_B /= B; |
- N_B0 = N_B; |
/* Special case for one sample */ |
if (N==1) |