shithub: opus

Download patch

ref: 36e6e01adabc74b79020c1c56292d02ea209d601
parent: 9eba823cf7b8ac52bfde83946436c2f862a7599a
author: Jean-Marc Valin <[email protected]>
date: Sat Aug 2 18:25:19 EDT 2008

Merged compute_allocation_table() and compute_energy_allocation_table()

--- a/libcelt/modes.c
+++ b/libcelt/modes.c
@@ -200,10 +200,13 @@
 static void compute_allocation_table(CELTMode *mode, int res)
 {
    int i, j, eband;
-   celt_int16_t *allocVectors;
-   
+   celt_int16_t *allocVectors, *allocEnergy;
+   const int C = CHANNELS(mode);
+
    mode->nbAllocVectors = BITALLOC_SIZE;
    allocVectors = celt_alloc(sizeof(celt_int16_t)*(BITALLOC_SIZE*mode->nbEBands));
+   allocEnergy = celt_alloc(sizeof(celt_int16_t)*(mode->nbAllocVectors*(mode->nbEBands+1)));
+   /* Compute per-codec-band allocation from per-critical-band matrix */
    for (i=0;i<BITALLOC_SIZE;i++)
    {
       eband = 0;
@@ -213,10 +216,7 @@
          celt_int32_t alloc;
          edge = mode->eBands[eband+1]*res;
          alloc = band_allocation[i*BARK_BANDS+j];
-         if (mode->nbChannels == 2)
-            alloc = alloc*3*mode->mdctSize/512;
-         else
-            alloc = alloc*mode->mdctSize/256;
+         alloc = alloc*C*mode->mdctSize/256;
          if (edge < bark_freq[j+1])
          {
             int num, den;
@@ -231,50 +231,35 @@
          }
       }
    }
-   /*for (i=0;i<BITALLOC_SIZE;i++)
-   {
-      for (j=0;j<mode->nbEBands;j++)
-         printf ("%2d ", allocVectors[i*mode->nbEBands+j]);
-      printf ("\n");
-   }*/
-   mode->allocVectors = allocVectors;
-}
-
-#endif /* STATIC_MODES */
-
-static void compute_energy_allocation_table(CELTMode *mode)
-{
-   int i, j;
-   celt_int16_t *alloc;
-   const int C = CHANNELS(mode);
-   
-   alloc = celt_alloc(sizeof(celt_int16_t)*(mode->nbAllocVectors*(mode->nbEBands+1)));
+   /* Compute fine energy resolution and update the pulse allocation table to subtract that */
    for (i=0;i<mode->nbAllocVectors;i++)
    {
       int sum = 0;
       int min_bits = 1;
-      if (mode->allocVectors[i*mode->nbEBands]>12)
+      if (allocVectors[i*mode->nbEBands]>12)
          min_bits = 2;
-      if (mode->allocVectors[i*mode->nbEBands]>24)
+      if (allocVectors[i*mode->nbEBands]>24)
          min_bits = 3;
       for (j=0;j<mode->nbEBands;j++)
       {
-         alloc[i*(mode->nbEBands+1)+j] = mode->allocVectors[i*mode->nbEBands+j]
+         allocEnergy[i*(mode->nbEBands+1)+j] = allocVectors[i*mode->nbEBands+j]
                                          / (C*(mode->eBands[j+1]-mode->eBands[j]));
-         if (alloc[i*(mode->nbEBands+1)+j]<min_bits)
-            alloc[i*(mode->nbEBands+1)+j] = min_bits;
-         if (alloc[i*(mode->nbEBands+1)+j]>7)
-            alloc[i*(mode->nbEBands+1)+j] = 7;
-         sum += alloc[i*(mode->nbEBands+1)+j];
-         /*printf ("%d ", alloc[i*(mode->nbEBands+1)+j]);*/
-         /*printf ("%f ", mode->allocVectors[i*mode->nbEBands+j]*1.f/(mode->eBands[j+1]-mode->eBands[j]-1));*/
+         if (allocEnergy[i*(mode->nbEBands+1)+j]<min_bits)
+            allocEnergy[i*(mode->nbEBands+1)+j] = min_bits;
+         if (allocEnergy[i*(mode->nbEBands+1)+j]>7)
+            allocEnergy[i*(mode->nbEBands+1)+j] = 7;
+         /* The bits used for fine allocation can't be used for pulses */
+         allocVectors[i*mode->nbEBands+j] -= C*allocEnergy[i*(mode->nbEBands+1)+j];
+         sum += allocEnergy[i*(mode->nbEBands+1)+j];
       }
-      alloc[i*(mode->nbEBands+1)+mode->nbEBands] = sum;
-      /*printf ("\n");*/
+      allocEnergy[i*(mode->nbEBands+1)+mode->nbEBands] = sum;
    }
-   mode->energy_alloc = alloc;
+   mode->energy_alloc = allocEnergy;
+   mode->allocVectors = allocVectors;
 }
 
+#endif /* STATIC_MODES */
+
 CELTMode *celt_mode_create(celt_int32_t Fs, int channels, int frame_size, int *error)
 {
    int i;
@@ -399,7 +384,6 @@
    mode->shortWindow = mode->window;
 
    mode->prob = quant_prob_alloc(mode);
-   compute_energy_allocation_table(mode);
    
    if (mode->nbChannels>=2)
       mode->bits_stereo = (const celt_int16_t **)compute_alloc_cache(mode, mode->nbChannels);