From ec836da27cc2f36435c8dcd7ef57acb26a4d54c6 Mon Sep 17 00:00:00 2001 From: Gregory Maxwell Date: Mon, 4 May 2009 14:55:40 -0400 Subject: [PATCH] Reduce rounding in the mode allocator and remove a scaling loop. This breaks the bitstream. --- libcelt/modes.c | 27 ++++++++++----------------- 1 file changed, 10 insertions(+), 17 deletions(-) diff --git a/libcelt/modes.c b/libcelt/modes.c index 9de9004e..b48816af 100644 --- a/libcelt/modes.c +++ b/libcelt/modes.c @@ -206,7 +206,7 @@ static void compute_pbands(CELTMode *mode, int res) 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,38 +221,31 @@ static void compute_allocation_table(CELTMode *mode, int res) /* Compute per-codec-band allocation from per-critical-band matrix */ for (i=0;ieBands[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; 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;inbAllocVectors;i++) - { - for (j=0;jnbEBands;j++) - allocVectors[i*mode->nbEBands+j] = (allocVectors[i*mode->nbEBands+j]+32)/64; - } - /*for (i=0;inbAllocVectors;i++) - { - for (j=0;jnbEBands;j++) - allocVectors[i*mode->nbEBands+j] += C; - }*/ mode->allocVectors = allocVectors; }