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