1e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org/* Copyright (c) 2008 CSIRO 2e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org Copyright (c) 2008-2009 Xiph.Org Foundation 3e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org Written by Jean-Marc Valin */ 4e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org/* 5e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org Redistribution and use in source and binary forms, with or without 6e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org modification, are permitted provided that the following conditions 7e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org are met: 8e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org 9e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org - Redistributions of source code must retain the above copyright 10e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org notice, this list of conditions and the following disclaimer. 11e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org 12e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org - Redistributions in binary form must reproduce the above copyright 13e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org notice, this list of conditions and the following disclaimer in the 14e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org documentation and/or other materials provided with the distribution. 15e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org 16e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 17e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 18e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 19e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER 20e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 21e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 22e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 23e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 24e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 25e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 26e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org*/ 28e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org 29e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#ifdef HAVE_CONFIG_H 30e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#include "config.h" 31e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#endif 32e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org 33e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#include <stdlib.h> 34e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#include <stdio.h> 35e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#include "modes.h" 36e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#include "celt.h" 37e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#include "rate.h" 38e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org 39e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#define INT16 "%d" 40e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#define INT32 "%d" 41e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#define FLOAT "%#0.8gf" 42e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org 43e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#ifdef FIXED_POINT 44e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#define WORD16 INT16 45e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#define WORD32 INT32 46e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#else 47e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#define WORD16 FLOAT 48e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#define WORD32 FLOAT 49e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#endif 50e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org 51e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.orgvoid dump_modes(FILE *file, CELTMode **modes, int nb_modes) 52e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org{ 53e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org int i, j, k; 54e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org fprintf(file, "/* The contents of this file was automatically generated by dump_modes.c\n"); 55e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org fprintf(file, " with arguments:"); 56e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org for (i=0;i<nb_modes;i++) 57e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org { 58e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org CELTMode *mode = modes[i]; 59e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org fprintf(file, " %d %d",mode->Fs,mode->shortMdctSize*mode->nbShortMdcts); 60e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org } 61e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org fprintf(file, "\n It contains static definitions for some pre-defined modes. */\n"); 62e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org fprintf(file, "#include \"modes.h\"\n"); 63e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org fprintf(file, "#include \"rate.h\"\n"); 64e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org 65e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org fprintf(file, "\n"); 66e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org 67e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org for (i=0;i<nb_modes;i++) 68e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org { 69e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org CELTMode *mode = modes[i]; 70e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org int mdctSize; 71e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org int standard, framerate; 72e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org 73e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org mdctSize = mode->shortMdctSize*mode->nbShortMdcts; 74e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org standard = (mode->Fs == 400*(opus_int32)mode->shortMdctSize); 75e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org framerate = mode->Fs/mode->shortMdctSize; 76e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org 77e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org if (!standard) 78e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org { 79e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org fprintf(file, "#ifndef DEF_EBANDS%d_%d\n", mode->Fs, mdctSize); 80e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org fprintf(file, "#define DEF_EBANDS%d_%d\n", mode->Fs, mdctSize); 81e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org fprintf (file, "static const opus_int16 eBands%d_%d[%d] = {\n", mode->Fs, mdctSize, mode->nbEBands+2); 82e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org for (j=0;j<mode->nbEBands+2;j++) 83e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org fprintf (file, "%d, ", mode->eBands[j]); 84e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org fprintf (file, "};\n"); 85e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org fprintf(file, "#endif\n"); 86e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org fprintf(file, "\n"); 87e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org } 88e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org 89e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org fprintf(file, "#ifndef DEF_WINDOW%d\n", mode->overlap); 90e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org fprintf(file, "#define DEF_WINDOW%d\n", mode->overlap); 91e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org fprintf (file, "static const opus_val16 window%d[%d] = {\n", mode->overlap, mode->overlap); 92e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org for (j=0;j<mode->overlap;j++) 93e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org fprintf (file, WORD16 ",%c", mode->window[j],(j+6)%5==0?'\n':' '); 94e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org fprintf (file, "};\n"); 95e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org fprintf(file, "#endif\n"); 96e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org fprintf(file, "\n"); 97e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org 98e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org if (!standard) 99e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org { 100e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org fprintf(file, "#ifndef DEF_ALLOC_VECTORS%d_%d\n", mode->Fs, mdctSize); 101e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org fprintf(file, "#define DEF_ALLOC_VECTORS%d_%d\n", mode->Fs, mdctSize); 102e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org fprintf (file, "static const unsigned char allocVectors%d_%d[%d] = {\n", mode->Fs, mdctSize, mode->nbEBands*mode->nbAllocVectors); 103e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org for (j=0;j<mode->nbAllocVectors;j++) 104e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org { 105e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org for (k=0;k<mode->nbEBands;k++) 106e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org fprintf (file, "%2d, ", mode->allocVectors[j*mode->nbEBands+k]); 107e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org fprintf (file, "\n"); 108e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org } 109e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org fprintf (file, "};\n"); 110e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org fprintf(file, "#endif\n"); 111e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org fprintf(file, "\n"); 112e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org } 113e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org 114e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org fprintf(file, "#ifndef DEF_LOGN%d\n", framerate); 115e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org fprintf(file, "#define DEF_LOGN%d\n", framerate); 116e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org fprintf (file, "static const opus_int16 logN%d[%d] = {\n", framerate, mode->nbEBands); 117e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org for (j=0;j<mode->nbEBands;j++) 118e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org fprintf (file, "%d, ", mode->logN[j]); 119e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org fprintf (file, "};\n"); 120e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org fprintf(file, "#endif\n"); 121e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org fprintf(file, "\n"); 122e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org 123e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org /* Pulse cache */ 124e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org fprintf(file, "#ifndef DEF_PULSE_CACHE%d\n", mode->Fs/mdctSize); 125e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org fprintf(file, "#define DEF_PULSE_CACHE%d\n", mode->Fs/mdctSize); 126e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org fprintf (file, "static const opus_int16 cache_index%d[%d] = {\n", mode->Fs/mdctSize, (mode->maxLM+2)*mode->nbEBands); 127e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org for (j=0;j<mode->nbEBands*(mode->maxLM+2);j++) 128e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org fprintf (file, "%d,%c", mode->cache.index[j],(j+16)%15==0?'\n':' '); 129e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org fprintf (file, "};\n"); 130e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org fprintf (file, "static const unsigned char cache_bits%d[%d] = {\n", mode->Fs/mdctSize, mode->cache.size); 131e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org for (j=0;j<mode->cache.size;j++) 132e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org fprintf (file, "%d,%c", mode->cache.bits[j],(j+16)%15==0?'\n':' '); 133e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org fprintf (file, "};\n"); 134e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org fprintf (file, "static const unsigned char cache_caps%d[%d] = {\n", mode->Fs/mdctSize, (mode->maxLM+1)*2*mode->nbEBands); 135e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org for (j=0;j<(mode->maxLM+1)*2*mode->nbEBands;j++) 136e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org fprintf (file, "%d,%c", mode->cache.caps[j],(j+16)%15==0?'\n':' '); 137e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org fprintf (file, "};\n"); 138e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org 139e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org fprintf(file, "#endif\n"); 140e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org fprintf(file, "\n"); 141e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org 142e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org /* FFT twiddles */ 143e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org fprintf(file, "#ifndef FFT_TWIDDLES%d_%d\n", mode->Fs, mdctSize); 144e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org fprintf(file, "#define FFT_TWIDDLES%d_%d\n", mode->Fs, mdctSize); 145e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org fprintf (file, "static const kiss_twiddle_cpx fft_twiddles%d_%d[%d] = {\n", 146e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org mode->Fs, mdctSize, mode->mdct.kfft[0]->nfft); 147e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org for (j=0;j<mode->mdct.kfft[0]->nfft;j++) 148e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org fprintf (file, "{" WORD16 ", " WORD16 "},%c", mode->mdct.kfft[0]->twiddles[j].r, mode->mdct.kfft[0]->twiddles[j].i,(j+3)%2==0?'\n':' '); 149e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org fprintf (file, "};\n"); 150e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org 151e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org /* FFT Bitrev tables */ 152e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org for (k=0;k<=mode->mdct.maxshift;k++) 153e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org { 154e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org fprintf(file, "#ifndef FFT_BITREV%d\n", mode->mdct.kfft[k]->nfft); 155e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org fprintf(file, "#define FFT_BITREV%d\n", mode->mdct.kfft[k]->nfft); 156e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org fprintf (file, "static const opus_int16 fft_bitrev%d[%d] = {\n", 157e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org mode->mdct.kfft[k]->nfft, mode->mdct.kfft[k]->nfft); 158e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org for (j=0;j<mode->mdct.kfft[k]->nfft;j++) 159e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org fprintf (file, "%d,%c", mode->mdct.kfft[k]->bitrev[j],(j+16)%15==0?'\n':' '); 160e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org fprintf (file, "};\n"); 161e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org 162e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org fprintf(file, "#endif\n"); 163e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org fprintf(file, "\n"); 164e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org } 165e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org 166e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org /* FFT States */ 167e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org for (k=0;k<=mode->mdct.maxshift;k++) 168e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org { 169e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org fprintf(file, "#ifndef FFT_STATE%d_%d_%d\n", mode->Fs, mdctSize, k); 170e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org fprintf(file, "#define FFT_STATE%d_%d_%d\n", mode->Fs, mdctSize, k); 171e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org fprintf (file, "static const kiss_fft_state fft_state%d_%d_%d = {\n", 172e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org mode->Fs, mdctSize, k); 173e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org fprintf (file, "%d,\t/* nfft */\n", mode->mdct.kfft[k]->nfft); 174e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#ifndef FIXED_POINT 175e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org fprintf (file, "%0.9ff,\t/* scale */\n", mode->mdct.kfft[k]->scale); 176e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#endif 177e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org fprintf (file, "%d,\t/* shift */\n", mode->mdct.kfft[k]->shift); 178e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org fprintf (file, "{"); 179e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org for (j=0;j<2*MAXFACTORS;j++) 180e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org fprintf (file, "%d, ", mode->mdct.kfft[k]->factors[j]); 181e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org fprintf (file, "},\t/* factors */\n"); 182e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org fprintf (file, "fft_bitrev%d,\t/* bitrev */\n", mode->mdct.kfft[k]->nfft); 183e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org fprintf (file, "fft_twiddles%d_%d,\t/* bitrev */\n", mode->Fs, mdctSize); 184e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org fprintf (file, "};\n"); 185e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org 186e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org fprintf(file, "#endif\n"); 187e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org fprintf(file, "\n"); 188e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org } 189e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org 190e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org fprintf(file, "#endif\n"); 191e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org fprintf(file, "\n"); 192e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org 193e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org /* MDCT twiddles */ 194e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org fprintf(file, "#ifndef MDCT_TWIDDLES%d\n", mdctSize); 195e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org fprintf(file, "#define MDCT_TWIDDLES%d\n", mdctSize); 196e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org fprintf (file, "static const opus_val16 mdct_twiddles%d[%d] = {\n", 197e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org mdctSize, mode->mdct.n/4+1); 198e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org for (j=0;j<=mode->mdct.n/4;j++) 199e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org fprintf (file, WORD16 ",%c", mode->mdct.trig[j],(j+6)%5==0?'\n':' '); 200e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org fprintf (file, "};\n"); 201e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org 202e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org fprintf(file, "#endif\n"); 203e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org fprintf(file, "\n"); 204e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org 205e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org 206e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org /* Print the actual mode data */ 207e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org fprintf(file, "static const CELTMode mode%d_%d_%d = {\n", mode->Fs, mdctSize, mode->overlap); 208e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org fprintf(file, INT32 ",\t/* Fs */\n", mode->Fs); 209e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org fprintf(file, "%d,\t/* overlap */\n", mode->overlap); 210e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org fprintf(file, "%d,\t/* nbEBands */\n", mode->nbEBands); 211e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org fprintf(file, "%d,\t/* effEBands */\n", mode->effEBands); 212e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org fprintf(file, "{"); 213e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org for (j=0;j<4;j++) 214e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org fprintf(file, WORD16 ", ", mode->preemph[j]); 215e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org fprintf(file, "},\t/* preemph */\n"); 216e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org if (standard) 217e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org fprintf(file, "eband5ms,\t/* eBands */\n"); 218e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org else 219e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org fprintf(file, "eBands%d_%d,\t/* eBands */\n", mode->Fs, mdctSize); 220e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org 221e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org fprintf(file, "%d,\t/* maxLM */\n", mode->maxLM); 222e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org fprintf(file, "%d,\t/* nbShortMdcts */\n", mode->nbShortMdcts); 223e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org fprintf(file, "%d,\t/* shortMdctSize */\n", mode->shortMdctSize); 224e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org 225e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org fprintf(file, "%d,\t/* nbAllocVectors */\n", mode->nbAllocVectors); 226e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org if (standard) 227e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org fprintf(file, "band_allocation,\t/* allocVectors */\n"); 228e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org else 229e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org fprintf(file, "allocVectors%d_%d,\t/* allocVectors */\n", mode->Fs, mdctSize); 230e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org 231e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org fprintf(file, "logN%d,\t/* logN */\n", framerate); 232e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org fprintf(file, "window%d,\t/* window */\n", mode->overlap); 233e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org fprintf(file, "{%d, %d, {", mode->mdct.n, mode->mdct.maxshift); 234e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org for (k=0;k<=mode->mdct.maxshift;k++) 235e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org fprintf(file, "&fft_state%d_%d_%d, ", mode->Fs, mdctSize, k); 236e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org fprintf (file, "}, mdct_twiddles%d},\t/* mdct */\n", mdctSize); 237e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org 238e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org fprintf(file, "{%d, cache_index%d, cache_bits%d, cache_caps%d},\t/* cache */\n", 239e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org mode->cache.size, mode->Fs/mdctSize, mode->Fs/mdctSize, mode->Fs/mdctSize); 240e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org fprintf(file, "};\n"); 241e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org } 242e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org fprintf(file, "\n"); 243e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org fprintf(file, "/* List of all the available modes */\n"); 244e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org fprintf(file, "#define TOTAL_MODES %d\n", nb_modes); 245e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org fprintf(file, "static const CELTMode * const static_mode_list[TOTAL_MODES] = {\n"); 246e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org for (i=0;i<nb_modes;i++) 247e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org { 248e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org CELTMode *mode = modes[i]; 249e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org int mdctSize; 250e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org mdctSize = mode->shortMdctSize*mode->nbShortMdcts; 251e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org fprintf(file, "&mode%d_%d_%d,\n", mode->Fs, mdctSize, mode->overlap); 252e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org } 253e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org fprintf(file, "};\n"); 254e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org} 255e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org 256e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.orgvoid dump_header(FILE *file, CELTMode **modes, int nb_modes) 257e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org{ 258e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org int i; 259e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org int channels = 0; 260e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org int frame_size = 0; 261e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org int overlap = 0; 262e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org fprintf (file, "/* This header file is generated automatically*/\n"); 263e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org for (i=0;i<nb_modes;i++) 264e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org { 265e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org CELTMode *mode = modes[i]; 266e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org if (frame_size==0) 267e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org frame_size = mode->shortMdctSize*mode->nbShortMdcts; 268e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org else if (frame_size != mode->shortMdctSize*mode->nbShortMdcts) 269e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org frame_size = -1; 270e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org if (overlap==0) 271e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org overlap = mode->overlap; 272e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org else if (overlap != mode->overlap) 273e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org overlap = -1; 274e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org } 275e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org if (channels>0) 276e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org { 277e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org fprintf (file, "#define CHANNELS(mode) %d\n", channels); 278e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org if (channels==1) 279e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org fprintf (file, "#define DISABLE_STEREO\n"); 280e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org } 281e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org if (frame_size>0) 282e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org { 283e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org fprintf (file, "#define FRAMESIZE(mode) %d\n", frame_size); 284e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org } 285e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org if (overlap>0) 286e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org { 287e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org fprintf (file, "#define OVERLAP(mode) %d\n", overlap); 288e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org } 289e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org} 290e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org 291e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#ifdef FIXED_POINT 292e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#define BASENAME "static_modes_fixed" 293e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#else 294e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#define BASENAME "static_modes_float" 295e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#endif 296e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org 297e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.orgint main(int argc, char **argv) 298e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org{ 299e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org int i, nb; 300e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org FILE *file; 301e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org CELTMode **m; 302e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org if (argc%2 != 1 || argc<3) 303e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org { 304e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org fprintf (stderr, "Usage: %s rate frame_size [rate frame_size] [rate frame_size]...\n",argv[0]); 305e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org return 1; 306e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org } 307e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org nb = (argc-1)/2; 308e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org m = malloc(nb*sizeof(CELTMode*)); 309e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org for (i=0;i<nb;i++) 310e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org { 311e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org int Fs, frame; 312e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org Fs = atoi(argv[2*i+1]); 313e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org frame = atoi(argv[2*i+2]); 314e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org m[i] = opus_custom_mode_create(Fs, frame, NULL); 315e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org if (m[i]==NULL) 316e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org { 317e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org fprintf(stderr,"Error creating mode with Fs=%s, frame_size=%s\n", 318e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org argv[2*i+1],argv[2*i+2]); 319e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org return EXIT_FAILURE; 320e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org } 321e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org } 322e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org file = fopen(BASENAME ".h", "w"); 323e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org dump_modes(file, m, nb); 324e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org fclose(file); 325e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org for (i=0;i<nb;i++) 326e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org opus_custom_mode_destroy(m[i]); 327e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org free(m); 328e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org return 0; 329e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org} 330