Mercurial > libavcodec.hg
comparison fft.h @ 11370:4b3da727d832 libavcodec
Move FFT parts from dsputil.h to fft.h
author | mru |
---|---|
date | Sat, 06 Mar 2010 14:34:46 +0000 |
parents | |
children | 4c7afa50df6f |
comparison
equal
deleted
inserted
replaced
11369:98970e51365a | 11370:4b3da727d832 |
---|---|
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 #include <stdint.h> | |
26 #include "config.h" | |
27 #include "libavutil/mem.h" | |
28 | |
29 /* FFT computation */ | |
30 | |
31 /* NOTE: soon integer code will be added, so you must use the | |
32 FFTSample type */ | |
33 typedef float FFTSample; | |
34 | |
35 typedef struct FFTComplex { | |
36 FFTSample re, im; | |
37 } FFTComplex; | |
38 | |
39 typedef struct FFTContext { | |
40 int nbits; | |
41 int inverse; | |
42 uint16_t *revtab; | |
43 FFTComplex *exptab; | |
44 FFTComplex *exptab1; /* only used by SSE code */ | |
45 FFTComplex *tmp_buf; | |
46 int mdct_size; /* size of MDCT (i.e. number of input data * 2) */ | |
47 int mdct_bits; /* n = 2^nbits */ | |
48 /* pre/post rotation tables */ | |
49 FFTSample *tcos; | |
50 FFTSample *tsin; | |
51 void (*fft_permute)(struct FFTContext *s, FFTComplex *z); | |
52 void (*fft_calc)(struct FFTContext *s, FFTComplex *z); | |
53 void (*imdct_calc)(struct FFTContext *s, FFTSample *output, const FFTSample *input); | |
54 void (*imdct_half)(struct FFTContext *s, FFTSample *output, const FFTSample *input); | |
55 void (*mdct_calc)(struct FFTContext *s, FFTSample *output, const FFTSample *input); | |
56 int split_radix; | |
57 int permutation; | |
58 #define FF_MDCT_PERM_NONE 0 | |
59 #define FF_MDCT_PERM_INTERLEAVE 1 | |
60 } FFTContext; | |
61 | |
62 #if CONFIG_HARDCODED_TABLES | |
63 #define COSTABLE_CONST const | |
64 #define SINTABLE_CONST const | |
65 #define SINETABLE_CONST const | |
66 #else | |
67 #define COSTABLE_CONST | |
68 #define SINTABLE_CONST | |
69 #define SINETABLE_CONST | |
70 #endif | |
71 | |
72 #define COSTABLE(size) \ | |
73 COSTABLE_CONST DECLARE_ALIGNED(16, FFTSample, ff_cos_##size)[size/2] | |
74 #define SINTABLE(size) \ | |
75 SINTABLE_CONST DECLARE_ALIGNED(16, FFTSample, ff_sin_##size)[size/2] | |
76 #define SINETABLE(size) \ | |
77 SINETABLE_CONST DECLARE_ALIGNED(16, float, ff_sine_##size)[size] | |
78 extern COSTABLE(16); | |
79 extern COSTABLE(32); | |
80 extern COSTABLE(64); | |
81 extern COSTABLE(128); | |
82 extern COSTABLE(256); | |
83 extern COSTABLE(512); | |
84 extern COSTABLE(1024); | |
85 extern COSTABLE(2048); | |
86 extern COSTABLE(4096); | |
87 extern COSTABLE(8192); | |
88 extern COSTABLE(16384); | |
89 extern COSTABLE(32768); | |
90 extern COSTABLE(65536); | |
91 extern COSTABLE_CONST FFTSample* const ff_cos_tabs[17]; | |
92 | |
93 /** | |
94 * Initializes the cosine table in ff_cos_tabs[index] | |
95 * \param index index in ff_cos_tabs array of the table to initialize | |
96 */ | |
97 void ff_init_ff_cos_tabs(int index); | |
98 | |
99 extern SINTABLE(16); | |
100 extern SINTABLE(32); | |
101 extern SINTABLE(64); | |
102 extern SINTABLE(128); | |
103 extern SINTABLE(256); | |
104 extern SINTABLE(512); | |
105 extern SINTABLE(1024); | |
106 extern SINTABLE(2048); | |
107 extern SINTABLE(4096); | |
108 extern SINTABLE(8192); | |
109 extern SINTABLE(16384); | |
110 extern SINTABLE(32768); | |
111 extern SINTABLE(65536); | |
112 | |
113 /** | |
114 * Sets up a complex FFT. | |
115 * @param nbits log2 of the length of the input array | |
116 * @param inverse if 0 perform the forward transform, if 1 perform the inverse | |
117 */ | |
118 int ff_fft_init(FFTContext *s, int nbits, int inverse); | |
119 void ff_fft_permute_c(FFTContext *s, FFTComplex *z); | |
120 void ff_fft_calc_c(FFTContext *s, FFTComplex *z); | |
121 | |
122 void ff_fft_init_altivec(FFTContext *s); | |
123 void ff_fft_init_mmx(FFTContext *s); | |
124 void ff_fft_init_arm(FFTContext *s); | |
125 | |
126 /** | |
127 * Do the permutation needed BEFORE calling ff_fft_calc(). | |
128 */ | |
129 static inline void ff_fft_permute(FFTContext *s, FFTComplex *z) | |
130 { | |
131 s->fft_permute(s, z); | |
132 } | |
133 /** | |
134 * Do a complex FFT with the parameters defined in ff_fft_init(). The | |
135 * input data must be permuted before. No 1.0/sqrt(n) normalization is done. | |
136 */ | |
137 static inline void ff_fft_calc(FFTContext *s, FFTComplex *z) | |
138 { | |
139 s->fft_calc(s, z); | |
140 } | |
141 void ff_fft_end(FFTContext *s); | |
142 | |
143 /* MDCT computation */ | |
144 | |
145 static inline void ff_imdct_calc(FFTContext *s, FFTSample *output, const FFTSample *input) | |
146 { | |
147 s->imdct_calc(s, output, input); | |
148 } | |
149 static inline void ff_imdct_half(FFTContext *s, FFTSample *output, const FFTSample *input) | |
150 { | |
151 s->imdct_half(s, output, input); | |
152 } | |
153 | |
154 static inline void ff_mdct_calc(FFTContext *s, FFTSample *output, | |
155 const FFTSample *input) | |
156 { | |
157 s->mdct_calc(s, output, input); | |
158 } | |
159 | |
160 /** | |
161 * Generate a Kaiser-Bessel Derived Window. | |
162 * @param window pointer to half window | |
163 * @param alpha determines window shape | |
164 * @param n size of half window | |
165 */ | |
166 void ff_kbd_window_init(float *window, float alpha, int n); | |
167 | |
168 /** | |
169 * Generate a sine window. | |
170 * @param window pointer to half window | |
171 * @param n size of half window | |
172 */ | |
173 void ff_sine_window_init(float *window, int n); | |
174 | |
175 /** | |
176 * initialize the specified entry of ff_sine_windows | |
177 */ | |
178 void ff_init_ff_sine_windows(int index); | |
179 extern SINETABLE( 32); | |
180 extern SINETABLE( 64); | |
181 extern SINETABLE( 128); | |
182 extern SINETABLE( 256); | |
183 extern SINETABLE( 512); | |
184 extern SINETABLE(1024); | |
185 extern SINETABLE(2048); | |
186 extern SINETABLE(4096); | |
187 extern SINETABLE_CONST float * const ff_sine_windows[13]; | |
188 | |
189 int ff_mdct_init(FFTContext *s, int nbits, int inverse, double scale); | |
190 void ff_imdct_calc_c(FFTContext *s, FFTSample *output, const FFTSample *input); | |
191 void ff_imdct_half_c(FFTContext *s, FFTSample *output, const FFTSample *input); | |
192 void ff_mdct_calc_c(FFTContext *s, FFTSample *output, const FFTSample *input); | |
193 void ff_mdct_end(FFTContext *s); | |
194 | |
195 /* Real Discrete Fourier Transform */ | |
196 | |
197 enum RDFTransformType { | |
198 RDFT, | |
199 IRDFT, | |
200 RIDFT, | |
201 IRIDFT, | |
202 }; | |
203 | |
204 typedef struct { | |
205 int nbits; | |
206 int inverse; | |
207 int sign_convention; | |
208 | |
209 /* pre/post rotation tables */ | |
210 const FFTSample *tcos; | |
211 SINTABLE_CONST FFTSample *tsin; | |
212 FFTContext fft; | |
213 } RDFTContext; | |
214 | |
215 /** | |
216 * Sets up a real FFT. | |
217 * @param nbits log2 of the length of the input array | |
218 * @param trans the type of transform | |
219 */ | |
220 int ff_rdft_init(RDFTContext *s, int nbits, enum RDFTransformType trans); | |
221 void ff_rdft_calc(RDFTContext *s, FFTSample *data); | |
222 void ff_rdft_end(RDFTContext *s); | |
223 | |
224 /* Discrete Cosine Transform */ | |
225 | |
226 typedef struct { | |
227 int nbits; | |
228 int inverse; | |
229 FFTSample *data; | |
230 RDFTContext rdft; | |
231 const float *costab; | |
232 FFTSample *csc2; | |
233 } DCTContext; | |
234 | |
235 /** | |
236 * Sets up (Inverse)DCT. | |
237 * @param nbits log2 of the length of the input array | |
238 * @param inverse >0 forward transform, <0 inverse transform | |
239 */ | |
240 int ff_dct_init(DCTContext *s, int nbits, int inverse); | |
241 void ff_dct_calc(DCTContext *s, FFTSample *data); | |
242 void ff_dct_end (DCTContext *s); | |
243 | |
244 #endif /* AVCODEC_FFT_H */ |