FFT cleanup
[opus.git] / libcelt / dump_modes.c
index 912fdf4..8c05845 100644 (file)
@@ -1,5 +1,6 @@
-/* (C) 2008 Jean-Marc Valin, CSIRO
-*/
+/* Copyright (c) 2008 CSIRO
+   Copyright (c) 2008-2009 Xiph.Org Foundation
+   Written by Jean-Marc Valin */
 /*
    Redistribution and use in source and binary forms, with or without
    modification, are permitted provided that the following conditions
@@ -36,6 +37,7 @@
 #include <stdio.h>
 #include "modes.h"
 #include "celt.h"
+#include "rate.h"
 
 #define INT16 "%d"
 #define INT32 "%d"
 #endif
 
 
-void dump_modes(FILE *file, CELTMode *modes, int nb_modes)
+void dump_modes(FILE *file, CELTMode **modes, int nb_modes)
 {
-   int i, j;
+   int i, j, k;
+   fprintf(file, "/* The contents of this file is automatically generated and contains static\n");
+   fprintf(file, "   definitions for some pre-defined modes */\n");
+   fprintf(file, "#include \"modes.h\"\n");
+   fprintf(file, "#include \"rate.h\"\n");
+
+   fprintf(file, "\n");
+
    for (i=0;i<nb_modes;i++)
    {
-      fprintf(file, "#include \"modes.h\"\n");
-
-      fprintf(file, "\n");
-      fprintf (file, "const int eBands%d_%d[%d] = {\n", modes->Fs, modes->mdctSize, modes->nbEBands+2);
-      for (j=0;j<modes->nbEBands+2;j++)
-         fprintf (file, "%d, ", modes->eBands[j]);
+      CELTMode *mode = modes[i];
+      int mdctSize;
+      mdctSize = mode->shortMdctSize*mode->nbShortMdcts;
+      fprintf(file, "#ifndef DEF_EBANDS%d_%d\n", mode->Fs, mdctSize);
+      fprintf(file, "#define DEF_EBANDS%d_%d\n", mode->Fs, mdctSize);
+      fprintf (file, "static const celt_int16 eBands%d_%d[%d] = {\n", mode->Fs, mdctSize, mode->nbEBands+2);
+      for (j=0;j<mode->nbEBands+2;j++)
+         fprintf (file, "%d, ", mode->eBands[j]);
       fprintf (file, "};\n");
+      fprintf(file, "#endif\n");
       fprintf(file, "\n");
-      fprintf (file, "const int pBands%d_%d[%d] = {\n", modes->Fs, modes->mdctSize, modes->nbPBands+2);
-      for (j=0;j<modes->nbPBands+2;j++)
-         fprintf (file, "%d, ", modes->pBands[j]);
-      printf ("};\n");
-      fprintf(file, "\n");
-      fprintf (file, "const celt_word16_t window%d[%d] = {\n", modes->overlap, modes->overlap);
-      for (j=0;j<modes->overlap;j++)
-         fprintf (file, WORD16 ", ", modes->window[j]);
-      printf ("};\n");
+      
+      
+      fprintf(file, "#ifndef DEF_WINDOW%d\n", mode->overlap);
+      fprintf(file, "#define DEF_WINDOW%d\n", mode->overlap);
+      fprintf (file, "static const celt_word16 window%d[%d] = {\n", mode->overlap, mode->overlap);
+      for (j=0;j<mode->overlap;j++)
+         fprintf (file, WORD16 ", ", mode->window[j]);
+      fprintf (file, "};\n");
+      fprintf(file, "#endif\n");
       fprintf(file, "\n");
-      fprintf (file, "const int allocVectors%d_%d[%d] = {\n", modes->Fs, modes->mdctSize, modes->nbEBands*modes->nbAllocVectors);
-      for (j=0;j<modes->nbAllocVectors;j++)
+      
+      fprintf(file, "#ifndef DEF_ALLOC_VECTORS%d_%d\n", mode->Fs, mdctSize);
+      fprintf(file, "#define DEF_ALLOC_VECTORS%d_%d\n", mode->Fs, mdctSize);
+      fprintf (file, "static const unsigned char allocVectors%d_%d[%d] = {\n", mode->Fs, mdctSize, mode->nbEBands*mode->nbAllocVectors);
+      for (j=0;j<mode->nbAllocVectors;j++)
       {
-         int k;
-         for (k=0;k<modes->nbEBands;k++)
-            fprintf (file, "%2d, ", modes->allocVectors[j*modes->nbEBands+k]);
+         for (k=0;k<mode->nbEBands;k++)
+            fprintf (file, "%2d, ", mode->allocVectors[j*mode->nbEBands+k]);
          fprintf (file, "\n");
       }
       fprintf (file, "};\n");
+      fprintf(file, "#endif\n");
       fprintf(file, "\n");
-      fprintf(file, "CELTMode mode%d_%d_%d_%d = {\n", modes->Fs, modes->nbChannels, modes->mdctSize, modes->overlap);
+
+      fprintf(file, "#ifndef DEF_LOGN%d_%d\n", mode->Fs, mdctSize);
+      fprintf(file, "#define DEF_LOGN%d_%d\n", mode->Fs, mdctSize);
+      fprintf (file, "static const celt_int16 logN%d_%d[%d] = {\n", mode->Fs, 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");
+
+      /* Pulse cache */
+      fprintf(file, "#ifndef DEF_PULSE_CACHE%d_%d\n", mode->Fs, mdctSize);
+      fprintf(file, "#define DEF_PULSE_CACHE%d_%d\n", mode->Fs, mdctSize);
+      fprintf (file, "static const celt_int16 cache_index%d_%d[%d] = {\n", mode->Fs, mdctSize, (mode->maxLM+2)*mode->nbEBands);
+      for (j=0;j<mode->nbEBands*(mode->maxLM+2);j++)
+         fprintf (file, "%d, ", mode->cache.index[j]);
+      fprintf (file, "};\n");
+      fprintf (file, "static const unsigned char cache_bits%d_%d[%d] = {\n", mode->Fs, mdctSize, mode->cache.size);
+      for (j=0;j<mode->cache.size;j++)
+         fprintf (file, "%d, ", mode->cache.bits[j]);
+      fprintf (file, "};\n");
+      fprintf(file, "#endif\n");
+      fprintf(file, "\n");
+
+      /* FFTs */
+      /*
+      for (i=0;i<mode->mdct.maxshift;i++)
+      {
+         fprintf(file, "#ifndef FFT_BITREV%d_%d\n", mode->Fs, mdctSize>>i);
+         fprintf(file, "#define FFT_BITREV%d_%d\n", mode->Fs, mdctSize>>i);
+         fprintf (file, "static const celt_int16 fft_bitrev%d_%d[%d] = {\n",
+               mode->Fs, mdctSize/i, mode->mdct.kfft[i]->nfft);
+         for (j=0;j<mode->mdct.kfft[i]->nfft;j++)
+            fprintf (file, "%d, ", mode->mdct.kfft[i]->bitrev[j]);
+         fprintf (file, "};\n");
+
+         fprintf(file, "#endif\n");
+         fprintf(file, "\n");
+      }
+      */
+
+      /* Print the actual mode data */
+      fprintf(file, "static const CELTMode mode%d_%d_%d = {\n", mode->Fs, mdctSize, mode->overlap);
       fprintf(file, "0x%x,\t/* marker */\n", 0xa110ca7e);
-      fprintf(file, INT32 ",\t/* Fs */\n", modes->Fs);
-      fprintf(file, "%d,\t/* overlap */\n", modes->overlap);
-      fprintf(file, "%d,\t/* mdctSize */\n", modes->mdctSize);
-      fprintf(file, "%d,\t/* nbMdctBlocks */\n", modes->nbMdctBlocks);
-      fprintf(file, "%d,\t/* nbChannels */\n", modes->nbChannels);
-      fprintf(file, "%d,\t/* nbEBands */\n", modes->nbEBands);
-      fprintf(file, "%d,\t/* nbPBands */\n", modes->nbPBands);
-      fprintf(file, "%d,\t/* pitchEnd */\n", modes->pitchEnd);
-      fprintf(file, "eBands%d_%d,\t/* eBands */\n", modes->Fs, modes->mdctSize);
-      fprintf(file, "pBands%d_%d,\t/* pBands */\n", modes->Fs, modes->mdctSize);
-      fprintf(file, WORD16 ",\t/* ePredCoef */\n", modes->ePredCoef);
-      fprintf(file, "%d,\t/* nbAllocVectors */\n", modes->nbAllocVectors);
-      fprintf(file, "allocVectors%d_%d,\t/* allocVectors */\n", modes->Fs, modes->mdctSize);
-      fprintf(file, "0,\t/* bits */\n");
-      fprintf(file, "{%d, 0, 0},\t/* mdct */\n", 2*modes->mdctSize);
-      fprintf(file, "window%d,\t/* window */\n", modes->overlap);
+      fprintf(file, INT32 ",\t/* Fs */\n", mode->Fs);
+      fprintf(file, "%d,\t/* overlap */\n", mode->overlap);
+      fprintf(file, "%d,\t/* nbEBands */\n", mode->nbEBands);
+      fprintf(file, "%d,\t/* effEBands */\n", mode->effEBands);
+      fprintf(file, "{");
+      for (j=0;j<4;j++)
+         fprintf(file, WORD16 ", ", mode->preemph[j]);
+      fprintf(file, "},\t/* preemph */\n");
+      fprintf(file, "eBands%d_%d,\t/* eBands */\n", mode->Fs, mdctSize);
+      fprintf(file, "%d,\t/* nbAllocVectors */\n", mode->nbAllocVectors);
+      fprintf(file, "allocVectors%d_%d,\t/* allocVectors */\n", mode->Fs, mdctSize);
+
+      fprintf(file, "{%d, %d, 0, 0},\t", mode->mdct.n, mode->mdct.maxshift);
+      fprintf (file, "/* mdct */\n");
+
+      fprintf(file, "window%d,\t/* window */\n", mode->overlap);
+      fprintf(file, "%d,\t/* maxLM */\n", mode->maxLM);
+      fprintf(file, "%d,\t/* nbShortMdcts */\n", mode->nbShortMdcts);
+      fprintf(file, "%d,\t/* shortMdctSize */\n", mode->shortMdctSize);
+      fprintf(file, "0,\t/* prob */\n");
+      fprintf(file, "logN%d_%d,\t/* logN */\n", mode->Fs, mdctSize);
+      fprintf(file, "{%d, cache_index%d_%d, cache_bits%d_%d},\t/* cache */\n",
+            mode->cache.size, mode->Fs, mdctSize, mode->Fs, mdctSize);
       fprintf(file, "0x%x,\t/* marker */\n", 0xa110ca7e);
       fprintf(file, "};\n");
-      modes++;
+   }
+   fprintf(file, "\n");
+   fprintf(file, "/* List of all the available modes */\n");
+   fprintf(file, "#define TOTAL_MODES %d\n", nb_modes);
+   fprintf(file, "static const CELTMode * const static_mode_list[TOTAL_MODES] = {\n");
+   for (i=0;i<nb_modes;i++)
+   {
+      CELTMode *mode = modes[i];
+      int mdctSize;
+      mdctSize = mode->shortMdctSize*mode->nbShortMdcts;
+      fprintf(file, "&mode%d_%d_%d,\n", mode->Fs, mdctSize, mode->overlap);
+   }
+   fprintf(file, "};\n");
+}
+
+void dump_header(FILE *file, CELTMode **modes, int nb_modes)
+{
+   int i;
+   int channels = 0;
+   int frame_size = 0;
+   int overlap = 0;
+   fprintf (file, "/* This header file is generated automatically*/\n");
+   for (i=0;i<nb_modes;i++)
+   {
+      CELTMode *mode = modes[i];
+      if (frame_size==0)
+         frame_size = mode->shortMdctSize*mode->nbShortMdcts;
+      else if (frame_size != mode->shortMdctSize*mode->nbShortMdcts)
+         frame_size = -1;
+      if (overlap==0)
+         overlap = mode->overlap;
+      else if (overlap != mode->overlap)
+         overlap = -1;
+   }
+   if (channels>0)
+   {
+      fprintf (file, "#define CHANNELS(mode) %d\n", channels);
+      if (channels==1)
+         fprintf (file, "#define DISABLE_STEREO\n");
+   }
+   if (frame_size>0)
+   {
+      fprintf (file, "#define FRAMESIZE(mode) %d\n", frame_size);
+   }
+   if (overlap>0)
+   {
+      fprintf (file, "#define OVERLAP(mode) %d\n", overlap);
    }
 }
 
-#if 1
-int main()
+int main(int argc, char **argv)
 {
-   CELTMode *m = celt_mode_create(44100, 1, 256, 128, NULL);
-   dump_modes(stdout, m, 1);
+   int i, nb;
+   FILE *file;
+   CELTMode **m;
+   if (argc%2 != 1)
+   {
+      fprintf (stderr, "must have a multiple of 2 arguments\n");
+      return 1;
+   }
+   nb = (argc-1)/2;
+   m = malloc(nb*sizeof(CELTMode*));
+   for (i=0;i<nb;i++)
+   {
+      int Fs, frame;
+      Fs      = atoi(argv[2*i+1]);
+      frame   = atoi(argv[2*i+2]);
+      m[i] = celt_mode_create(Fs, frame, NULL);
+   }
+   file = fopen("static_modes.c", "w");
+   dump_modes(file, m, nb);
+   fclose(file);
+   file = fopen("static_modes.h", "w");
+   dump_header(file, m, nb);
+   fclose(file);
+   for (i=0;i<nb;i++)
+      celt_mode_destroy(m[i]);
+   free(m);
    return 0;
 }
-#endif