ffmpeg / libavcodec / fft.h @ e87a6f0d
History  View  Annotate  Download (3.53 KB)
1 
/*


2 
* Copyright (c) 2000, 2001, 2002 Fabrice Bellard

3 
* Copyright (c) 20022004 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 021101301 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 
#include "avfft.h" 
29  
30 
/* FFT computation */

31  
32 
struct FFTContext {

33 
int nbits;

34 
int inverse;

35 
uint16_t *revtab; 
36 
FFTComplex *tmp_buf; 
37 
int mdct_size; /* size of MDCT (i.e. number of input data * 2) */ 
38 
int mdct_bits; /* n = 2^nbits */ 
39 
/* pre/post rotation tables */

40 
FFTSample *tcos; 
41 
FFTSample *tsin; 
42 
/**

43 
* Do the permutation needed BEFORE calling fft_calc().

44 
*/

45 
void (*fft_permute)(struct FFTContext *s, FFTComplex *z); 
46 
/**

47 
* Do a complex FFT with the parameters defined in ff_fft_init(). The

48 
* input data must be permuted before. No 1.0/sqrt(n) normalization is done.

49 
*/

50 
void (*fft_calc)(struct FFTContext *s, FFTComplex *z); 
51 
void (*imdct_calc)(struct FFTContext *s, FFTSample *output, const FFTSample *input); 
52 
void (*imdct_half)(struct FFTContext *s, FFTSample *output, const FFTSample *input); 
53 
void (*mdct_calc)(struct FFTContext *s, FFTSample *output, const FFTSample *input); 
54 
int fft_permutation;

55 
#define FF_FFT_PERM_DEFAULT 0 
56 
#define FF_FFT_PERM_SWAP_LSBS 1 
57 
int mdct_permutation;

58 
#define FF_MDCT_PERM_NONE 0 
59 
#define FF_MDCT_PERM_INTERLEAVE 1 
60 
}; 
61  
62 
#if CONFIG_HARDCODED_TABLES

63 
#define COSTABLE_CONST const 
64 
#else

65 
#define COSTABLE_CONST

66 
#endif

67  
68 
#define COSTABLE(size) \

69 
COSTABLE_CONST DECLARE_ALIGNED(16, FFTSample, ff_cos_##size)[size/2] 
70  
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 
* Initialize 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 
/**

93 
* Set up a complex FFT.

94 
* @param nbits log2 of the length of the input array

95 
* @param inverse if 0 perform the forward transform, if 1 perform the inverse

96 
*/

97 
int ff_fft_init(FFTContext *s, int nbits, int inverse); 
98  
99 
void ff_fft_init_altivec(FFTContext *s);

100 
void ff_fft_init_mmx(FFTContext *s);

101 
void ff_fft_init_arm(FFTContext *s);

102  
103 
void ff_fft_end(FFTContext *s);

104  
105 
int ff_mdct_init(FFTContext *s, int nbits, int inverse, double scale); 
106 
void ff_imdct_calc_c(FFTContext *s, FFTSample *output, const FFTSample *input); 
107 
void ff_imdct_half_c(FFTContext *s, FFTSample *output, const FFTSample *input); 
108 
void ff_mdct_calc_c(FFTContext *s, FFTSample *output, const FFTSample *input); 
109 
void ff_mdct_end(FFTContext *s);

110  
111 
#endif /* AVCODEC_FFT_H */ 