Caching log2_frac(N, BITRES) in the more data to save some CPU
authorJean-Marc Valin <jean-marc.valin@usherbrooke.ca>
Tue, 6 Apr 2010 03:58:44 +0000 (23:58 -0400)
committerJean-Marc Valin <jean-marc.valin@usherbrooke.ca>
Wed, 7 Apr 2010 00:33:50 +0000 (20:33 -0400)
libcelt/dump_modes.c
libcelt/modes.c
libcelt/modes.h
libcelt/rate.c

index 25dc651..b9bcd90 100644 (file)
@@ -121,6 +121,14 @@ void dump_modes(FILE *file, CELTMode **modes, int nb_modes)
       fprintf(file, "#endif\n");
       fprintf(file, "\n");
 
+      fprintf(file, "#ifndef DEF_LOGN%d_%d\n", mode->Fs, mode->mdctSize);
+      fprintf(file, "#define DEF_LOGN%d_%d\n", mode->Fs, mode->mdctSize);
+      fprintf (file, "static const celt_int16 logN%d_%d[%d] = {\n", mode->Fs, mode->mdctSize, mode->nbEBands);
+      for (j=0;j<mode->nbEBands;j++)
+         fprintf (file, "%d, ", mode->logN[j]);
+      fprintf (file, "};\n");
+      fprintf(file, "#endif\n");
+      fprintf(file, "\n");
 
       fprintf(file, "static const CELTMode mode%d_%d_%d = {\n", mode->Fs, mode->mdctSize, mode->overlap);
       fprintf(file, "0x%x,\t/* marker */\n", 0xa110ca7e);
@@ -141,6 +149,7 @@ void dump_modes(FILE *file, CELTMode **modes, int nb_modes)
       fprintf(file, "{%d, 0, 0},\t/* shortMdct */\n", 2*mode->mdctSize);
       fprintf(file, "window%d,\t/* shortWindow */\n", mode->overlap);
       fprintf(file, "0,\t/* prob */\n");
+      fprintf(file, "logN%d_%d,\t/* logN */\n", mode->Fs, mode->mdctSize);
       fprintf(file, "0x%x,\t/* marker */\n", 0xa110ca7e);
       fprintf(file, "};\n");
    }
index 87f122f..3358b65 100644 (file)
@@ -273,6 +273,7 @@ CELTMode *celt_mode_create(celt_int32 Fs, int frame_size, int *error)
    int res;
    CELTMode *mode=NULL;
    celt_word16 *window;
+   celt_int16 *logN;
    ALLOC_STACK;
 #if !defined(VAR_ARRAYS) && !defined(USE_ALLOCA)
    if (global_stack==NULL)
@@ -367,6 +368,13 @@ CELTMode *celt_mode_create(celt_int32 Fs, int frame_size, int *error)
    if (mode->bits==NULL)
       goto failure;
 
+   logN = (celt_int16*)celt_alloc(mode->nbEBands*sizeof(celt_int16));
+   if (logN==NULL)
+      goto failure;
+
+   for (i=0;i<mode->nbEBands;i++)
+      logN[i] = log2_frac(mode->eBands[i+1]-mode->eBands[i], BITRES);
+   mode->logN = logN;
 #endif /* !STATIC_MODES */
 
    clt_mdct_init(&mode->mdct, 2*mode->mdctSize);
index 1ab72f8..a995ee0 100644 (file)
@@ -106,6 +106,7 @@ struct CELTMode {
    const celt_word16 *shortWindow;
 
    int *prob;
+   const celt_int16 *logN;
    celt_uint32 marker_end;
 };
 
index 2ae1ebc..762aeba 100644 (file)
@@ -148,7 +148,7 @@ static inline void interp_bits2pulses(const CELTMode *m, int start, int *bits1,
       N=m->eBands[j+1]-m->eBands[j]; 
       /* Compensate for the extra DoF in stereo */
       d=(C*N+ ((C==2 && N>2) ? 1 : 0))<<BITRES; 
-      offset = FINE_OFFSET - log2_frac(N, BITRES);
+      offset = FINE_OFFSET - m->logN[j];
       /* Offset for the number of fine bits compared to their "fair share" of total/N */
       offset = bits[j]-offset*N*C;
       /* Compensate for the prediction gain in stereo */