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