From 12e851dad77ca8134454205da84631dfd8615023 Mon Sep 17 00:00:00 2001 From: Jean-Marc Valin Date: Thu, 3 Jun 2010 08:12:11 -0400 Subject: Using allocation table for "standard" frame sizes --- libcelt/modes.c | 35 ++++++++++++++++++++++++++++++----- 1 file changed, 30 insertions(+), 5 deletions(-) diff --git a/libcelt/modes.c b/libcelt/modes.c index ff88f58..ab745e3 100644 --- a/libcelt/modes.c +++ b/libcelt/modes.c @@ -114,7 +114,24 @@ static const unsigned char band_allocation[BARK_BANDS*BITALLOC_SIZE] = }; #endif -static const celt_int16 eband5ms[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 20, 24, 28, 34, 40, 48, 60, 78, 100}; +static const celt_int16 eband5ms[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 20, 24, 28, 34, 40, 48, 60, 78, 100 +}; + +static const celt_int16 alloc_5ms[] = { + 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 10, 3, 8, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 10, 6, 8, 6, 5, 4, 3, 2, 7, 10, 11, 9, 7, 3, 1, 0, 0, 0, 0, 0, 0, + 10, 10, 14, 11, 10, 8, 6, 5, 10, 12, 13, 11, 8, 4, 2, 1, 0, 0, 0, 0, 0, + 13, 10, 17, 16, 14, 12, 10, 8, 12, 14, 14, 12, 9, 5, 3, 2, 2, 1, 0, 0, 0, + 17, 21, 23, 26, 24, 20, 17, 16, 17, 18, 16, 14, 11, 6, 3, 2, 2, 1, 1, 0, 0, + 21, 21, 36, 32, 28, 24, 23, 23, 22, 18, 18, 14, 11, 7, 5, 5, 5, 3, 3, 0, 0, + 31, 35, 40, 32, 30, 28, 26, 26, 25, 24, 19, 15, 15, 13, 9, 9, 8, 7, 5, 2, 0, + 42, 46, 46, 37, 35, 34, 33, 32, 34, 35, 32, 31, 27, 24, 23, 23, 18, 14, 11, 7, 0, + 46, 49, 46, 46, 42, 43, 44, 47, 50, 52, 51, 48, 39, 32, 27, 24, 22, 19, 17, 11, 5, + 53, 53, 49, 48, 55, 66, 71, 71, 71, 65, 64, 64, 56, 47, 41, 37, 31, 24, 20, 16, 10, + 60, 64, 74, 74, 87,103,106,102,101,100,101, 95, 80, 69, 63, 55, 47, 36, 26, 21, 15, +}; static celt_int16 *compute_ebands(celt_int32 Fs, int frame_size, int res, int *nbEBands) { @@ -188,15 +205,23 @@ static void compute_allocation_table(CELTMode *mode, int res) int i, j, nBark; celt_int16 *allocVectors; + mode->nbAllocVectors = BITALLOC_SIZE; + allocVectors = celt_alloc(sizeof(celt_int16)*(BITALLOC_SIZE*mode->nbEBands)); + if (allocVectors==NULL) + return; + + if (mode->Fs == 400*(celt_int32)mode->shortMdctSize && mode->Fs >= 40000) + { + for (i=0;inbEBands;i++) + allocVectors[i] = alloc_5ms[i]; + mode->allocVectors = allocVectors; + return; + } /* Find the number of critical bands supported by our sampling rate */ for (nBark=1;nBark= mode->Fs) break; - mode->nbAllocVectors = BITALLOC_SIZE; - allocVectors = celt_alloc(sizeof(celt_int16)*(BITALLOC_SIZE*mode->nbEBands)); - if (allocVectors==NULL) - return; /* Compute per-codec-band allocation from per-critical-band matrix */ for (i=0;i