Don't allow empty eBands.
authorTimothy B. Terriberry <tterribe@xiph.org>
Tue, 1 Feb 2011 20:32:34 +0000 (12:32 -0800)
committerJean-Marc Valin <jean-marc.valin@octasic.com>
Tue, 1 Feb 2011 22:06:28 +0000 (17:06 -0500)
Currently compute_ebands()'s attempts to round bands to even sizes
 and enforce size constraints on consecutive bands can leave some
 bands entirely empty (e.g., Fs=8000, frame_size=64, i=11).
This adds a simple post-processing loop to remove such bands.

libcelt/modes.c

index 67326b6..c5302b7 100644 (file)
@@ -133,7 +133,7 @@ static const celt_int16 bark_freq[BARK_BANDS+1] = {
 static celt_int16 *compute_ebands(celt_int32 Fs, int frame_size, int res, int *nbEBands)
 {
    celt_int16 *eBands;
-   int i, lin, low, high, nBark, offset=0;
+   int i, j, lin, low, high, nBark, offset=0;
 
    /* All modes that have 2.5 ms short blocks use the same definition */
    if (Fs == 400*(celt_int32)frame_size)
@@ -190,6 +190,12 @@ static celt_int16 *compute_ebands(celt_int32 Fs, int frame_size, int res, int *n
          eBands[i] -= (2*eBands[i]-eBands[i-1]-eBands[i+1])/2;
       }
    }
+   /* Remove any empty bands. */
+   for (i=j=0;i<*nbEBands;i++)
+      if(eBands[i+1]>eBands[j])
+         eBands[++j]=eBands[i+1];
+   *nbEBands=j;
+
    /*for (i=0;i<=*nbEBands+1;i++)
       printf ("%d ", eBands[i]);
    printf ("\n");