1 /* 2 * Copyright (c) 2000, 2001, 2002 Fabrice Bellard 3 * Copyright (c) 2002-2004 Michael Niedermayer <michaelni@gmx.at> 4 * 5 * This file is part of FFmpeg. 6 * 7 * FFmpeg is free software; you can redistribute it and/or 8 * modify it under the terms of the GNU Lesser General Public 9 * License as published by the Free Software Foundation; either 10 * version 2.1 of the License, or (at your option) any later version. 11 * 12 * FFmpeg is distributed in the hope that it will be useful, 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 15 * Lesser General Public License for more details. 16 * 17 * You should have received a copy of the GNU Lesser General Public 18 * License along with FFmpeg; if not, write to the Free Software 19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 20 */ 21 22 #ifndef AVCODEC_FFT_H 23 #define AVCODEC_FFT_H 24 25 #ifndef FFT_FLOAT 26 #define FFT_FLOAT 1 27 #endif 28 29 #ifndef FFT_FIXED_32 30 #define FFT_FIXED_32 0 31 #endif 32 33 #include <stdint.h> 34 #include "config.h" 35 36 #include "libavutil/mem_internal.h" 37 38 #if FFT_FLOAT 39 40 #include "avfft.h" 41 42 #define FFT_NAME(x) x 43 44 typedef float FFTDouble; 45 46 #else 47 48 #if FFT_FIXED_32 49 50 #define Q31(x) (int)((x)*2147483648.0 + 0.5) 51 #define FFT_NAME(x) x ## _fixed_32 52 53 typedef int32_t FFTSample; 54 55 #endif /* FFT_FIXED_32 */ 56 57 typedef struct FFTComplex { 58 FFTSample re, im; 59 } FFTComplex; 60 61 typedef int FFTDouble; 62 typedef struct FFTContext FFTContext; 63 64 #endif /* FFT_FLOAT */ 65 66 typedef struct FFTDComplex { 67 FFTDouble re, im; 68 } FFTDComplex; 69 70 /* FFT computation */ 71 72 enum fft_permutation_type { 73 FF_FFT_PERM_DEFAULT, 74 FF_FFT_PERM_SWAP_LSBS, 75 FF_FFT_PERM_AVX, 76 }; 77 78 enum mdct_permutation_type { 79 FF_MDCT_PERM_NONE, 80 FF_MDCT_PERM_INTERLEAVE, 81 }; 82 83 struct FFTContext { 84 int nbits; 85 int inverse; 86 uint16_t *revtab; 87 FFTComplex *tmp_buf; 88 int mdct_size; /* size of MDCT (i.e. number of input data * 2) */ 89 int mdct_bits; /* n = 2^nbits */ 90 /* pre/post rotation tables */ 91 FFTSample *tcos; 92 FFTSample *tsin; 93 /** 94 * Do the permutation needed BEFORE calling fft_calc(). 95 */ 96 void (*fft_permute)(struct FFTContext *s, FFTComplex *z); 97 /** 98 * Do a complex FFT with the parameters defined in ff_fft_init(). The 99 * input data must be permuted before. No 1.0/sqrt(n) normalization is done. 100 */ 101 void (*fft_calc)(struct FFTContext *s, FFTComplex *z); 102 void (*imdct_calc)(struct FFTContext *s, FFTSample *output, const FFTSample *input); 103 void (*imdct_half)(struct FFTContext *s, FFTSample *output, const FFTSample *input); 104 void (*mdct_calc)(struct FFTContext *s, FFTSample *output, const FFTSample *input); 105 enum fft_permutation_type fft_permutation; 106 enum mdct_permutation_type mdct_permutation; 107 uint32_t *revtab32; 108 }; 109 110 #if CONFIG_HARDCODED_TABLES 111 #define COSTABLE_CONST const 112 #define ff_init_ff_cos_tabs(index) 113 #else 114 #define COSTABLE_CONST 115 #define ff_init_ff_cos_tabs FFT_NAME(ff_init_ff_cos_tabs) 116 117 /** 118 * Initialize the cosine table in ff_cos_tabs[index] 119 * @param index index in ff_cos_tabs array of the table to initialize 120 */ 121 void ff_init_ff_cos_tabs(int index); 122 #endif 123 124 #define COSTABLE(size) \ 125 COSTABLE_CONST DECLARE_ALIGNED(32, FFTSample, FFT_NAME(ff_cos_##size))[size/2] 126 127 extern COSTABLE(16); 128 extern COSTABLE(32); 129 extern COSTABLE(64); 130 extern COSTABLE(128); 131 extern COSTABLE(256); 132 extern COSTABLE(512); 133 extern COSTABLE(1024); 134 extern COSTABLE(2048); 135 extern COSTABLE(4096); 136 extern COSTABLE(8192); 137 extern COSTABLE(16384); 138 extern COSTABLE(32768); 139 extern COSTABLE(65536); 140 extern COSTABLE(131072); 141 extern COSTABLE_CONST FFTSample* const FFT_NAME(ff_cos_tabs)[18]; 142 143 #define ff_fft_init FFT_NAME(ff_fft_init) 144 #define ff_fft_end FFT_NAME(ff_fft_end) 145 146 /** 147 * Set up a complex FFT. 148 * @param nbits log2 of the length of the input array 149 * @param inverse if 0 perform the forward transform, if 1 perform the inverse 150 */ 151 int ff_fft_init(FFTContext *s, int nbits, int inverse); 152 153 void ff_fft_init_aarch64(FFTContext *s); 154 void ff_fft_init_x86(FFTContext *s); 155 void ff_fft_init_arm(FFTContext *s); 156 void ff_fft_init_mips(FFTContext *s); 157 void ff_fft_init_ppc(FFTContext *s); 158 159 void ff_fft_end(FFTContext *s); 160 161 #define ff_mdct_init FFT_NAME(ff_mdct_init) 162 #define ff_mdct_end FFT_NAME(ff_mdct_end) 163 164 int ff_mdct_init(FFTContext *s, int nbits, int inverse, double scale); 165 void ff_mdct_end(FFTContext *s); 166 167 #endif /* AVCODEC_FFT_H */ 168