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