Fix for the allocation going negative. (bits[j] >= 0 assert)
authorGregory Maxwell <greg@xiph.org>
Sun, 19 Dec 2010 07:26:56 +0000 (02:26 -0500)
committerJean-Marc Valin <jean-marc.valin@usherbrooke.ca>
Sun, 19 Dec 2010 12:53:03 +0000 (07:53 -0500)
 The modeline-bisection and interpolator have used different criteria
for the minimum coding threshold since the introduction of the
"backwards done" in 405e6a99. This meant that a lower modeline could be
selected which the interpolator was never able to get under the maximum
allocation. This patch makes the modeline selection search use the same
criteria as the interpolator.

libcelt/rate.c

index 514562c..f2d38dd 100644 (file)
@@ -403,23 +403,26 @@ int compute_allocation(const CELTMode *m, int start, int end, const int *offsets
    hi = m->nbAllocVectors - 2;
    do
    {
+      int done = 0;
       int psum = 0;
       int mid = (lo+hi) >> 1;
-      for (j=start;j<end;j++)
+      for (j=end;j-->start;)
       {
          int N = m->eBands[j+1]-m->eBands[j];
          bits1[j] = C*N*m->allocVectors[mid*len+j]<<LM>>2;
          if (bits1[j] > 0)
             bits1[j] = IMAX(0, bits1[j] + trim_offset[j]);
          bits1[j] += offsets[j];
-         if (bits1[j] >= thresh[j])
+         if (bits1[j] >= thresh[j] || done)
+         {
+            done = 1;
+            /* Don't allocate more than we can actually use */
             psum += IMIN(bits1[j], 64*C<<BITRES<<LM);
-         else if (bits1[j] >= C<<BITRES)
-            psum += C<<BITRES;
-
-         /*printf ("%d ", bits[j]);*/
+         } else {
+            if (bits1[j] >= C<<BITRES)
+               psum += C<<BITRES;
+         }
       }
-      /*printf ("\n");*/
       if (psum > total)
          hi = mid - 1;
       else