In silk_dec_API.c a memcpy was blindly copying data of differing types (opus_int16...
[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 "%#0.8gf"
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 void dump_modes(FILE *file, CELTMode **modes, int nb_modes)
52 {
53    int i, j, k;
54    fprintf(file, "/* The contents of this file was automatically generated by dump_modes.c\n");
55    fprintf(file, "   with arguments:");
56    for (i=0;i<nb_modes;i++)
57    {
58       CELTMode *mode = modes[i];
59       fprintf(file, " %d %d",mode->Fs,mode->shortMdctSize*mode->nbShortMdcts);
60    }
61    fprintf(file, "\n   It contains static definitions for some pre-defined modes. */\n");
62    fprintf(file, "#include \"modes.h\"\n");
63    fprintf(file, "#include \"rate.h\"\n");
64
65    fprintf(file, "\n");
66
67    for (i=0;i<nb_modes;i++)
68    {
69       CELTMode *mode = modes[i];
70       int mdctSize;
71       int standard, framerate;
72
73       mdctSize = mode->shortMdctSize*mode->nbShortMdcts;
74       standard = (mode->Fs == 400*(opus_int32)mode->shortMdctSize);
75       framerate = mode->Fs/mode->shortMdctSize;
76
77       if (!standard)
78       {
79          fprintf(file, "#ifndef DEF_EBANDS%d_%d\n", mode->Fs, mdctSize);
80          fprintf(file, "#define DEF_EBANDS%d_%d\n", mode->Fs, mdctSize);
81          fprintf (file, "static const opus_int16 eBands%d_%d[%d] = {\n", mode->Fs, mdctSize, mode->nbEBands+2);
82          for (j=0;j<mode->nbEBands+2;j++)
83             fprintf (file, "%d, ", mode->eBands[j]);
84          fprintf (file, "};\n");
85          fprintf(file, "#endif\n");
86          fprintf(file, "\n");
87       }
88
89       fprintf(file, "#ifndef DEF_WINDOW%d\n", mode->overlap);
90       fprintf(file, "#define DEF_WINDOW%d\n", mode->overlap);
91       fprintf (file, "static const opus_val16 window%d[%d] = {\n", mode->overlap, mode->overlap);
92       for (j=0;j<mode->overlap;j++)
93          fprintf (file, WORD16 ",%c", mode->window[j],(j+6)%5==0?'\n':' ');
94       fprintf (file, "};\n");
95       fprintf(file, "#endif\n");
96       fprintf(file, "\n");
97
98       if (!standard)
99       {
100          fprintf(file, "#ifndef DEF_ALLOC_VECTORS%d_%d\n", mode->Fs, mdctSize);
101          fprintf(file, "#define DEF_ALLOC_VECTORS%d_%d\n", mode->Fs, mdctSize);
102          fprintf (file, "static const unsigned char allocVectors%d_%d[%d] = {\n", mode->Fs, mdctSize, mode->nbEBands*mode->nbAllocVectors);
103          for (j=0;j<mode->nbAllocVectors;j++)
104          {
105             for (k=0;k<mode->nbEBands;k++)
106                fprintf (file, "%2d, ", mode->allocVectors[j*mode->nbEBands+k]);
107             fprintf (file, "\n");
108          }
109          fprintf (file, "};\n");
110          fprintf(file, "#endif\n");
111          fprintf(file, "\n");
112       }
113
114       fprintf(file, "#ifndef DEF_LOGN%d\n", framerate);
115       fprintf(file, "#define DEF_LOGN%d\n", framerate);
116       fprintf (file, "static const opus_int16 logN%d[%d] = {\n", framerate, mode->nbEBands);
117       for (j=0;j<mode->nbEBands;j++)
118          fprintf (file, "%d, ", mode->logN[j]);
119       fprintf (file, "};\n");
120       fprintf(file, "#endif\n");
121       fprintf(file, "\n");
122
123       /* Pulse cache */
124       fprintf(file, "#ifndef DEF_PULSE_CACHE%d\n", mode->Fs/mdctSize);
125       fprintf(file, "#define DEF_PULSE_CACHE%d\n", mode->Fs/mdctSize);
126       fprintf (file, "static const opus_int16 cache_index%d[%d] = {\n", mode->Fs/mdctSize, (mode->maxLM+2)*mode->nbEBands);
127       for (j=0;j<mode->nbEBands*(mode->maxLM+2);j++)
128          fprintf (file, "%d,%c", mode->cache.index[j],(j+16)%15==0?'\n':' ');
129       fprintf (file, "};\n");
130       fprintf (file, "static const unsigned char cache_bits%d[%d] = {\n", mode->Fs/mdctSize, mode->cache.size);
131       for (j=0;j<mode->cache.size;j++)
132          fprintf (file, "%d,%c", mode->cache.bits[j],(j+16)%15==0?'\n':' ');
133       fprintf (file, "};\n");
134       fprintf (file, "static const unsigned char cache_caps%d[%d] = {\n", mode->Fs/mdctSize, (mode->maxLM+1)*2*mode->nbEBands);
135       for (j=0;j<(mode->maxLM+1)*2*mode->nbEBands;j++)
136          fprintf (file, "%d,%c", mode->cache.caps[j],(j+16)%15==0?'\n':' ');
137       fprintf (file, "};\n");
138
139       fprintf(file, "#endif\n");
140       fprintf(file, "\n");
141
142       /* FFT twiddles */
143       fprintf(file, "#ifndef FFT_TWIDDLES%d_%d\n", mode->Fs, mdctSize);
144       fprintf(file, "#define FFT_TWIDDLES%d_%d\n", mode->Fs, mdctSize);
145       fprintf (file, "static const kiss_twiddle_cpx fft_twiddles%d_%d[%d] = {\n",
146             mode->Fs, mdctSize, mode->mdct.kfft[0]->nfft);
147       for (j=0;j<mode->mdct.kfft[0]->nfft;j++)
148          fprintf (file, "{" WORD16 ", " WORD16 "},%c", mode->mdct.kfft[0]->twiddles[j].r, mode->mdct.kfft[0]->twiddles[j].i,(j+3)%2==0?'\n':' ');
149       fprintf (file, "};\n");
150
151       /* FFT Bitrev tables */
152       for (k=0;k<=mode->mdct.maxshift;k++)
153       {
154          fprintf(file, "#ifndef FFT_BITREV%d\n", mode->mdct.kfft[k]->nfft);
155          fprintf(file, "#define FFT_BITREV%d\n", mode->mdct.kfft[k]->nfft);
156          fprintf (file, "static const opus_int16 fft_bitrev%d[%d] = {\n",
157                mode->mdct.kfft[k]->nfft, mode->mdct.kfft[k]->nfft);
158          for (j=0;j<mode->mdct.kfft[k]->nfft;j++)
159             fprintf (file, "%d,%c", mode->mdct.kfft[k]->bitrev[j],(j+16)%15==0?'\n':' ');
160          fprintf (file, "};\n");
161
162          fprintf(file, "#endif\n");
163          fprintf(file, "\n");
164       }
165
166       /* FFT States */
167       for (k=0;k<=mode->mdct.maxshift;k++)
168       {
169          fprintf(file, "#ifndef FFT_STATE%d_%d_%d\n", mode->Fs, mdctSize, k);
170          fprintf(file, "#define FFT_STATE%d_%d_%d\n", mode->Fs, mdctSize, k);
171          fprintf (file, "static const kiss_fft_state fft_state%d_%d_%d = {\n",
172                mode->Fs, mdctSize, k);
173          fprintf (file, "%d,\t/* nfft */\n", mode->mdct.kfft[k]->nfft);
174 #ifndef FIXED_POINT
175          fprintf (file, "%0.9ff,\t/* scale */\n", mode->mdct.kfft[k]->scale);
176 #endif
177          fprintf (file, "%d,\t/* shift */\n", mode->mdct.kfft[k]->shift);
178          fprintf (file, "{");
179          for (j=0;j<2*MAXFACTORS;j++)
180             fprintf (file, "%d, ", mode->mdct.kfft[k]->factors[j]);
181          fprintf (file, "},\t/* factors */\n");
182          fprintf (file, "fft_bitrev%d,\t/* bitrev */\n", mode->mdct.kfft[k]->nfft);
183          fprintf (file, "fft_twiddles%d_%d,\t/* bitrev */\n", mode->Fs, mdctSize);
184          fprintf (file, "};\n");
185
186          fprintf(file, "#endif\n");
187          fprintf(file, "\n");
188       }
189
190       fprintf(file, "#endif\n");
191       fprintf(file, "\n");
192
193       /* MDCT twiddles */
194       fprintf(file, "#ifndef MDCT_TWIDDLES%d\n", mdctSize);
195       fprintf(file, "#define MDCT_TWIDDLES%d\n", mdctSize);
196       fprintf (file, "static const opus_val16 mdct_twiddles%d[%d] = {\n",
197             mdctSize, mode->mdct.n/4+1);
198       for (j=0;j<=mode->mdct.n/4;j++)
199          fprintf (file, WORD16 ",%c", mode->mdct.trig[j],(j+6)%5==0?'\n':' ');
200       fprintf (file, "};\n");
201
202       fprintf(file, "#endif\n");
203       fprintf(file, "\n");
204
205
206       /* Print the actual mode data */
207       fprintf(file, "static const CELTMode mode%d_%d_%d = {\n", mode->Fs, mdctSize, mode->overlap);
208       fprintf(file, INT32 ",\t/* Fs */\n", mode->Fs);
209       fprintf(file, "%d,\t/* overlap */\n", mode->overlap);
210       fprintf(file, "%d,\t/* nbEBands */\n", mode->nbEBands);
211       fprintf(file, "%d,\t/* effEBands */\n", mode->effEBands);
212       fprintf(file, "{");
213       for (j=0;j<4;j++)
214          fprintf(file, WORD16 ", ", mode->preemph[j]);
215       fprintf(file, "},\t/* preemph */\n");
216       if (standard)
217          fprintf(file, "eband5ms,\t/* eBands */\n");
218       else
219          fprintf(file, "eBands%d_%d,\t/* eBands */\n", mode->Fs, mdctSize);
220
221       fprintf(file, "%d,\t/* maxLM */\n", mode->maxLM);
222       fprintf(file, "%d,\t/* nbShortMdcts */\n", mode->nbShortMdcts);
223       fprintf(file, "%d,\t/* shortMdctSize */\n", mode->shortMdctSize);
224
225       fprintf(file, "%d,\t/* nbAllocVectors */\n", mode->nbAllocVectors);
226       if (standard)
227          fprintf(file, "band_allocation,\t/* allocVectors */\n");
228       else
229          fprintf(file, "allocVectors%d_%d,\t/* allocVectors */\n", mode->Fs, mdctSize);
230
231       fprintf(file, "logN%d,\t/* logN */\n", framerate);
232       fprintf(file, "window%d,\t/* window */\n", mode->overlap);
233       fprintf(file, "{%d, %d, {", mode->mdct.n, mode->mdct.maxshift);
234       for (k=0;k<=mode->mdct.maxshift;k++)
235          fprintf(file, "&fft_state%d_%d_%d, ", mode->Fs, mdctSize, k);
236       fprintf (file, "}, mdct_twiddles%d},\t/* mdct */\n", mdctSize);
237
238       fprintf(file, "{%d, cache_index%d, cache_bits%d, cache_caps%d},\t/* cache */\n",
239             mode->cache.size, mode->Fs/mdctSize, mode->Fs/mdctSize, mode->Fs/mdctSize);
240       fprintf(file, "};\n");
241    }
242    fprintf(file, "\n");
243    fprintf(file, "/* List of all the available modes */\n");
244    fprintf(file, "#define TOTAL_MODES %d\n", nb_modes);
245    fprintf(file, "static const CELTMode * const static_mode_list[TOTAL_MODES] = {\n");
246    for (i=0;i<nb_modes;i++)
247    {
248       CELTMode *mode = modes[i];
249       int mdctSize;
250       mdctSize = mode->shortMdctSize*mode->nbShortMdcts;
251       fprintf(file, "&mode%d_%d_%d,\n", mode->Fs, mdctSize, mode->overlap);
252    }
253    fprintf(file, "};\n");
254 }
255
256 void dump_header(FILE *file, CELTMode **modes, int nb_modes)
257 {
258    int i;
259    int channels = 0;
260    int frame_size = 0;
261    int overlap = 0;
262    fprintf (file, "/* This header file is generated automatically*/\n");
263    for (i=0;i<nb_modes;i++)
264    {
265       CELTMode *mode = modes[i];
266       if (frame_size==0)
267          frame_size = mode->shortMdctSize*mode->nbShortMdcts;
268       else if (frame_size != mode->shortMdctSize*mode->nbShortMdcts)
269          frame_size = -1;
270       if (overlap==0)
271          overlap = mode->overlap;
272       else if (overlap != mode->overlap)
273          overlap = -1;
274    }
275    if (channels>0)
276    {
277       fprintf (file, "#define CHANNELS(mode) %d\n", channels);
278       if (channels==1)
279          fprintf (file, "#define DISABLE_STEREO\n");
280    }
281    if (frame_size>0)
282    {
283       fprintf (file, "#define FRAMESIZE(mode) %d\n", frame_size);
284    }
285    if (overlap>0)
286    {
287       fprintf (file, "#define OVERLAP(mode) %d\n", overlap);
288    }
289 }
290
291 #ifdef FIXED_POINT
292 #define BASENAME "static_modes_fixed"
293 #else
294 #define BASENAME "static_modes_float"
295 #endif
296
297 int main(int argc, char **argv)
298 {
299    int i, nb;
300    FILE *file;
301    CELTMode **m;
302    if (argc%2 != 1)
303    {
304       fprintf (stderr, "must have a multiple of 2 arguments\n");
305       return 1;
306    }
307    nb = (argc-1)/2;
308    m = malloc(nb*sizeof(CELTMode*));
309    for (i=0;i<nb;i++)
310    {
311       int Fs, frame;
312       Fs      = atoi(argv[2*i+1]);
313       frame   = atoi(argv[2*i+2]);
314       m[i] = celt_mode_create(Fs, frame, NULL);
315       if (m[i]==NULL)
316       {
317          fprintf(stderr,"Error creating mode with Fs=%s, frame_size=%s\n",
318                argv[2*i+1],argv[2*i+2]);
319          return EXIT_FAILURE;
320       }
321    }
322    file = fopen(BASENAME ".h", "w");
323    dump_modes(file, m, nb);
324    fclose(file);
325    for (i=0;i<nb;i++)
326       celt_mode_destroy(m[i]);
327    free(m);
328    return 0;
329 }