1e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org/* Copyright (c) 2008 CSIRO
2e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org   Copyright (c) 2008-2009 Xiph.Org Foundation
3e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org   Written by Jean-Marc Valin */
4e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org/*
5e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org   Redistribution and use in source and binary forms, with or without
6e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org   modification, are permitted provided that the following conditions
7e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org   are met:
8e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org
9e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org   - Redistributions of source code must retain the above copyright
10e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org   notice, this list of conditions and the following disclaimer.
11e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org
12e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org   - Redistributions in binary form must reproduce the above copyright
13e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org   notice, this list of conditions and the following disclaimer in the
14e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org   documentation and/or other materials provided with the distribution.
15e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org
16e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org   ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
20e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org   OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
21e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org   EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
22e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org   PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
23e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org   PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
24e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org   LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
25e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org   NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
26e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org   SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org*/
28e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org
29e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#ifdef HAVE_CONFIG_H
30e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#include "config.h"
31e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#endif
32e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org
33e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#include <stdlib.h>
34e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#include <stdio.h>
35e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#include "modes.h"
36e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#include "celt.h"
37e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#include "rate.h"
38e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org
39e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#define INT16 "%d"
40e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#define INT32 "%d"
41e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#define FLOAT "%#0.8gf"
42e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org
43e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#ifdef FIXED_POINT
44e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#define WORD16 INT16
45e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#define WORD32 INT32
46e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#else
47e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#define WORD16 FLOAT
48e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#define WORD32 FLOAT
49e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#endif
50e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org
51e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.orgvoid dump_modes(FILE *file, CELTMode **modes, int nb_modes)
52e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org{
53e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org   int i, j, k;
54e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org   fprintf(file, "/* The contents of this file was automatically generated by dump_modes.c\n");
55e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org   fprintf(file, "   with arguments:");
56e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org   for (i=0;i<nb_modes;i++)
57e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org   {
58e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org      CELTMode *mode = modes[i];
59e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org      fprintf(file, " %d %d",mode->Fs,mode->shortMdctSize*mode->nbShortMdcts);
60e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org   }
61e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org   fprintf(file, "\n   It contains static definitions for some pre-defined modes. */\n");
62e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org   fprintf(file, "#include \"modes.h\"\n");
63e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org   fprintf(file, "#include \"rate.h\"\n");
64e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org
65e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org   fprintf(file, "\n");
66e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org
67e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org   for (i=0;i<nb_modes;i++)
68e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org   {
69e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org      CELTMode *mode = modes[i];
70e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org      int mdctSize;
71e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org      int standard, framerate;
72e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org
73e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org      mdctSize = mode->shortMdctSize*mode->nbShortMdcts;
74e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org      standard = (mode->Fs == 400*(opus_int32)mode->shortMdctSize);
75e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org      framerate = mode->Fs/mode->shortMdctSize;
76e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org
77e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org      if (!standard)
78e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org      {
79e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org         fprintf(file, "#ifndef DEF_EBANDS%d_%d\n", mode->Fs, mdctSize);
80e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org         fprintf(file, "#define DEF_EBANDS%d_%d\n", mode->Fs, mdctSize);
81e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org         fprintf (file, "static const opus_int16 eBands%d_%d[%d] = {\n", mode->Fs, mdctSize, mode->nbEBands+2);
82e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org         for (j=0;j<mode->nbEBands+2;j++)
83e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org            fprintf (file, "%d, ", mode->eBands[j]);
84e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org         fprintf (file, "};\n");
85e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org         fprintf(file, "#endif\n");
86e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org         fprintf(file, "\n");
87e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org      }
88e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org
89e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org      fprintf(file, "#ifndef DEF_WINDOW%d\n", mode->overlap);
90e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org      fprintf(file, "#define DEF_WINDOW%d\n", mode->overlap);
91e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org      fprintf (file, "static const opus_val16 window%d[%d] = {\n", mode->overlap, mode->overlap);
92e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org      for (j=0;j<mode->overlap;j++)
93e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org         fprintf (file, WORD16 ",%c", mode->window[j],(j+6)%5==0?'\n':' ');
94e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org      fprintf (file, "};\n");
95e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org      fprintf(file, "#endif\n");
96e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org      fprintf(file, "\n");
97e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org
98e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org      if (!standard)
99e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org      {
100e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org         fprintf(file, "#ifndef DEF_ALLOC_VECTORS%d_%d\n", mode->Fs, mdctSize);
101e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org         fprintf(file, "#define DEF_ALLOC_VECTORS%d_%d\n", mode->Fs, mdctSize);
102e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org         fprintf (file, "static const unsigned char allocVectors%d_%d[%d] = {\n", mode->Fs, mdctSize, mode->nbEBands*mode->nbAllocVectors);
103e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org         for (j=0;j<mode->nbAllocVectors;j++)
104e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org         {
105e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org            for (k=0;k<mode->nbEBands;k++)
106e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org               fprintf (file, "%2d, ", mode->allocVectors[j*mode->nbEBands+k]);
107e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org            fprintf (file, "\n");
108e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org         }
109e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org         fprintf (file, "};\n");
110e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org         fprintf(file, "#endif\n");
111e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org         fprintf(file, "\n");
112e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org      }
113e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org
114e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org      fprintf(file, "#ifndef DEF_LOGN%d\n", framerate);
115e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org      fprintf(file, "#define DEF_LOGN%d\n", framerate);
116e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org      fprintf (file, "static const opus_int16 logN%d[%d] = {\n", framerate, mode->nbEBands);
117e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org      for (j=0;j<mode->nbEBands;j++)
118e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org         fprintf (file, "%d, ", mode->logN[j]);
119e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org      fprintf (file, "};\n");
120e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org      fprintf(file, "#endif\n");
121e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org      fprintf(file, "\n");
122e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org
123e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org      /* Pulse cache */
124e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org      fprintf(file, "#ifndef DEF_PULSE_CACHE%d\n", mode->Fs/mdctSize);
125e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org      fprintf(file, "#define DEF_PULSE_CACHE%d\n", mode->Fs/mdctSize);
126e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org      fprintf (file, "static const opus_int16 cache_index%d[%d] = {\n", mode->Fs/mdctSize, (mode->maxLM+2)*mode->nbEBands);
127e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org      for (j=0;j<mode->nbEBands*(mode->maxLM+2);j++)
128e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org         fprintf (file, "%d,%c", mode->cache.index[j],(j+16)%15==0?'\n':' ');
129e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org      fprintf (file, "};\n");
130e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org      fprintf (file, "static const unsigned char cache_bits%d[%d] = {\n", mode->Fs/mdctSize, mode->cache.size);
131e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org      for (j=0;j<mode->cache.size;j++)
132e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org         fprintf (file, "%d,%c", mode->cache.bits[j],(j+16)%15==0?'\n':' ');
133e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org      fprintf (file, "};\n");
134e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org      fprintf (file, "static const unsigned char cache_caps%d[%d] = {\n", mode->Fs/mdctSize, (mode->maxLM+1)*2*mode->nbEBands);
135e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org      for (j=0;j<(mode->maxLM+1)*2*mode->nbEBands;j++)
136e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org         fprintf (file, "%d,%c", mode->cache.caps[j],(j+16)%15==0?'\n':' ');
137e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org      fprintf (file, "};\n");
138e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org
139e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org      fprintf(file, "#endif\n");
140e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org      fprintf(file, "\n");
141e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org
142e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org      /* FFT twiddles */
143e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org      fprintf(file, "#ifndef FFT_TWIDDLES%d_%d\n", mode->Fs, mdctSize);
144e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org      fprintf(file, "#define FFT_TWIDDLES%d_%d\n", mode->Fs, mdctSize);
145e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org      fprintf (file, "static const kiss_twiddle_cpx fft_twiddles%d_%d[%d] = {\n",
146e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org            mode->Fs, mdctSize, mode->mdct.kfft[0]->nfft);
147e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org      for (j=0;j<mode->mdct.kfft[0]->nfft;j++)
148e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org         fprintf (file, "{" WORD16 ", " WORD16 "},%c", mode->mdct.kfft[0]->twiddles[j].r, mode->mdct.kfft[0]->twiddles[j].i,(j+3)%2==0?'\n':' ');
149e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org      fprintf (file, "};\n");
150e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org
151e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org      /* FFT Bitrev tables */
152e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org      for (k=0;k<=mode->mdct.maxshift;k++)
153e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org      {
154e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org         fprintf(file, "#ifndef FFT_BITREV%d\n", mode->mdct.kfft[k]->nfft);
155e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org         fprintf(file, "#define FFT_BITREV%d\n", mode->mdct.kfft[k]->nfft);
156e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org         fprintf (file, "static const opus_int16 fft_bitrev%d[%d] = {\n",
157e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org               mode->mdct.kfft[k]->nfft, mode->mdct.kfft[k]->nfft);
158e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org         for (j=0;j<mode->mdct.kfft[k]->nfft;j++)
159e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org            fprintf (file, "%d,%c", mode->mdct.kfft[k]->bitrev[j],(j+16)%15==0?'\n':' ');
160e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org         fprintf (file, "};\n");
161e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org
162e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org         fprintf(file, "#endif\n");
163e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org         fprintf(file, "\n");
164e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org      }
165e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org
166e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org      /* FFT States */
167e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org      for (k=0;k<=mode->mdct.maxshift;k++)
168e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org      {
169e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org         fprintf(file, "#ifndef FFT_STATE%d_%d_%d\n", mode->Fs, mdctSize, k);
170e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org         fprintf(file, "#define FFT_STATE%d_%d_%d\n", mode->Fs, mdctSize, k);
171e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org         fprintf (file, "static const kiss_fft_state fft_state%d_%d_%d = {\n",
172e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org               mode->Fs, mdctSize, k);
173e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org         fprintf (file, "%d,\t/* nfft */\n", mode->mdct.kfft[k]->nfft);
174e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#ifndef FIXED_POINT
175e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org         fprintf (file, "%0.9ff,\t/* scale */\n", mode->mdct.kfft[k]->scale);
176e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#endif
177e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org         fprintf (file, "%d,\t/* shift */\n", mode->mdct.kfft[k]->shift);
178e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org         fprintf (file, "{");
179e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org         for (j=0;j<2*MAXFACTORS;j++)
180e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org            fprintf (file, "%d, ", mode->mdct.kfft[k]->factors[j]);
181e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org         fprintf (file, "},\t/* factors */\n");
182e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org         fprintf (file, "fft_bitrev%d,\t/* bitrev */\n", mode->mdct.kfft[k]->nfft);
183e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org         fprintf (file, "fft_twiddles%d_%d,\t/* bitrev */\n", mode->Fs, mdctSize);
184e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org         fprintf (file, "};\n");
185e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org
186e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org         fprintf(file, "#endif\n");
187e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org         fprintf(file, "\n");
188e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org      }
189e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org
190e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org      fprintf(file, "#endif\n");
191e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org      fprintf(file, "\n");
192e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org
193e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org      /* MDCT twiddles */
194e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org      fprintf(file, "#ifndef MDCT_TWIDDLES%d\n", mdctSize);
195e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org      fprintf(file, "#define MDCT_TWIDDLES%d\n", mdctSize);
196e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org      fprintf (file, "static const opus_val16 mdct_twiddles%d[%d] = {\n",
197e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org            mdctSize, mode->mdct.n/4+1);
198e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org      for (j=0;j<=mode->mdct.n/4;j++)
199e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org         fprintf (file, WORD16 ",%c", mode->mdct.trig[j],(j+6)%5==0?'\n':' ');
200e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org      fprintf (file, "};\n");
201e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org
202e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org      fprintf(file, "#endif\n");
203e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org      fprintf(file, "\n");
204e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org
205e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org
206e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org      /* Print the actual mode data */
207e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org      fprintf(file, "static const CELTMode mode%d_%d_%d = {\n", mode->Fs, mdctSize, mode->overlap);
208e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org      fprintf(file, INT32 ",\t/* Fs */\n", mode->Fs);
209e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org      fprintf(file, "%d,\t/* overlap */\n", mode->overlap);
210e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org      fprintf(file, "%d,\t/* nbEBands */\n", mode->nbEBands);
211e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org      fprintf(file, "%d,\t/* effEBands */\n", mode->effEBands);
212e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org      fprintf(file, "{");
213e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org      for (j=0;j<4;j++)
214e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org         fprintf(file, WORD16 ", ", mode->preemph[j]);
215e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org      fprintf(file, "},\t/* preemph */\n");
216e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org      if (standard)
217e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org         fprintf(file, "eband5ms,\t/* eBands */\n");
218e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org      else
219e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org         fprintf(file, "eBands%d_%d,\t/* eBands */\n", mode->Fs, mdctSize);
220e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org
221e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org      fprintf(file, "%d,\t/* maxLM */\n", mode->maxLM);
222e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org      fprintf(file, "%d,\t/* nbShortMdcts */\n", mode->nbShortMdcts);
223e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org      fprintf(file, "%d,\t/* shortMdctSize */\n", mode->shortMdctSize);
224e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org
225e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org      fprintf(file, "%d,\t/* nbAllocVectors */\n", mode->nbAllocVectors);
226e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org      if (standard)
227e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org         fprintf(file, "band_allocation,\t/* allocVectors */\n");
228e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org      else
229e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org         fprintf(file, "allocVectors%d_%d,\t/* allocVectors */\n", mode->Fs, mdctSize);
230e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org
231e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org      fprintf(file, "logN%d,\t/* logN */\n", framerate);
232e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org      fprintf(file, "window%d,\t/* window */\n", mode->overlap);
233e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org      fprintf(file, "{%d, %d, {", mode->mdct.n, mode->mdct.maxshift);
234e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org      for (k=0;k<=mode->mdct.maxshift;k++)
235e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org         fprintf(file, "&fft_state%d_%d_%d, ", mode->Fs, mdctSize, k);
236e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org      fprintf (file, "}, mdct_twiddles%d},\t/* mdct */\n", mdctSize);
237e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org
238e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org      fprintf(file, "{%d, cache_index%d, cache_bits%d, cache_caps%d},\t/* cache */\n",
239e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org            mode->cache.size, mode->Fs/mdctSize, mode->Fs/mdctSize, mode->Fs/mdctSize);
240e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org      fprintf(file, "};\n");
241e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org   }
242e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org   fprintf(file, "\n");
243e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org   fprintf(file, "/* List of all the available modes */\n");
244e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org   fprintf(file, "#define TOTAL_MODES %d\n", nb_modes);
245e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org   fprintf(file, "static const CELTMode * const static_mode_list[TOTAL_MODES] = {\n");
246e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org   for (i=0;i<nb_modes;i++)
247e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org   {
248e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org      CELTMode *mode = modes[i];
249e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org      int mdctSize;
250e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org      mdctSize = mode->shortMdctSize*mode->nbShortMdcts;
251e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org      fprintf(file, "&mode%d_%d_%d,\n", mode->Fs, mdctSize, mode->overlap);
252e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org   }
253e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org   fprintf(file, "};\n");
254e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org}
255e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org
256e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.orgvoid dump_header(FILE *file, CELTMode **modes, int nb_modes)
257e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org{
258e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org   int i;
259e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org   int channels = 0;
260e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org   int frame_size = 0;
261e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org   int overlap = 0;
262e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org   fprintf (file, "/* This header file is generated automatically*/\n");
263e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org   for (i=0;i<nb_modes;i++)
264e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org   {
265e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org      CELTMode *mode = modes[i];
266e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org      if (frame_size==0)
267e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org         frame_size = mode->shortMdctSize*mode->nbShortMdcts;
268e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org      else if (frame_size != mode->shortMdctSize*mode->nbShortMdcts)
269e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org         frame_size = -1;
270e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org      if (overlap==0)
271e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org         overlap = mode->overlap;
272e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org      else if (overlap != mode->overlap)
273e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org         overlap = -1;
274e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org   }
275e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org   if (channels>0)
276e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org   {
277e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org      fprintf (file, "#define CHANNELS(mode) %d\n", channels);
278e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org      if (channels==1)
279e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org         fprintf (file, "#define DISABLE_STEREO\n");
280e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org   }
281e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org   if (frame_size>0)
282e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org   {
283e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org      fprintf (file, "#define FRAMESIZE(mode) %d\n", frame_size);
284e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org   }
285e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org   if (overlap>0)
286e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org   {
287e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org      fprintf (file, "#define OVERLAP(mode) %d\n", overlap);
288e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org   }
289e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org}
290e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org
291e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#ifdef FIXED_POINT
292e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#define BASENAME "static_modes_fixed"
293e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#else
294e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#define BASENAME "static_modes_float"
295e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#endif
296e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org
297e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.orgint main(int argc, char **argv)
298e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org{
299e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org   int i, nb;
300e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org   FILE *file;
301e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org   CELTMode **m;
302e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org   if (argc%2 != 1 || argc<3)
303e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org   {
304e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org      fprintf (stderr, "Usage: %s rate frame_size [rate frame_size] [rate frame_size]...\n",argv[0]);
305e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org      return 1;
306e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org   }
307e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org   nb = (argc-1)/2;
308e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org   m = malloc(nb*sizeof(CELTMode*));
309e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org   for (i=0;i<nb;i++)
310e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org   {
311e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org      int Fs, frame;
312e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org      Fs      = atoi(argv[2*i+1]);
313e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org      frame   = atoi(argv[2*i+2]);
314e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org      m[i] = opus_custom_mode_create(Fs, frame, NULL);
315e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org      if (m[i]==NULL)
316e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org      {
317e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org         fprintf(stderr,"Error creating mode with Fs=%s, frame_size=%s\n",
318e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org               argv[2*i+1],argv[2*i+2]);
319e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org         return EXIT_FAILURE;
320e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org      }
321e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org   }
322e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org   file = fopen(BASENAME ".h", "w");
323e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org   dump_modes(file, m, nb);
324e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org   fclose(file);
325e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org   for (i=0;i<nb;i++)
326e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org      opus_custom_mode_destroy(m[i]);
327e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org   free(m);
328e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org   return 0;
329e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org}
330