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 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 || argc<3) 303 { 304 fprintf (stderr, "Usage: %s rate frame_size [rate frame_size] [rate frame_size]...\n",argv[0]); 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] = opus_custom_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 opus_custom_mode_destroy(m[i]); 327 free(m); 328 return 0; 329 } 330