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 Libav. 6 * 7 * Libav 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 * Libav 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 Libav; 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 #include <stdint.h> 30 #include "config.h" 31 #include "libavutil/mem.h" 32 33 #if FFT_FLOAT 34 35 #include "avfft.h" 36 37 #define FFT_NAME(x) x 38 39 typedef float FFTDouble; 40 41 #else 42 43 #define FFT_NAME(x) x ## _fixed 44 45 typedef int16_t FFTSample; 46 typedef int FFTDouble; 47 48 typedef struct FFTComplex { 49 int16_t re, im; 50 } FFTComplex; 51 52 typedef struct FFTContext FFTContext; 53 54 #endif /* FFT_FLOAT */ 55 56 typedef struct FFTDComplex { 57 FFTDouble re, im; 58 } FFTDComplex; 59 60 /* FFT computation */ 61 62 enum fft_permutation_type { 63 FF_FFT_PERM_DEFAULT, 64 FF_FFT_PERM_SWAP_LSBS, 65 FF_FFT_PERM_AVX, 66 }; 67 68 enum mdct_permutation_type { 69 FF_MDCT_PERM_NONE, 70 FF_MDCT_PERM_INTERLEAVE, 71 }; 72 73 struct FFTContext { 74 int nbits; 75 int inverse; 76 uint16_t *revtab; 77 FFTComplex *tmp_buf; 78 int mdct_size; /* size of MDCT (i.e. number of input data * 2) */ 79 int mdct_bits; /* n = 2^nbits */ 80 /* pre/post rotation tables */ 81 FFTSample *tcos; 82 FFTSample *tsin; 83 /** 84 * Do the permutation needed BEFORE calling fft_calc(). 85 */ 86 void (*fft_permute)(struct FFTContext *s, FFTComplex *z); 87 /** 88 * Do a complex FFT with the parameters defined in ff_fft_init(). The 89 * input data must be permuted before. No 1.0/sqrt(n) normalization is done. 90 */ 91 void (*fft_calc)(struct FFTContext *s, FFTComplex *z); 92 void (*imdct_calc)(struct FFTContext *s, FFTSample *output, const FFTSample *input); 93 void (*imdct_half)(struct FFTContext *s, FFTSample *output, const FFTSample *input); 94 void (*mdct_calc)(struct FFTContext *s, FFTSample *output, const FFTSample *input); 95 void (*mdct_calcw)(struct FFTContext *s, FFTDouble *output, const FFTSample *input); 96 enum fft_permutation_type fft_permutation; 97 enum mdct_permutation_type mdct_permutation; 98 }; 99 100 #if CONFIG_HARDCODED_TABLES 101 #define COSTABLE_CONST const 102 #else 103 #define COSTABLE_CONST 104 #endif 105 106 #define COSTABLE(size) \ 107 COSTABLE_CONST DECLARE_ALIGNED(32, FFTSample, FFT_NAME(ff_cos_##size))[size/2] 108 109 extern COSTABLE(16); 110 extern COSTABLE(32); 111 extern COSTABLE(64); 112 extern COSTABLE(128); 113 extern COSTABLE(256); 114 extern COSTABLE(512); 115 extern COSTABLE(1024); 116 extern COSTABLE(2048); 117 extern COSTABLE(4096); 118 extern COSTABLE(8192); 119 extern COSTABLE(16384); 120 extern COSTABLE(32768); 121 extern COSTABLE(65536); 122 extern COSTABLE_CONST FFTSample* const FFT_NAME(ff_cos_tabs)[17]; 123 124 #define ff_init_ff_cos_tabs FFT_NAME(ff_init_ff_cos_tabs) 125 126 /** 127 * Initialize the cosine table in ff_cos_tabs[index] 128 * @param index index in ff_cos_tabs array of the table to initialize 129 */ 130 void ff_init_ff_cos_tabs(int index); 131 132 #define ff_fft_init FFT_NAME(ff_fft_init) 133 #define ff_fft_end FFT_NAME(ff_fft_end) 134 135 /** 136 * Set up a complex FFT. 137 * @param nbits log2 of the length of the input array 138 * @param inverse if 0 perform the forward transform, if 1 perform the inverse 139 */ 140 int ff_fft_init(FFTContext *s, int nbits, int inverse); 141 142 void ff_fft_init_aarch64(FFTContext *s); 143 void ff_fft_init_x86(FFTContext *s); 144 void ff_fft_init_arm(FFTContext *s); 145 void ff_fft_init_ppc(FFTContext *s); 146 147 void ff_fft_fixed_init_arm(FFTContext *s); 148 149 void ff_fft_end(FFTContext *s); 150 151 #define ff_mdct_init FFT_NAME(ff_mdct_init) 152 #define ff_mdct_end FFT_NAME(ff_mdct_end) 153 154 int ff_mdct_init(FFTContext *s, int nbits, int inverse, double scale); 155 void ff_mdct_end(FFTContext *s); 156 157 #endif /* AVCODEC_FFT_H */ 158