shithub: opus

Download patch

ref: 5588d52e9468f8e6c97c8471cbf3e6d8304e24e3
parent: 680a9ec54be1463d92aa6cb25f38314dfc7cf8ce
author: Jean-Marc Valin <[email protected]>
date: Mon Mar 10 11:07:58 EDT 2008

Psychoacoustic decay coefficients can now be included in the static modes

--- a/libcelt/dump_modes.c
+++ b/libcelt/dump_modes.c
@@ -88,6 +88,15 @@
       fprintf(file, "#endif\n");
       fprintf(file, "\n");
       
+      fprintf(file, "#ifndef DEF_PSY%d\n", mode->Fs);
+      fprintf(file, "#define DEF_PSY%d\n", mode->Fs);
+      fprintf (file, "const celt_word16_t psy_decayR_%d[%d] = {\n", mode->Fs, MAX_PERIOD/2);
+      for (j=0;j<MAX_PERIOD/2;j++)
+         fprintf (file, WORD16 ", ", mode->psy.decayR[j]);
+      printf ("};\n");
+      fprintf(file, "#endif\n");
+      fprintf(file, "\n");
+
       
       fprintf(file, "#ifndef DEF_ALLOC_VECTORS%d_%d\n", mode->Fs, mode->mdctSize);
       fprintf(file, "#define DEF_ALLOC_VECTORS%d_%d\n", mode->Fs, mode->mdctSize);
@@ -122,7 +131,7 @@
       fprintf(file, "0,\t/* bits */\n");
       fprintf(file, "{%d, 0, 0},\t/* mdct */\n", 2*mode->mdctSize);
       fprintf(file, "window%d,\t/* window */\n", mode->overlap);
-      fprintf(file, "{0},\t/* psy */\n");
+      fprintf(file, "{psy_decayR_%d},\t/* psy */\n", mode->Fs);
       fprintf(file, "0x%x,\t/* marker */\n", 0xa110ca7e);
       fprintf(file, "};\n");
    }
--- a/libcelt/modes.c
+++ b/libcelt/modes.c
@@ -69,6 +69,8 @@
    return CELT_OK;
 }
 
+#ifndef STATIC_MODES
+
 #define PBANDS 8
 #define MIN_BINS 4
 /* Defining 25 critical bands for the full 0-20 kHz audio bandwidth
@@ -101,7 +103,7 @@
    };
 
 
-   static int *compute_ebands(celt_int32_t Fs, int frame_size, int *nbEBands)
+static int *compute_ebands(celt_int32_t Fs, int frame_size, int *nbEBands)
 {
    int *eBands;
    int i, res, min_width, lin, low, high;
@@ -215,8 +217,8 @@
    mode->allocVectors = allocVectors;
 }
 
+#endif /* STATIC_MODES */
 
-
 CELTMode *celt_mode_create(celt_int32_t Fs, int channels, int frame_size, int lookahead, int *error)
 {
 #ifdef STATIC_MODES
@@ -302,12 +304,13 @@
 #endif
    mode->window = window;
 
+   psydecay_init(&mode->psy, MAX_PERIOD/2, mode->Fs);
+
    mode->marker_start = MODEVALID;
    mode->marker_end = MODEVALID;
 #endif
    mdct_init(&mode->mdct, 2*mode->mdctSize);
    compute_alloc_cache(mode);
-   psydecay_init(&mode->psy, MAX_PERIOD/2, mode->Fs);
    if (error)
       *error = CELT_OK;
    return mode;
@@ -315,6 +318,7 @@
 
 void celt_mode_destroy(CELTMode *mode)
 {
+#ifndef STATIC_MODES
    int i;
    const int *prevPtr = NULL;
    for (i=0;i<mode->nbEBands;i++)
@@ -327,8 +331,6 @@
    }
    celt_free((int**)mode->bits);
    mdct_clear(&mode->mdct);
-   psydecay_clear(&mode->psy);
-#ifndef STATIC_MODES
    if (check_mode(mode) != CELT_OK)
       return;
    celt_free((int*)mode->eBands);
@@ -340,6 +342,7 @@
    mode->marker_start = MODEFREED;
    mode->marker_end = MODEFREED;
    celt_free((CELTMode *)mode);
+   psydecay_clear(&mode->psy);
 #endif
 }
 
--- a/libcelt/psy.c
+++ b/libcelt/psy.c
@@ -42,7 +42,7 @@
 #define toBARK(n)   (13.1f*atan(.00074f*(n))+2.24f*atan((n)*(n)*1.85e-8f)+1e-4f*(n))
 #define fromBARK(z) (102.f*(z)-2.f*pow(z,2.f)+.4f*pow(z,3.f)+pow(1.46f,z)-1.f)
 
-
+#ifndef STATIC_MODES
 /* Psychoacoustic spreading function. The idea here is compute a first order 
    recursive filter. The filter coefficient is frequency dependent and 
    chosen such that we have a -10dB/Bark slope on the right side and a -25dB/Bark
@@ -69,6 +69,7 @@
       /*printf ("%f %f\n", decayL[i], decayR[i]);*/
    }
 }
+#endif
 
 void psydecay_clear(struct PsyDecay *decay)
 {
--- a/libcelt/testcelt.c
+++ b/libcelt/testcelt.c
@@ -54,7 +54,9 @@
    int bytes_per_packet;
    unsigned char data[1024];
    int rate, overlap;
+#if !(defined (FIXED_POINT) && defined(STATIC_MODES))
    double rmsd = 0;
+#endif
    int count = 0;
    int skip;
    celt_int16_t *in, *out;
@@ -129,11 +131,13 @@
       for (i=0;i<frame_size*channels;i++)
          out[i] = in[i];
 #endif
+#if !(defined (FIXED_POINT) && defined(STATIC_MODES))
       for (i=0;i<frame_size*channels;i++)
       {
          rmsd += (in[i]-out[i])*1.0*(in[i]-out[i]);
          /*out[i] -= in[i];*/
       }
+#endif
       count++;
       fwrite(out, sizeof(short), (frame_size-skip)*channels, fout);
       skip = 0;
@@ -143,6 +147,7 @@
    celt_decoder_destroy(dec);
    fclose(fin);
    fclose(fout);
+#if !(defined (FIXED_POINT) && defined(STATIC_MODES))
    if (rmsd > 0)
    {
       rmsd = sqrt(rmsd/(1.0*frame_size*channels*count));
@@ -152,6 +157,7 @@
    } else {
       fprintf (stderr, "Encoder matches decoder!!\n");
    }
+#endif
    celt_mode_destroy(mode);
    celt_free(in);
    celt_free(out);