Commit | Line | Data |
---|---|---|
2ba45a60 DM |
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 | }; | |
114 | ||
115 | #if CONFIG_HARDCODED_TABLES | |
116 | #define COSTABLE_CONST const | |
117 | #else | |
118 | #define COSTABLE_CONST | |
119 | #endif | |
120 | ||
121 | #define COSTABLE(size) \ | |
122 | COSTABLE_CONST DECLARE_ALIGNED(32, FFTSample, FFT_NAME(ff_cos_##size))[size/2] | |
123 | ||
124 | extern COSTABLE(16); | |
125 | extern COSTABLE(32); | |
126 | extern COSTABLE(64); | |
127 | extern COSTABLE(128); | |
128 | extern COSTABLE(256); | |
129 | extern COSTABLE(512); | |
130 | extern COSTABLE(1024); | |
131 | extern COSTABLE(2048); | |
132 | extern COSTABLE(4096); | |
133 | extern COSTABLE(8192); | |
134 | extern COSTABLE(16384); | |
135 | extern COSTABLE(32768); | |
136 | extern COSTABLE(65536); | |
137 | extern COSTABLE_CONST FFTSample* const FFT_NAME(ff_cos_tabs)[17]; | |
138 | ||
139 | #define ff_init_ff_cos_tabs FFT_NAME(ff_init_ff_cos_tabs) | |
140 | ||
141 | /** | |
142 | * Initialize the cosine table in ff_cos_tabs[index] | |
143 | * @param index index in ff_cos_tabs array of the table to initialize | |
144 | */ | |
145 | void ff_init_ff_cos_tabs(int index); | |
146 | ||
147 | #define ff_fft_init FFT_NAME(ff_fft_init) | |
148 | #define ff_fft_end FFT_NAME(ff_fft_end) | |
149 | ||
150 | /** | |
151 | * Set up a complex FFT. | |
152 | * @param nbits log2 of the length of the input array | |
153 | * @param inverse if 0 perform the forward transform, if 1 perform the inverse | |
154 | */ | |
155 | int ff_fft_init(FFTContext *s, int nbits, int inverse); | |
156 | ||
157 | void ff_fft_init_aarch64(FFTContext *s); | |
158 | void ff_fft_init_x86(FFTContext *s); | |
159 | void ff_fft_init_arm(FFTContext *s); | |
160 | void ff_fft_init_mips(FFTContext *s); | |
161 | void ff_fft_init_ppc(FFTContext *s); | |
162 | ||
163 | void ff_fft_fixed_init_arm(FFTContext *s); | |
164 | ||
165 | void ff_fft_end(FFTContext *s); | |
166 | ||
167 | #define ff_mdct_init FFT_NAME(ff_mdct_init) | |
168 | #define ff_mdct_end FFT_NAME(ff_mdct_end) | |
169 | ||
170 | int ff_mdct_init(FFTContext *s, int nbits, int inverse, double scale); | |
171 | void ff_mdct_end(FFTContext *s); | |
172 | ||
173 | #endif /* AVCODEC_FFT_H */ |