Updating static modes (not done yet)
[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    for (i=0;i<nb_modes;i++)
65    {
66       CELTMode *mode = modes[i];
67       fprintf(file, "#ifndef DEF_EBANDS%d_%d\n", mode->Fs, mode->mdctSize);
68       fprintf(file, "#define DEF_EBANDS%d_%d\n", mode->Fs, mode->mdctSize);
69       fprintf (file, "static const celt_int16 eBands%d_%d[%d] = {\n", mode->Fs, mode->mdctSize, mode->nbEBands+2);
70       for (j=0;j<mode->nbEBands+2;j++)
71          fprintf (file, "%d, ", mode->eBands[j]);
72       fprintf (file, "};\n");
73       fprintf(file, "#endif\n");
74       fprintf(file, "\n");
75       
76       
77       fprintf(file, "#ifndef DEF_WINDOW%d\n", mode->overlap);
78       fprintf(file, "#define DEF_WINDOW%d\n", mode->overlap);
79       fprintf (file, "static const celt_word16 window%d[%d] = {\n", mode->overlap, mode->overlap);
80       for (j=0;j<mode->overlap;j++)
81          fprintf (file, WORD16 ", ", mode->window[j]);
82       fprintf (file, "};\n");
83       fprintf(file, "#endif\n");
84       fprintf(file, "\n");
85       
86       fprintf(file, "#ifndef DEF_ALLOC_VECTORS%d_%d\n", mode->Fs, mode->mdctSize);
87       fprintf(file, "#define DEF_ALLOC_VECTORS%d_%d\n", mode->Fs, mode->mdctSize);
88       fprintf (file, "static const unsigned char allocVectors%d_%d[%d] = {\n", mode->Fs, mode->mdctSize, mode->nbEBands*mode->nbAllocVectors);
89       for (j=0;j<mode->nbAllocVectors;j++)
90       {
91          for (k=0;k<mode->nbEBands;k++)
92             fprintf (file, "%2d, ", mode->allocVectors[j*mode->nbEBands+k]);
93          fprintf (file, "\n");
94       }
95       fprintf (file, "};\n");
96       fprintf(file, "#endif\n");
97       fprintf(file, "\n");
98
99       for (k=0;(1<<k>>1)<=mode->nbShortMdcts;k++)
100       {
101          int mdctSize = mode->shortMdctSize;
102          if (k>=1)
103             mdctSize <<= k-1;
104          else
105             mdctSize >>= 1;
106          fprintf(file, "#ifndef DEF_ALLOC_CACHE%d_%d\n", mode->Fs, mdctSize);
107          fprintf(file, "#define DEF_ALLOC_CACHE%d_%d\n", mode->Fs, mdctSize);
108          for (j=0;j<mode->nbEBands;j++)
109          {
110             int m;
111             if (mode->_bits[k][j]==NULL)
112             {
113                fprintf (file, "#define allocCache_band%d_%d_%d NULL\n", j, mode->Fs, mdctSize);
114                continue;
115             }
116             if (j==0 || (mode->_bits[k][j] != mode->_bits[k][j-1]))
117             {
118                fprintf (file, "static const celt_int16 allocCache_band%d_%d_%d[MAX_PSEUDO] = {\n", j, mode->Fs, mdctSize);
119                for (m=0;m<MAX_PSEUDO;m++)
120                   fprintf (file, "%2d, ", mode->_bits[k][j][m]);
121                fprintf (file, "};\n");
122             } else {
123                fprintf (file, "#define allocCache_band%d_%d_%d allocCache_band%d_%d_%d\n", j, mode->Fs, mdctSize, j-1, mode->Fs, mdctSize);
124             }
125          }
126          fprintf (file, "static const celt_int16 *allocCache%d_%d[%d] = {\n", mode->Fs, mdctSize, mode->nbEBands);
127          for (j=0;j<mode->nbEBands;j++)
128          {
129             fprintf (file, "allocCache_band%d_%d_%d, ", j, mode->Fs, mdctSize);
130          }
131          fprintf (file, "};\n");
132          fprintf(file, "#endif\n");
133          fprintf(file, "\n");
134       }
135
136       fprintf(file, "#ifndef DEF_LOGN%d_%d\n", mode->Fs, mode->mdctSize);
137       fprintf(file, "#define DEF_LOGN%d_%d\n", mode->Fs, mode->mdctSize);
138       fprintf (file, "static const celt_int16 logN%d_%d[%d] = {\n", mode->Fs, mode->mdctSize, mode->nbEBands);
139       for (j=0;j<mode->nbEBands;j++)
140          fprintf (file, "%d, ", mode->logN[j]);
141       fprintf (file, "};\n");
142       fprintf(file, "#endif\n");
143       fprintf(file, "\n");
144
145       fprintf(file, "static const CELTMode mode%d_%d_%d = {\n", mode->Fs, mode->mdctSize, mode->overlap);
146       fprintf(file, "0x%x,\t/* marker */\n", 0xa110ca7e);
147       fprintf(file, INT32 ",\t/* Fs */\n", mode->Fs);
148       fprintf(file, "%d,\t/* overlap */\n", mode->overlap);
149       fprintf(file, "%d,\t/* mdctSize */\n", mode->mdctSize);
150       fprintf(file, "%d,\t/* nbEBands */\n", mode->nbEBands);
151       fprintf(file, "%d,\t/* pitchEnd */\n", mode->pitchEnd);
152       fprintf(file, "eBands%d_%d,\t/* eBands */\n", mode->Fs, mode->mdctSize);
153       fprintf(file, WORD16 ",\t/* ePredCoef */\n", mode->ePredCoef);
154       fprintf(file, "%d,\t/* nbAllocVectors */\n", mode->nbAllocVectors);
155       fprintf(file, "allocVectors%d_%d,\t/* allocVectors */\n", mode->Fs, mode->mdctSize);
156       fprintf(file, "NULL,\t/* bits */\n");
157       //fprintf(file, "allocCacheTop%d_%d,\t/* _bits */\n", mode->Fs, mode->mdctSize);
158       fprintf (file, "{ ");
159       for (k=0;(1<<k>>1)<=mode->nbShortMdcts;k++)
160       {
161          int mdctSize = mode->shortMdctSize;
162          if (k>=1)
163             mdctSize <<= k-1;
164          else
165             mdctSize >>= 1;
166          fprintf (file, "allocCache%d_%d, ", mode->Fs, mdctSize);
167       }
168       fprintf (file, "}, /* _bits */\n");
169
170       fprintf (file, "{ ");
171       for (k=0;(1<<k)<=mode->nbShortMdcts;k++)
172          fprintf(file, "{%d, 0, 0},\t ", 2*mode->shortMdctSize<<k);
173       fprintf (file, "}, /* mdct */\n");
174
175       fprintf(file, "window%d,\t/* window */\n", mode->overlap);
176       fprintf(file, "%d,\t/* nbShortMdcts */\n", mode->nbShortMdcts);
177       fprintf(file, "%d,\t/* shortMdctSize */\n", mode->shortMdctSize);
178       fprintf(file, "0,\t/* prob */\n");
179       fprintf(file, "logN%d_%d,\t/* logN */\n", mode->Fs, mode->mdctSize);
180       fprintf(file, "0x%x,\t/* marker */\n", 0xa110ca7e);
181       fprintf(file, "};\n");
182    }
183    fprintf(file, "\n");
184    fprintf(file, "/* List of all the available modes */\n");
185    fprintf(file, "#define TOTAL_MODES %d\n", nb_modes);
186    fprintf(file, "static const CELTMode * const static_mode_list[TOTAL_MODES] = {\n");
187    for (i=0;i<nb_modes;i++)
188    {
189       CELTMode *mode = modes[i];
190       fprintf(file, "&mode%d_%d_%d,\n", mode->Fs, mode->mdctSize, mode->overlap);
191    }
192    fprintf(file, "};\n");
193 }
194
195 void dump_header(FILE *file, CELTMode **modes, int nb_modes)
196 {
197    int i;
198    int channels = 0;
199    int frame_size = 0;
200    int overlap = 0;
201    fprintf (file, "/* This header file is generated automatically*/\n");
202    for (i=0;i<nb_modes;i++)
203    {
204       CELTMode *mode = modes[i];
205       if (frame_size==0)
206          frame_size = mode->mdctSize;
207       else if (frame_size != mode->mdctSize)
208          frame_size = -1;
209       if (overlap==0)
210          overlap = mode->overlap;
211       else if (overlap != mode->overlap)
212          overlap = -1;
213    }
214    if (channels>0)
215    {
216       fprintf (file, "#define CHANNELS(mode) %d\n", channels);
217       if (channels==1)
218          fprintf (file, "#define DISABLE_STEREO\n");
219    }
220    if (frame_size>0)
221    {
222       fprintf (file, "#define FRAMESIZE(mode) %d\n", frame_size);
223    }
224    if (overlap>0)
225    {
226       fprintf (file, "#define OVERLAP(mode) %d\n", overlap);
227    }
228 }
229
230 int main(int argc, char **argv)
231 {
232    int i, nb;
233    FILE *file;
234    CELTMode **m;
235    if (argc%2 != 1)
236    {
237       fprintf (stderr, "must have a multiple of 2 arguments\n");
238       return 1;
239    }
240    nb = (argc-1)/2;
241    m = malloc(nb*sizeof(CELTMode*));
242    for (i=0;i<nb;i++)
243    {
244       int Fs, frame;
245       Fs      = atoi(argv[2*i+1]);
246       frame   = atoi(argv[2*i+2]);
247       m[i] = celt_mode_create(Fs, frame, NULL);
248    }
249    file = fopen("static_modes.c", "w");
250    dump_modes(file, m, nb);
251    fclose(file);
252    file = fopen("static_modes.h", "w");
253    dump_header(file, m, nb);
254    fclose(file);
255    for (i=0;i<nb;i++)
256       celt_mode_destroy(m[i]);
257    free(m);
258    return 0;
259 }