OLD | NEW |
(Empty) | |
| 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 du
mp_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->F
s, 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]->twidd
les[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]->nff
t); |
| 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, mdctSi
ze, 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, mdc
tSize); |
| 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/mdc
tSize); |
| 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 } |
OLD | NEW |