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