ref: ec836da27cc2f36435c8dcd7ef57acb26a4d54c6
parent: 74f4e9f385f57bc869540abe60b386957ea56f31
author: Gregory Maxwell <[email protected]>
date: Mon May 4 10:55:40 EDT 2009
Reduce rounding in the mode allocator and remove a scaling loop. This breaks the bitstream.
--- a/libcelt/modes.c
+++ b/libcelt/modes.c
@@ -206,7 +206,7 @@
static void compute_allocation_table(CELTMode *mode, int res)
{
- int i, j, eband, nBark;
+ int i, j, nBark;
celt_int16_t *allocVectors, *allocEnergy;
const int C = CHANNELS(mode);
@@ -221,7 +221,8 @@
/* Compute per-codec-band allocation from per-critical-band matrix */
for (i=0;i<BITALLOC_SIZE;i++)
{
- eband = 0;
+ celt_int32_t current = 0;
+ int eband = 0;
for (j=0;j<nBark;j++)
{
int edge, low;
@@ -228,7 +229,7 @@
celt_int32_t alloc;
edge = mode->eBands[eband+1]*res;
alloc = band_allocation[i*BARK_BANDS+j];
- alloc = alloc*C*mode->mdctSize/4;
+ alloc = alloc*C*mode->mdctSize;
if (edge < bark_freq[j+1])
{
int num, den;
@@ -235,24 +236,16 @@
num = alloc * (edge-bark_freq[j]);
den = bark_freq[j+1]-bark_freq[j];
low = (num+den/2)/den;
- allocVectors[i*mode->nbEBands+eband] += low;
+ allocVectors[i*mode->nbEBands+eband] = (current+low+128)/256;
+ current=0;
eband++;
- allocVectors[i*mode->nbEBands+eband] += alloc-low;
+ current += alloc-low;
} else {
- allocVectors[i*mode->nbEBands+eband] += alloc;
- }
+ current += alloc;
+ }
}
+ allocVectors[i*mode->nbEBands+eband] = (current+128)/256;
}
- for (i=0;i<mode->nbAllocVectors;i++)
- {
- for (j=0;j<mode->nbEBands;j++)
- allocVectors[i*mode->nbEBands+j] = (allocVectors[i*mode->nbEBands+j]+32)/64;
- }
- /*for (i=0;i<mode->nbAllocVectors;i++)
- {
- for (j=0;j<mode->nbEBands;j++)
- allocVectors[i*mode->nbEBands+j] += C;
- }*/
mode->allocVectors = allocVectors;
}