FFT cleanup
[opus.git] / libcelt / dump_modes.c
1 /* Copyright (c) 2008 CSIRO
2    Copyright (c) 2008-2009 Xiph.Org Foundation
3    Written by Jean-Marc Valin */
4 /*
5    Redistribution and use in source and binary forms, with or without
6    modification, are permitted provided that the following conditions
7    are met:
8    
9    - Redistributions of source code must retain the above copyright
10    notice, this list of conditions and the following disclaimer.
11    
12    - Redistributions in binary form must reproduce the above copyright
13    notice, this list of conditions and the following disclaimer in the
14    documentation and/or other materials provided with the distribution.
15    
16    - Neither the name of the Xiph.org Foundation nor the names of its
17    contributors may be used to endorse or promote products derived from
18    this software without specific prior written permission.
19    
20    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21    ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22    LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23    A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR
24    CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
25    EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
26    PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
27    PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
28    LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
29    NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
30    SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31 */
32
33 #ifdef HAVE_CONFIG_H
34 #include "config.h"
35 #endif
36
37 #include <stdio.h>
38 #include "modes.h"
39 #include "celt.h"
40 #include "rate.h"
41
42 #define INT16 "%d"
43 #define INT32 "%d"
44 #define FLOAT "%f"
45
46 #ifdef FIXED_POINT
47 #define WORD16 INT16
48 #define WORD32 INT32
49 #else
50 #define WORD16 FLOAT
51 #define WORD32 FLOAT
52 #endif
53
54
55 void dump_modes(FILE *file, CELTMode **modes, int nb_modes)
56 {
57    int i, j, k;
58    fprintf(file, "/* The contents of this file is automatically generated and contains static\n");
59    fprintf(file, "   definitions for some pre-defined modes */\n");
60    fprintf(file, "#include \"modes.h\"\n");
61    fprintf(file, "#include \"rate.h\"\n");
62
63    fprintf(file, "\n");
64
65    for (i=0;i<nb_modes;i++)
66    {
67       CELTMode *mode = modes[i];
68       int mdctSize;
69       mdctSize = mode->shortMdctSize*mode->nbShortMdcts;
70       fprintf(file, "#ifndef DEF_EBANDS%d_%d\n", mode->Fs, mdctSize);
71       fprintf(file, "#define DEF_EBANDS%d_%d\n", mode->Fs, mdctSize);
72       fprintf (file, "static const celt_int16 eBands%d_%d[%d] = {\n", mode->Fs, mdctSize, mode->nbEBands+2);
73       for (j=0;j<mode->nbEBands+2;j++)
74          fprintf (file, "%d, ", mode->eBands[j]);
75       fprintf (file, "};\n");
76       fprintf(file, "#endif\n");
77       fprintf(file, "\n");
78       
79       
80       fprintf(file, "#ifndef DEF_WINDOW%d\n", mode->overlap);
81       fprintf(file, "#define DEF_WINDOW%d\n", mode->overlap);
82       fprintf (file, "static const celt_word16 window%d[%d] = {\n", mode->overlap, mode->overlap);
83       for (j=0;j<mode->overlap;j++)
84          fprintf (file, WORD16 ", ", mode->window[j]);
85       fprintf (file, "};\n");
86       fprintf(file, "#endif\n");
87       fprintf(file, "\n");
88       
89       fprintf(file, "#ifndef DEF_ALLOC_VECTORS%d_%d\n", mode->Fs, mdctSize);
90       fprintf(file, "#define DEF_ALLOC_VECTORS%d_%d\n", mode->Fs, mdctSize);
91       fprintf (file, "static const unsigned char allocVectors%d_%d[%d] = {\n", mode->Fs, mdctSize, mode->nbEBands*mode->nbAllocVectors);
92       for (j=0;j<mode->nbAllocVectors;j++)
93       {
94          for (k=0;k<mode->nbEBands;k++)
95             fprintf (file, "%2d, ", mode->allocVectors[j*mode->nbEBands+k]);
96          fprintf (file, "\n");
97       }
98       fprintf (file, "};\n");
99       fprintf(file, "#endif\n");
100       fprintf(file, "\n");
101
102       fprintf(file, "#ifndef DEF_LOGN%d_%d\n", mode->Fs, mdctSize);
103       fprintf(file, "#define DEF_LOGN%d_%d\n", mode->Fs, mdctSize);
104       fprintf (file, "static const celt_int16 logN%d_%d[%d] = {\n", mode->Fs, mdctSize, mode->nbEBands);
105       for (j=0;j<mode->nbEBands;j++)
106          fprintf (file, "%d, ", mode->logN[j]);
107       fprintf (file, "};\n");
108       fprintf(file, "#endif\n");
109       fprintf(file, "\n");
110
111       /* Pulse cache */
112       fprintf(file, "#ifndef DEF_PULSE_CACHE%d_%d\n", mode->Fs, mdctSize);
113       fprintf(file, "#define DEF_PULSE_CACHE%d_%d\n", mode->Fs, mdctSize);
114       fprintf (file, "static const celt_int16 cache_index%d_%d[%d] = {\n", mode->Fs, mdctSize, (mode->maxLM+2)*mode->nbEBands);
115       for (j=0;j<mode->nbEBands*(mode->maxLM+2);j++)
116          fprintf (file, "%d, ", mode->cache.index[j]);
117       fprintf (file, "};\n");
118       fprintf (file, "static const unsigned char cache_bits%d_%d[%d] = {\n", mode->Fs, mdctSize, mode->cache.size);
119       for (j=0;j<mode->cache.size;j++)
120          fprintf (file, "%d, ", mode->cache.bits[j]);
121       fprintf (file, "};\n");
122       fprintf(file, "#endif\n");
123       fprintf(file, "\n");
124
125       /* FFTs */
126       /*
127       for (i=0;i<mode->mdct.maxshift;i++)
128       {
129          fprintf(file, "#ifndef FFT_BITREV%d_%d\n", mode->Fs, mdctSize>>i);
130          fprintf(file, "#define FFT_BITREV%d_%d\n", mode->Fs, mdctSize>>i);
131          fprintf (file, "static const celt_int16 fft_bitrev%d_%d[%d] = {\n",
132                mode->Fs, mdctSize/i, mode->mdct.kfft[i]->nfft);
133          for (j=0;j<mode->mdct.kfft[i]->nfft;j++)
134             fprintf (file, "%d, ", mode->mdct.kfft[i]->bitrev[j]);
135          fprintf (file, "};\n");
136
137          fprintf(file, "#endif\n");
138          fprintf(file, "\n");
139       }
140       */
141
142       /* Print the actual mode data */
143       fprintf(file, "static const CELTMode mode%d_%d_%d = {\n", mode->Fs, mdctSize, mode->overlap);
144       fprintf(file, "0x%x,\t/* marker */\n", 0xa110ca7e);
145       fprintf(file, INT32 ",\t/* Fs */\n", mode->Fs);
146       fprintf(file, "%d,\t/* overlap */\n", mode->overlap);
147       fprintf(file, "%d,\t/* nbEBands */\n", mode->nbEBands);
148       fprintf(file, "%d,\t/* effEBands */\n", mode->effEBands);
149       fprintf(file, "{");
150       for (j=0;j<4;j++)
151          fprintf(file, WORD16 ", ", mode->preemph[j]);
152       fprintf(file, "},\t/* preemph */\n");
153       fprintf(file, "eBands%d_%d,\t/* eBands */\n", mode->Fs, mdctSize);
154       fprintf(file, "%d,\t/* nbAllocVectors */\n", mode->nbAllocVectors);
155       fprintf(file, "allocVectors%d_%d,\t/* allocVectors */\n", mode->Fs, mdctSize);
156
157       fprintf(file, "{%d, %d, 0, 0},\t", mode->mdct.n, mode->mdct.maxshift);
158       fprintf (file, "/* mdct */\n");
159
160       fprintf(file, "window%d,\t/* window */\n", mode->overlap);
161       fprintf(file, "%d,\t/* maxLM */\n", mode->maxLM);
162       fprintf(file, "%d,\t/* nbShortMdcts */\n", mode->nbShortMdcts);
163       fprintf(file, "%d,\t/* shortMdctSize */\n", mode->shortMdctSize);
164       fprintf(file, "0,\t/* prob */\n");
165       fprintf(file, "logN%d_%d,\t/* logN */\n", mode->Fs, mdctSize);
166       fprintf(file, "{%d, cache_index%d_%d, cache_bits%d_%d},\t/* cache */\n",
167             mode->cache.size, mode->Fs, mdctSize, mode->Fs, mdctSize);
168       fprintf(file, "0x%x,\t/* marker */\n", 0xa110ca7e);
169       fprintf(file, "};\n");
170    }
171    fprintf(file, "\n");
172    fprintf(file, "/* List of all the available modes */\n");
173    fprintf(file, "#define TOTAL_MODES %d\n", nb_modes);
174    fprintf(file, "static const CELTMode * const static_mode_list[TOTAL_MODES] = {\n");
175    for (i=0;i<nb_modes;i++)
176    {
177       CELTMode *mode = modes[i];
178       int mdctSize;
179       mdctSize = mode->shortMdctSize*mode->nbShortMdcts;
180       fprintf(file, "&mode%d_%d_%d,\n", mode->Fs, mdctSize, mode->overlap);
181    }
182    fprintf(file, "};\n");
183 }
184
185 void dump_header(FILE *file, CELTMode **modes, int nb_modes)
186 {
187    int i;
188    int channels = 0;
189    int frame_size = 0;
190    int overlap = 0;
191    fprintf (file, "/* This header file is generated automatically*/\n");
192    for (i=0;i<nb_modes;i++)
193    {
194       CELTMode *mode = modes[i];
195       if (frame_size==0)
196          frame_size = mode->shortMdctSize*mode->nbShortMdcts;
197       else if (frame_size != mode->shortMdctSize*mode->nbShortMdcts)
198          frame_size = -1;
199       if (overlap==0)
200          overlap = mode->overlap;
201       else if (overlap != mode->overlap)
202          overlap = -1;
203    }
204    if (channels>0)
205    {
206       fprintf (file, "#define CHANNELS(mode) %d\n", channels);
207       if (channels==1)
208          fprintf (file, "#define DISABLE_STEREO\n");
209    }
210    if (frame_size>0)
211    {
212       fprintf (file, "#define FRAMESIZE(mode) %d\n", frame_size);
213    }
214    if (overlap>0)
215    {
216       fprintf (file, "#define OVERLAP(mode) %d\n", overlap);
217    }
218 }
219
220 int main(int argc, char **argv)
221 {
222    int i, nb;
223    FILE *file;
224    CELTMode **m;
225    if (argc%2 != 1)
226    {
227       fprintf (stderr, "must have a multiple of 2 arguments\n");
228       return 1;
229    }
230    nb = (argc-1)/2;
231    m = malloc(nb*sizeof(CELTMode*));
232    for (i=0;i<nb;i++)
233    {
234       int Fs, frame;
235       Fs      = atoi(argv[2*i+1]);
236       frame   = atoi(argv[2*i+2]);
237       m[i] = celt_mode_create(Fs, frame, NULL);
238    }
239    file = fopen("static_modes.c", "w");
240    dump_modes(file, m, nb);
241    fclose(file);
242    file = fopen("static_modes.h", "w");
243    dump_header(file, m, nb);
244    fclose(file);
245    for (i=0;i<nb;i++)
246       celt_mode_destroy(m[i]);
247    free(m);
248    return 0;
249 }