diff --git a/libcelt/modes.c b/libcelt/modes.c index c205db4ff4549bce21119bdba2a13dbf0641042d..ff88f582932af94a755853572017cd8fdf9433f7 100644 --- a/libcelt/modes.c +++ b/libcelt/modes.c @@ -206,8 +206,9 @@ static void compute_allocation_table(CELTMode *mode, int res) { int edge, low, high; celt_int32 alloc; - - alloc = mode->shortMdctSize*band_allocation[i*BARK_BANDS+j]; + /* This compensates for the sampling rate. The 46000 here reflects the fact that we + originally tuned using both 44.1 and 48 kHz. */ + alloc = ((celt_int32)46000*mode->shortMdctSize/mode->Fs)*band_allocation[i*BARK_BANDS+j]; low = bark_freq[j]; high = bark_freq[j+1]; @@ -216,6 +217,7 @@ static void compute_allocation_table(CELTMode *mode, int res) { celt_int32 num; int den, bits; + int N = (mode->eBands[eband+1]-mode->eBands[eband]); num = alloc * (edge-low); den = high-low; /* Divide with rounding */ @@ -225,6 +227,7 @@ static void compute_allocation_table(CELTMode *mode, int res) allocVectors[i*mode->nbEBands+eband] -= 1<<BITRES; if (allocVectors[i*mode->nbEBands+eband]<0) allocVectors[i*mode->nbEBands+eband]=0; + allocVectors[i*mode->nbEBands+eband] = (2*allocVectors[i*mode->nbEBands+eband]+N)/(2*N); /* Remove the part of the band we just allocated */ low = edge; alloc -= bits; @@ -238,13 +241,23 @@ static void compute_allocation_table(CELTMode *mode, int res) } if (eband < mode->nbEBands) { + int N = (mode->eBands[eband+1]-mode->eBands[eband]); allocVectors[i*mode->nbEBands+eband] = (current+128)>>(8-BITRES); /* Same hack as above FIXME: again */ allocVectors[i*mode->nbEBands+eband] -= 1<<BITRES; if (allocVectors[i*mode->nbEBands+eband]<0) allocVectors[i*mode->nbEBands+eband]=0; + allocVectors[i*mode->nbEBands+eband] = (2*allocVectors[i*mode->nbEBands+eband]+N)/(2*N); } } + /*for (i=0;i<BITALLOC_SIZE;i++) + { + for (j=0;j<mode->nbEBands;j++) + printf ("%d ", allocVectors[i*mode->nbEBands+j]); + printf ("\n"); + } + exit(0);*/ + mode->allocVectors = allocVectors; } diff --git a/libcelt/rate.c b/libcelt/rate.c index 9456b23727c7d71a86edee7a4d0b2f6bd8ddda24..a2b9549bacd4ab9b77929c1188c49181ad215d40 100644 --- a/libcelt/rate.c +++ b/libcelt/rate.c @@ -207,7 +207,8 @@ void compute_allocation(const CELTMode *m, int start, int *offsets, int total, i int mid = (lo+hi) >> 1; for (j=start;j<len;j++) { - bits1[j] = (C*M*m->allocVectors[mid*len+j] + offsets[j]); + int N = m->eBands[j+1]-m->eBands[j]; + bits1[j] = (C*M*N*m->allocVectors[mid*len+j] + offsets[j]); if (bits1[j] < 0) bits1[j] = 0; psum += bits1[j]; @@ -223,8 +224,9 @@ void compute_allocation(const CELTMode *m, int start, int *offsets, int total, i /*printf ("interp between %d and %d\n", lo, hi);*/ for (j=start;j<len;j++) { - bits1[j] = C*M*m->allocVectors[lo*len+j] + offsets[j]; - bits2[j] = C*M*m->allocVectors[hi*len+j] + offsets[j]; + int N = m->eBands[j+1]-m->eBands[j]; + bits1[j] = C*M*N*m->allocVectors[lo*len+j] + offsets[j]; + bits2[j] = C*M*N*m->allocVectors[hi*len+j] + offsets[j]; if (bits1[j] < 0) bits1[j] = 0; if (bits2[j] < 0)