Giving less bits to single-bin bands.
authorJean-Marc Valin <jean-marc.valin@octasic.com>
Fri, 17 Dec 2010 19:17:27 +0000 (14:17 -0500)
committerJean-Marc Valin <jean-marc.valin@octasic.com>
Fri, 17 Dec 2010 19:17:27 +0000 (14:17 -0500)
This improves the allocation for 2.5 ms frames.

libcelt/rate.c

index ba9b8cf..702378a 100644 (file)
@@ -387,14 +387,18 @@ int compute_allocation(const CELTMode *m, int start, int end, const int *offsets
    ALLOC(thresh, len, int);
    ALLOC(trim_offset, len, int);
 
-   /* Below this threshold, we're sure not to allocate any PVQ bits */
    for (j=start;j<end;j++)
+   {
+      /* Below this threshold, we're sure not to allocate any PVQ bits */
       thresh[j] = IMAX((C)<<BITRES, (3*(m->eBands[j+1]-m->eBands[j])<<LM<<BITRES)>>4);
-   /* Tilt of the allocation curve */
-   for (j=start;j<end;j++)
+      /* Tilt of the allocation curve */
       trim_offset[j] = C*(m->eBands[j+1]-m->eBands[j])*(alloc_trim-5-LM)*(m->nbEBands-j-1)
             <<(LM+BITRES)>>6;
-
+      /* Giving less resolution to single-coefficient bands because they get
+         more benefit from having one coarse value per coefficient*/
+      if ((m->eBands[j+1]-m->eBands[j])<<LM==1)
+         trim_offset[j] -= C<<BITRES;
+   }
    lo = 1;
    hi = m->nbAllocVectors - 2;
    do