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