Re-enabled intra-frame prediction, which seems to have exposed a few issues
authorJean-Marc Valin <jean-marc.valin@usherbrooke.ca>
Thu, 7 Feb 2008 10:14:16 +0000 (21:14 +1100)
committerJean-Marc Valin <jean-marc.valin@usherbrooke.ca>
Thu, 7 Feb 2008 10:14:16 +0000 (21:14 +1100)
with the entropy coder.

libcelt/bands.c
libcelt/celt.c
libcelt/rate.c
libcelt/testcelt.c

index f637546..599e7fb 100644 (file)
@@ -257,12 +257,11 @@ void quant_bands(const CELTMode *m, float *X, float *P, float *W, struct alloc_d
       //q = m->nbPulses[i];
       n = sqrt(B*(eBands[i+1]-eBands[i]));
       theta = .007*(B*(eBands[i+1]-eBands[i]))/(.1f+abs(q));
-         
-      if (q<=0) {
-         q = -q;
+
+      /* If pitch isn't available, use intra-frame prediction */
+      if (eBands[i] >= m->pitchEnd)
          intra_prediction(X+B*eBands[i], W+B*eBands[i], B*(eBands[i+1]-eBands[i]), q, norm, P+B*eBands[i], B, eBands[i], enc);
-      }
-         
+
       if (q != 0)
       {
          exp_rotation(P+B*eBands[i], B*(eBands[i+1]-eBands[i]), theta, -1, B, 8);
@@ -305,10 +304,9 @@ void unquant_bands(const CELTMode *m, float *X, float *P, struct alloc_data *all
       n = sqrt(B*(eBands[i+1]-eBands[i]));
       theta = .007*(B*(eBands[i+1]-eBands[i]))/(.1f+abs(q));
 
-      if (q<=0) {
-         q = -q;
+      /* If pitch isn't available, use intra-frame prediction */
+      if (eBands[i] >= m->pitchEnd)
          intra_unquant(X+B*eBands[i], B*(eBands[i+1]-eBands[i]), q, norm, P+B*eBands[i], B, eBands[i], dec);
-      }
 
       if (q != 0)
       {
index 58f7a9b..804782e 100644 (file)
@@ -349,6 +349,7 @@ int celt_encode(CELTEncoder *st, celt_int16_t *pcm, unsigned char *compressed, i
             celt_warning("got too many bytes");
          else
             celt_warning("not enough bytes");
+         celt_warning_int ("output bytes:", nbBytes);
          return CELT_INTERNAL_ERROR;
       }
       //printf ("%d\n", *nbBytes);
index 9594417..0b1d888 100644 (file)
@@ -108,7 +108,7 @@ void alloc_init(struct alloc_data *alloc, const CELTMode *m)
    for (i=0;i<alloc->len;i++)
    {
       int N = BC*(eBands[i+1]-eBands[i]);
-      if (N == prevN)
+      if (N == prevN && eBands[i] < m->pitchEnd)
       {
          alloc->bits[i] = alloc->bits[i-1];
       } else {
@@ -117,9 +117,16 @@ void alloc_init(struct alloc_data *alloc, const CELTMode *m)
          alloc->bits[i] = celt_alloc(MAX_PULSES*sizeof(int));
          for (j=0;j<MAX_PULSES;j++)
          {
+            int done = 0;
             alloc->bits[i][j] = log2_frac64(ncwrs64(N, j),BITRES);
-            /* We could just update rev_bits here */
+            /* FIXME: Could there be a better test for the max number of pulses that fit in 64 bits? */
             if (alloc->bits[i][j] > (60<<BITRES))
+               done = 1;
+            /* Add the intra-frame prediction bits */
+            if (eBands[i] >= m->pitchEnd)
+               alloc->bits[i][j] += (1<<BITRES) + log2_frac64(2*eBands[i]-eBands[i+1],BITRES);
+            /* We could just update rev_bits here */
+            if (done)
                break;
          }
          for (;j<MAX_PULSES;j++)
index 8e16ae7..d552a9b 100644 (file)
@@ -66,9 +66,9 @@ int main(int argc, char *argv[])
    }
    
    bytes_per_packet = atoi(argv[2]);
-   if (bytes_per_packet < 25 || bytes_per_packet > 120)
+   if (bytes_per_packet < 20 || bytes_per_packet > 120)
    {
-      fprintf (stderr, "bytes per packet must be between 25 and 120\n");
+      fprintf (stderr, "bytes per packet must be between 20 and 120\n");
       return 1;
    }
    inFile = argv[3];