Blame libcelt/dump_modes.c

Packit 664db3
/* (C) 2008 Jean-Marc Valin, CSIRO
Packit 664db3
*/
Packit 664db3
/*
Packit 664db3
   Redistribution and use in source and binary forms, with or without
Packit 664db3
   modification, are permitted provided that the following conditions
Packit 664db3
   are met:
Packit 664db3
   
Packit 664db3
   - Redistributions of source code must retain the above copyright
Packit 664db3
   notice, this list of conditions and the following disclaimer.
Packit 664db3
   
Packit 664db3
   - Redistributions in binary form must reproduce the above copyright
Packit 664db3
   notice, this list of conditions and the following disclaimer in the
Packit 664db3
   documentation and/or other materials provided with the distribution.
Packit 664db3
   
Packit 664db3
   - Neither the name of the Xiph.org Foundation nor the names of its
Packit 664db3
   contributors may be used to endorse or promote products derived from
Packit 664db3
   this software without specific prior written permission.
Packit 664db3
   
Packit 664db3
   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
Packit 664db3
   ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
Packit 664db3
   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
Packit 664db3
   A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR
Packit 664db3
   CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
Packit 664db3
   EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
Packit 664db3
   PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
Packit 664db3
   PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
Packit 664db3
   LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
Packit 664db3
   NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
Packit 664db3
   SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Packit 664db3
*/
Packit 664db3
Packit 664db3
#ifdef HAVE_CONFIG_H
Packit 664db3
#include "config.h"
Packit 664db3
#endif
Packit 664db3
Packit 664db3
#include <stdio.h>
Packit 664db3
#include "modes.h"
Packit 664db3
#include "celt.h"
Packit 664db3
#include "rate.h"
Packit 664db3
Packit 664db3
#define INT16 "%d"
Packit 664db3
#define INT32 "%d"
Packit 664db3
#define FLOAT "%f"
Packit 664db3
Packit 664db3
#ifdef FIXED_POINT
Packit 664db3
#define WORD16 INT16
Packit 664db3
#define WORD32 INT32
Packit 664db3
#else
Packit 664db3
#define WORD16 FLOAT
Packit 664db3
#define WORD32 FLOAT
Packit 664db3
#endif
Packit 664db3
Packit 664db3
Packit 664db3
void dump_modes(FILE *file, CELTMode **modes, int nb_modes)
Packit 664db3
{
Packit 664db3
   int i, j;
Packit 664db3
   fprintf(file, "/* The contents of this file is automatically generated and contains static\n");
Packit 664db3
   fprintf(file, "   definitions for some pre-defined modes */\n");
Packit 664db3
   fprintf(file, "#include \"modes.h\"\n");
Packit 664db3
   fprintf(file, "#include \"rate.h\"\n");
Packit 664db3
Packit 664db3
   fprintf(file, "\n");
Packit 664db3
   for (i=0;i
Packit 664db3
   {
Packit 664db3
      CELTMode *mode = modes[i];
Packit 664db3
      fprintf(file, "#ifndef DEF_EBANDS%d_%d\n", mode->Fs, mode->mdctSize);
Packit 664db3
      fprintf(file, "#define DEF_EBANDS%d_%d\n", mode->Fs, mode->mdctSize);
Packit 664db3
      fprintf (file, "static const celt_int16_t eBands%d_%d[%d] = {\n", mode->Fs, mode->mdctSize, mode->nbEBands+2);
Packit 664db3
      for (j=0;j<mode->nbEBands+2;j++)
Packit 664db3
         fprintf (file, "%d, ", mode->eBands[j]);
Packit 664db3
      fprintf (file, "};\n");
Packit 664db3
      fprintf(file, "#endif\n");
Packit 664db3
      fprintf(file, "\n");
Packit 664db3
      
Packit 664db3
      
Packit 664db3
      fprintf(file, "#ifndef DEF_PBANDS%d_%d\n", mode->Fs, mode->mdctSize);
Packit 664db3
      fprintf(file, "#define DEF_PBANDS%d_%d\n", mode->Fs, mode->mdctSize);
Packit 664db3
      fprintf (file, "static const celt_int16_t pBands%d_%d[%d] = {\n", mode->Fs, mode->mdctSize, mode->nbPBands+2);
Packit 664db3
      for (j=0;j<mode->nbPBands+2;j++)
Packit 664db3
         fprintf (file, "%d, ", mode->pBands[j]);
Packit 664db3
      fprintf (file, "};\n");
Packit 664db3
      fprintf(file, "#endif\n");
Packit 664db3
      fprintf(file, "\n");
Packit 664db3
      
Packit 664db3
      
Packit 664db3
      fprintf(file, "#ifndef DEF_WINDOW%d\n", mode->overlap);
Packit 664db3
      fprintf(file, "#define DEF_WINDOW%d\n", mode->overlap);
Packit 664db3
      fprintf (file, "static const celt_word16_t window%d[%d] = {\n", mode->overlap, mode->overlap);
Packit 664db3
      for (j=0;j<mode->overlap;j++)
Packit 664db3
         fprintf (file, WORD16 ", ", mode->window[j]);
Packit 664db3
      fprintf (file, "};\n");
Packit 664db3
      fprintf(file, "#endif\n");
Packit 664db3
      fprintf(file, "\n");
Packit 664db3
      
Packit 664db3
      fprintf(file, "#ifndef DEF_PSY%d\n", mode->Fs);
Packit 664db3
      fprintf(file, "#define DEF_PSY%d\n", mode->Fs);
Packit 664db3
      fprintf (file, "static const celt_word16_t psy_decayR_%d[%d] = {\n", mode->Fs, MAX_PERIOD/2);
Packit 664db3
      for (j=0;j
Packit 664db3
         fprintf (file, WORD16 ", ", mode->psy.decayR[j]);
Packit 664db3
      fprintf (file, "};\n");
Packit 664db3
      fprintf(file, "#endif\n");
Packit 664db3
      fprintf(file, "\n");
Packit 664db3
Packit 664db3
      
Packit 664db3
      fprintf(file, "#ifndef DEF_ALLOC_VECTORS%d_%d_%d\n", mode->Fs, mode->mdctSize, mode->nbChannels);
Packit 664db3
      fprintf(file, "#define DEF_ALLOC_VECTORS%d_%d_%d\n", mode->Fs, mode->mdctSize, mode->nbChannels);
Packit 664db3
      fprintf (file, "static const celt_int16_t allocVectors%d_%d_%d[%d] = {\n", mode->Fs, mode->mdctSize, mode->nbChannels, mode->nbEBands*mode->nbAllocVectors);
Packit 664db3
      for (j=0;j<mode->nbAllocVectors;j++)
Packit 664db3
      {
Packit 664db3
         int k;
Packit 664db3
         for (k=0;k<mode->nbEBands;k++)
Packit 664db3
            fprintf (file, "%2d, ", mode->allocVectors[j*mode->nbEBands+k]);
Packit 664db3
         fprintf (file, "\n");
Packit 664db3
      }
Packit 664db3
      fprintf (file, "};\n");
Packit 664db3
      fprintf(file, "#endif\n");
Packit 664db3
      fprintf(file, "\n");
Packit 664db3
Packit 664db3
      fprintf(file, "#ifndef DEF_ALLOC_ENERGY%d_%d_%d\n", mode->Fs, mode->mdctSize, mode->nbChannels);
Packit 664db3
      fprintf(file, "#define DEF_ALLOC_ENERGY%d_%d_%d\n", mode->Fs, mode->mdctSize, mode->nbChannels);
Packit 664db3
      fprintf (file, "static const celt_int16_t allocEnergy%d_%d_%d[%d] = {\n", mode->Fs, mode->mdctSize, mode->nbChannels, mode->nbEBands*mode->nbAllocVectors);
Packit 664db3
      for (j=0;j<mode->nbAllocVectors;j++)
Packit 664db3
      {
Packit 664db3
         int k;
Packit 664db3
         for (k=0;k<mode->nbEBands;k++)
Packit 664db3
            fprintf (file, "%2d, ", mode->energy_alloc[j*mode->nbEBands+k]);
Packit 664db3
         fprintf (file, "\n");
Packit 664db3
      }
Packit 664db3
      fprintf (file, "};\n");
Packit 664db3
      fprintf(file, "#endif\n");
Packit 664db3
      fprintf(file, "\n");
Packit 664db3
Packit 664db3
      fprintf(file, "#ifndef DEF_ALLOC_CACHE%d_%d_%d\n", mode->Fs, mode->mdctSize, mode->nbChannels);
Packit 664db3
      fprintf(file, "#define DEF_ALLOC_CACHE%d_%d_%d\n", mode->Fs, mode->mdctSize, mode->nbChannels);
Packit 664db3
      for (j=0;j<mode->nbEBands;j++)
Packit 664db3
      {
Packit 664db3
         int k;
Packit 664db3
         if (j==0 || (mode->bits[j] != mode->bits[j-1]))
Packit 664db3
         {
Packit 664db3
            fprintf (file, "static const celt_int16_t allocCache_band%d_%d_%d_%d[MAX_PULSES] = {\n", j, mode->Fs, mode->mdctSize, mode->nbChannels);
Packit 664db3
            for (k=0;k
Packit 664db3
               fprintf (file, "%2d, ", mode->bits[j][k]);
Packit 664db3
            fprintf (file, "};\n");
Packit 664db3
         } else {
Packit 664db3
            fprintf (file, "#define allocCache_band%d_%d_%d_%d allocCache_band%d_%d_%d_%d\n", j, mode->Fs, mode->mdctSize, mode->nbChannels, j-1, mode->Fs, mode->mdctSize, mode->nbChannels);
Packit 664db3
         }
Packit 664db3
      }
Packit 664db3
      fprintf (file, "static const celt_int16_t *allocCache%d_%d_%d[%d] = {\n", mode->Fs, mode->mdctSize, mode->nbChannels, mode->nbEBands);
Packit 664db3
      for (j=0;j<mode->nbEBands;j++)
Packit 664db3
      {
Packit 664db3
         fprintf (file, "allocCache_band%d_%d_%d_%d, ", j, mode->Fs, mode->mdctSize, mode->nbChannels);
Packit 664db3
      }
Packit 664db3
      fprintf (file, "};\n");
Packit 664db3
      fprintf(file, "#endif\n");
Packit 664db3
      fprintf(file, "\n");
Packit 664db3
Packit 664db3
Packit 664db3
      if (mode->bits_stereo)
Packit 664db3
      {
Packit 664db3
         fprintf(file, "#ifndef DEF_ALLOC_STEREO_CACHE%d_%d_%d\n", mode->Fs, mode->mdctSize, mode->nbChannels);
Packit 664db3
         fprintf(file, "#define DEF_ALLOC_STEREO_CACHE%d_%d_%d\n", mode->Fs, mode->mdctSize, mode->nbChannels);
Packit 664db3
         for (j=0;j<mode->nbEBands;j++)
Packit 664db3
         {
Packit 664db3
            int k;
Packit 664db3
            if (j==0 || (mode->bits[j] != mode->bits_stereo[j-1]))
Packit 664db3
            {
Packit 664db3
               fprintf (file, "static const celt_int16_t allocStereoCache_band%d_%d_%d_%d[MAX_PULSES] = {\n", j, mode->Fs, mode->mdctSize, mode->nbChannels);
Packit 664db3
               for (k=0;k
Packit 664db3
                  fprintf (file, "%2d, ", mode->bits_stereo[j][k]);
Packit 664db3
               fprintf (file, "};\n");
Packit 664db3
            } else {
Packit 664db3
               fprintf (file, "#define allocStereoCache_band%d_%d_%d_%d allocStereoCache_band%d_%d_%d_%d\n", j, mode->Fs, mode->mdctSize, mode->nbChannels, j-1, mode->Fs, mode->mdctSize, mode->nbChannels);
Packit 664db3
            }
Packit 664db3
         }
Packit 664db3
         fprintf (file, "static const celt_int16_t *allocStereoCache%d_%d_%d[%d] = {\n", mode->Fs, mode->mdctSize, mode->nbChannels, mode->nbEBands);
Packit 664db3
         for (j=0;j<mode->nbEBands;j++)
Packit 664db3
         {
Packit 664db3
            fprintf (file, "allocStereoCache_band%d_%d_%d_%d, ", j, mode->Fs, mode->mdctSize, mode->nbChannels);
Packit 664db3
         }
Packit 664db3
         fprintf (file, "};\n");
Packit 664db3
         fprintf(file, "#endif\n");
Packit 664db3
         fprintf(file, "\n");
Packit 664db3
      }
Packit 664db3
Packit 664db3
Packit 664db3
      fprintf(file, "static const CELTMode mode%d_%d_%d_%d = {\n", mode->Fs, mode->nbChannels, mode->mdctSize, mode->overlap);
Packit 664db3
      fprintf(file, "0x%x,\t/* marker */\n", 0xa110ca7e);
Packit 664db3
      fprintf(file, INT32 ",\t/* Fs */\n", mode->Fs);
Packit 664db3
      fprintf(file, "%d,\t/* overlap */\n", mode->overlap);
Packit 664db3
      fprintf(file, "%d,\t/* mdctSize */\n", mode->mdctSize);
Packit 664db3
      fprintf(file, "%d,\t/* nbChannels */\n", mode->nbChannels);
Packit 664db3
      fprintf(file, "%d,\t/* nbEBands */\n", mode->nbEBands);
Packit 664db3
      fprintf(file, "%d,\t/* nbPBands */\n", mode->nbPBands);
Packit 664db3
      fprintf(file, "%d,\t/* pitchEnd */\n", mode->pitchEnd);
Packit 664db3
      fprintf(file, "eBands%d_%d,\t/* eBands */\n", mode->Fs, mode->mdctSize);
Packit 664db3
      fprintf(file, "pBands%d_%d,\t/* pBands */\n", mode->Fs, mode->mdctSize);
Packit 664db3
      fprintf(file, WORD16 ",\t/* ePredCoef */\n", mode->ePredCoef);
Packit 664db3
      fprintf(file, "%d,\t/* nbAllocVectors */\n", mode->nbAllocVectors);
Packit 664db3
      fprintf(file, "allocVectors%d_%d_%d,\t/* allocVectors */\n", mode->Fs, mode->mdctSize, mode->nbChannels);
Packit 664db3
      fprintf(file, "allocCache%d_%d_%d,\t/* bits */\n", mode->Fs, mode->mdctSize, mode->nbChannels);
Packit 664db3
      if (mode->bits_stereo)
Packit 664db3
         fprintf(file, "allocStereoCache%d_%d_%d,\t/* bits_stereo */\n", mode->Fs, mode->mdctSize, mode->nbChannels);
Packit 664db3
      else
Packit 664db3
         fprintf(file, "0,\t/* bits_stereo */\n");
Packit 664db3
      fprintf(file, "{%d, 0, 0},\t/* mdct */\n", 2*mode->mdctSize);
Packit 664db3
      fprintf(file, "0,\t/* fft */\n");
Packit 664db3
      fprintf(file, "window%d,\t/* window */\n", mode->overlap);
Packit 664db3
      fprintf(file, "%d,\t/* nbShortMdcts */\n", mode->nbShortMdcts);
Packit 664db3
      fprintf(file, "%d,\t/* shortMdctSize */\n", mode->shortMdctSize);
Packit 664db3
      fprintf(file, "{%d, 0, 0},\t/* shortMdct */\n", 2*mode->mdctSize);
Packit 664db3
      fprintf(file, "window%d,\t/* shortWindow */\n", mode->overlap);
Packit 664db3
      fprintf(file, "{psy_decayR_%d},\t/* psy */\n", mode->Fs);
Packit 664db3
      fprintf(file, "0,\t/* prob */\n");
Packit 664db3
      fprintf(file, "allocEnergy%d_%d_%d,\t/* energy_alloc */\n", mode->Fs, mode->mdctSize, mode->nbChannels);
Packit 664db3
      fprintf(file, "0x%x,\t/* marker */\n", 0xa110ca7e);
Packit 664db3
      fprintf(file, "};\n");
Packit 664db3
   }
Packit 664db3
   fprintf(file, "\n");
Packit 664db3
   fprintf(file, "/* List of all the available modes */\n");
Packit 664db3
   fprintf(file, "#define TOTAL_MODES %d\n", nb_modes);
Packit 664db3
   fprintf(file, "static const CELTMode * const static_mode_list[TOTAL_MODES] = {\n");
Packit 664db3
   for (i=0;i
Packit 664db3
   {
Packit 664db3
      CELTMode *mode = modes[i];
Packit 664db3
      fprintf(file, "&mode%d_%d_%d_%d,\n", mode->Fs, mode->nbChannels, mode->mdctSize, mode->overlap);
Packit 664db3
   }
Packit 664db3
   fprintf(file, "};\n");
Packit 664db3
}
Packit 664db3
Packit 664db3
void dump_header(FILE *file, CELTMode **modes, int nb_modes)
Packit 664db3
{
Packit 664db3
   int i;
Packit 664db3
   int channels = 0;
Packit 664db3
   int frame_size = 0;
Packit 664db3
   int overlap = 0;
Packit 664db3
   fprintf (file, "/* This header file is generated automatically*/\n");
Packit 664db3
   for (i=0;i
Packit 664db3
   {
Packit 664db3
      CELTMode *mode = modes[i];
Packit 664db3
      if (channels==0)
Packit 664db3
         channels = mode->nbChannels;
Packit 664db3
      else if (channels != mode->nbChannels)
Packit 664db3
         channels = -1;
Packit 664db3
      if (frame_size==0)
Packit 664db3
         frame_size = mode->mdctSize;
Packit 664db3
      else if (frame_size != mode->mdctSize)
Packit 664db3
         frame_size = -1;
Packit 664db3
      if (overlap==0)
Packit 664db3
         overlap = mode->overlap;
Packit 664db3
      else if (overlap != mode->overlap)
Packit 664db3
         overlap = -1;
Packit 664db3
   }
Packit 664db3
   if (channels>0)
Packit 664db3
   {
Packit 664db3
      fprintf (file, "#define CHANNELS(mode) %d\n", channels);
Packit 664db3
      if (channels==1)
Packit 664db3
         fprintf (file, "#define DISABLE_STEREO\n");
Packit 664db3
   }
Packit 664db3
   if (frame_size>0)
Packit 664db3
   {
Packit 664db3
      fprintf (file, "#define FRAMESIZE(mode) %d\n", frame_size);
Packit 664db3
   }
Packit 664db3
   if (overlap>0)
Packit 664db3
   {
Packit 664db3
      fprintf (file, "#define OVERLAP(mode) %d\n", overlap);
Packit 664db3
   }
Packit 664db3
}
Packit 664db3
Packit 664db3
int main(int argc, char **argv)
Packit 664db3
{
Packit 664db3
   int i, nb;
Packit 664db3
   FILE *file;
Packit 664db3
   CELTMode **m;
Packit 664db3
   if (argc%3 != 1)
Packit 664db3
   {
Packit 664db3
      fprintf (stderr, "must have a multiple of 4 arguments\n");
Packit 664db3
      return 1;
Packit 664db3
   }
Packit 664db3
   nb = (argc-1)/3;
Packit 664db3
   m = malloc(nb*sizeof(CELTMode*));
Packit 664db3
   for (i=0;i
Packit 664db3
   {
Packit 664db3
      int Fs, ch, frame;
Packit 664db3
      Fs      = atoi(argv[3*i+1]);
Packit 664db3
      ch      = atoi(argv[3*i+2]);
Packit 664db3
      frame   = atoi(argv[3*i+3]);
Packit 664db3
      m[i] = celt051_mode_create(Fs, ch, frame, NULL);
Packit 664db3
   }
Packit 664db3
   file = fopen("static_modes.c", "w");
Packit 664db3
   dump_modes(file, m, nb);
Packit 664db3
   fclose(file);
Packit 664db3
   file = fopen("static_modes.h", "w");
Packit 664db3
   dump_header(file, m, nb);
Packit 664db3
   fclose(file);
Packit 664db3
   for (i=0;i
Packit 664db3
      celt051_mode_destroy(m[i]);
Packit 664db3
   free(m);
Packit 664db3
   return 0;
Packit 664db3
}