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