Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  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 */
  174.