Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/quite/celt.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJean-Marc Valin <jean-marc.valin@usherbrooke.ca>2010-06-03 08:33:42 +0400
committerJean-Marc Valin <jean-marc.valin@usherbrooke.ca>2010-06-03 08:33:42 +0400
commitbb8fa1fca2819ac4b7eb901a765a8854479c0b52 (patch)
tree7b8cfac4a2dd5302987745c3a6c48306d9eaa12f /libcelt
parent6c37fb150c0b316377cd8749449d5ea2c50af16d (diff)
Allocation table now in bits/sample
Diffstat (limited to 'libcelt')
-rw-r--r--libcelt/modes.c17
-rw-r--r--libcelt/rate.c8
2 files changed, 20 insertions, 5 deletions
diff --git a/libcelt/modes.c b/libcelt/modes.c
index c205db4..ff88f58 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 9456b23..a2b9549 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)