X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Ffft.h;h=d1425ada62c9a5433911e151649febdfa636528d;hb=282c6a1a0ef3e8c8e180c15b39cfe5b89704d848;hp=f3e7d7aa4ed632073c960729f06a45631eacf8f4;hpb=1429224b04cd10ef0d81c1c0d6eae82a5afad4d8;p=ffmpeg diff --git a/libavcodec/fft.h b/libavcodec/fft.h index f3e7d7aa4ed..d1425ada62c 100644 --- a/libavcodec/fft.h +++ b/libavcodec/fft.h @@ -2,79 +2,104 @@ * Copyright (c) 2000, 2001, 2002 Fabrice Bellard * Copyright (c) 2002-2004 Michael Niedermayer * - * This file is part of FFmpeg. + * This file is part of Libav. * - * FFmpeg is free software; you can redistribute it and/or + * Libav is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * - * FFmpeg is distributed in the hope that it will be useful, + * Libav is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with FFmpeg; if not, write to the Free Software + * License along with Libav; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef AVCODEC_FFT_H #define AVCODEC_FFT_H +#ifndef CONFIG_FFT_FLOAT +#define CONFIG_FFT_FLOAT 1 +#endif + #include #include "config.h" #include "libavutil/mem.h" -/* FFT computation */ +#if CONFIG_FFT_FLOAT + +#include "avfft.h" + +#define FFT_NAME(x) x + +typedef float FFTDouble; + +#else + +#define FFT_NAME(x) x ## _fixed -/* NOTE: soon integer code will be added, so you must use the - FFTSample type */ -typedef float FFTSample; +typedef int16_t FFTSample; +typedef int FFTDouble; typedef struct FFTComplex { - FFTSample re, im; + int16_t re, im; } FFTComplex; -typedef struct FFTContext { +typedef struct FFTContext FFTContext; + +#endif /* CONFIG_FFT_FLOAT */ + +typedef struct FFTDComplex { + FFTDouble re, im; +} FFTDComplex; + +/* FFT computation */ + +struct FFTContext { int nbits; int inverse; uint16_t *revtab; - FFTComplex *exptab; - FFTComplex *exptab1; /* only used by SSE code */ FFTComplex *tmp_buf; int mdct_size; /* size of MDCT (i.e. number of input data * 2) */ int mdct_bits; /* n = 2^nbits */ /* pre/post rotation tables */ FFTSample *tcos; FFTSample *tsin; + /** + * Do the permutation needed BEFORE calling fft_calc(). + */ void (*fft_permute)(struct FFTContext *s, FFTComplex *z); + /** + * Do a complex FFT with the parameters defined in ff_fft_init(). The + * input data must be permuted before. No 1.0/sqrt(n) normalization is done. + */ void (*fft_calc)(struct FFTContext *s, FFTComplex *z); void (*imdct_calc)(struct FFTContext *s, FFTSample *output, const FFTSample *input); void (*imdct_half)(struct FFTContext *s, FFTSample *output, const FFTSample *input); void (*mdct_calc)(struct FFTContext *s, FFTSample *output, const FFTSample *input); - int split_radix; - int permutation; + void (*mdct_calcw)(struct FFTContext *s, FFTDouble *output, const FFTSample *input); + int fft_permutation; +#define FF_FFT_PERM_DEFAULT 0 +#define FF_FFT_PERM_SWAP_LSBS 1 +#define FF_FFT_PERM_AVX 2 + int mdct_permutation; #define FF_MDCT_PERM_NONE 0 #define FF_MDCT_PERM_INTERLEAVE 1 -} FFTContext; +}; #if CONFIG_HARDCODED_TABLES #define COSTABLE_CONST const -#define SINTABLE_CONST const -#define SINETABLE_CONST const #else #define COSTABLE_CONST -#define SINTABLE_CONST -#define SINETABLE_CONST #endif #define COSTABLE(size) \ - COSTABLE_CONST DECLARE_ALIGNED(16, FFTSample, ff_cos_##size)[size/2] -#define SINTABLE(size) \ - SINTABLE_CONST DECLARE_ALIGNED(16, FFTSample, ff_sin_##size)[size/2] -#define SINETABLE(size) \ - SINETABLE_CONST DECLARE_ALIGNED(16, float, ff_sine_##size)[size] + COSTABLE_CONST DECLARE_ALIGNED(32, FFTSample, FFT_NAME(ff_cos_##size))[size/2] + extern COSTABLE(16); extern COSTABLE(32); extern COSTABLE(64); @@ -88,157 +113,38 @@ extern COSTABLE(8192); extern COSTABLE(16384); extern COSTABLE(32768); extern COSTABLE(65536); -extern COSTABLE_CONST FFTSample* const ff_cos_tabs[17]; +extern COSTABLE_CONST FFTSample* const FFT_NAME(ff_cos_tabs)[17]; + +#define ff_init_ff_cos_tabs FFT_NAME(ff_init_ff_cos_tabs) /** - * Initializes the cosine table in ff_cos_tabs[index] - * \param index index in ff_cos_tabs array of the table to initialize + * Initialize the cosine table in ff_cos_tabs[index] + * @param index index in ff_cos_tabs array of the table to initialize */ void ff_init_ff_cos_tabs(int index); -extern SINTABLE(16); -extern SINTABLE(32); -extern SINTABLE(64); -extern SINTABLE(128); -extern SINTABLE(256); -extern SINTABLE(512); -extern SINTABLE(1024); -extern SINTABLE(2048); -extern SINTABLE(4096); -extern SINTABLE(8192); -extern SINTABLE(16384); -extern SINTABLE(32768); -extern SINTABLE(65536); +#define ff_fft_init FFT_NAME(ff_fft_init) +#define ff_fft_end FFT_NAME(ff_fft_end) /** - * Sets up a complex FFT. + * Set up a complex FFT. * @param nbits log2 of the length of the input array * @param inverse if 0 perform the forward transform, if 1 perform the inverse */ int ff_fft_init(FFTContext *s, int nbits, int inverse); -void ff_fft_permute_c(FFTContext *s, FFTComplex *z); -void ff_fft_calc_c(FFTContext *s, FFTComplex *z); -void ff_fft_init_altivec(FFTContext *s); -void ff_fft_init_mmx(FFTContext *s); +void ff_fft_init_x86(FFTContext *s); void ff_fft_init_arm(FFTContext *s); +void ff_fft_init_ppc(FFTContext *s); -/** - * Do the permutation needed BEFORE calling ff_fft_calc(). - */ -static inline void ff_fft_permute(FFTContext *s, FFTComplex *z) -{ - s->fft_permute(s, z); -} -/** - * Do a complex FFT with the parameters defined in ff_fft_init(). The - * input data must be permuted before. No 1.0/sqrt(n) normalization is done. - */ -static inline void ff_fft_calc(FFTContext *s, FFTComplex *z) -{ - s->fft_calc(s, z); -} -void ff_fft_end(FFTContext *s); - -/* MDCT computation */ - -static inline void ff_imdct_calc(FFTContext *s, FFTSample *output, const FFTSample *input) -{ - s->imdct_calc(s, output, input); -} -static inline void ff_imdct_half(FFTContext *s, FFTSample *output, const FFTSample *input) -{ - s->imdct_half(s, output, input); -} +void ff_fft_fixed_init_arm(FFTContext *s); -static inline void ff_mdct_calc(FFTContext *s, FFTSample *output, - const FFTSample *input) -{ - s->mdct_calc(s, output, input); -} - -/** - * Generate a Kaiser-Bessel Derived Window. - * @param window pointer to half window - * @param alpha determines window shape - * @param n size of half window - */ -void ff_kbd_window_init(float *window, float alpha, int n); +void ff_fft_end(FFTContext *s); -/** - * Generate a sine window. - * @param window pointer to half window - * @param n size of half window - */ -void ff_sine_window_init(float *window, int n); - -/** - * initialize the specified entry of ff_sine_windows - */ -void ff_init_ff_sine_windows(int index); -extern SINETABLE( 32); -extern SINETABLE( 64); -extern SINETABLE( 128); -extern SINETABLE( 256); -extern SINETABLE( 512); -extern SINETABLE(1024); -extern SINETABLE(2048); -extern SINETABLE(4096); -extern SINETABLE_CONST float * const ff_sine_windows[13]; +#define ff_mdct_init FFT_NAME(ff_mdct_init) +#define ff_mdct_end FFT_NAME(ff_mdct_end) int ff_mdct_init(FFTContext *s, int nbits, int inverse, double scale); -void ff_imdct_calc_c(FFTContext *s, FFTSample *output, const FFTSample *input); -void ff_imdct_half_c(FFTContext *s, FFTSample *output, const FFTSample *input); -void ff_mdct_calc_c(FFTContext *s, FFTSample *output, const FFTSample *input); void ff_mdct_end(FFTContext *s); -/* Real Discrete Fourier Transform */ - -enum RDFTransformType { - RDFT, - IRDFT, - RIDFT, - IRIDFT, -}; - -typedef struct { - int nbits; - int inverse; - int sign_convention; - - /* pre/post rotation tables */ - const FFTSample *tcos; - SINTABLE_CONST FFTSample *tsin; - FFTContext fft; -} RDFTContext; - -/** - * Sets up a real FFT. - * @param nbits log2 of the length of the input array - * @param trans the type of transform - */ -int ff_rdft_init(RDFTContext *s, int nbits, enum RDFTransformType trans); -void ff_rdft_calc(RDFTContext *s, FFTSample *data); -void ff_rdft_end(RDFTContext *s); - -/* Discrete Cosine Transform */ - -typedef struct { - int nbits; - int inverse; - FFTSample *data; - RDFTContext rdft; - const float *costab; - FFTSample *csc2; -} DCTContext; - -/** - * Sets up (Inverse)DCT. - * @param nbits log2 of the length of the input array - * @param inverse >0 forward transform, <0 inverse transform - */ -int ff_dct_init(DCTContext *s, int nbits, int inverse); -void ff_dct_calc(DCTContext *s, FFTSample *data); -void ff_dct_end (DCTContext *s); - #endif /* AVCODEC_FFT_H */