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