Subversion Repositories Kolibri OS

Rev

Go to most recent revision | 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 CONFIG_FFT_FLOAT
  26. #define CONFIG_FFT_FLOAT 1
  27. #endif
  28.  
  29. #ifndef CONFIG_FFT_FIXED_32
  30. #define CONFIG_FFT_FIXED_32 0
  31. #endif
  32.  
  33. #include <stdint.h>
  34. #include "config.h"
  35. #include "libavutil/mem.h"
  36.  
  37. #if CONFIG_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 CONFIG_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 /* CONFIG_FFT_FIXED_32 */
  55.  
  56. #define FFT_NAME(x) x ## _fixed
  57.  
  58. typedef int16_t FFTSample;
  59.  
  60. #endif /* CONFIG_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 /* CONFIG_FFT_FLOAT */
  70.  
  71. typedef struct FFTDComplex {
  72.     FFTDouble re, im;
  73. } FFTDComplex;
  74.  
  75. /* FFT computation */
  76.  
  77. struct FFTContext {
  78.     int nbits;
  79.     int inverse;
  80.     uint16_t *revtab;
  81.     FFTComplex *tmp_buf;
  82.     int mdct_size; /* size of MDCT (i.e. number of input data * 2) */
  83.     int mdct_bits; /* n = 2^nbits */
  84.     /* pre/post rotation tables */
  85.     FFTSample *tcos;
  86.     FFTSample *tsin;
  87.     /**
  88.      * Do the permutation needed BEFORE calling fft_calc().
  89.      */
  90.     void (*fft_permute)(struct FFTContext *s, FFTComplex *z);
  91.     /**
  92.      * Do a complex FFT with the parameters defined in ff_fft_init(). The
  93.      * input data must be permuted before. No 1.0/sqrt(n) normalization is done.
  94.      */
  95.     void (*fft_calc)(struct FFTContext *s, FFTComplex *z);
  96.     void (*imdct_calc)(struct FFTContext *s, FFTSample *output, const FFTSample *input);
  97.     void (*imdct_half)(struct FFTContext *s, FFTSample *output, const FFTSample *input);
  98.     void (*mdct_calc)(struct FFTContext *s, FFTSample *output, const FFTSample *input);
  99.     void (*mdct_calcw)(struct FFTContext *s, FFTDouble *output, const FFTSample *input);
  100.     int fft_permutation;
  101. #define FF_FFT_PERM_DEFAULT   0
  102. #define FF_FFT_PERM_SWAP_LSBS 1
  103. #define FF_FFT_PERM_AVX       2
  104.     int mdct_permutation;
  105. #define FF_MDCT_PERM_NONE       0
  106. #define FF_MDCT_PERM_INTERLEAVE 1
  107. };
  108.  
  109. #if CONFIG_HARDCODED_TABLES
  110. #define COSTABLE_CONST const
  111. #else
  112. #define COSTABLE_CONST
  113. #endif
  114.  
  115. #define COSTABLE(size) \
  116.     COSTABLE_CONST DECLARE_ALIGNED(32, FFTSample, FFT_NAME(ff_cos_##size))[size/2]
  117.  
  118. extern COSTABLE(16);
  119. extern COSTABLE(32);
  120. extern COSTABLE(64);
  121. extern COSTABLE(128);
  122. extern COSTABLE(256);
  123. extern COSTABLE(512);
  124. extern COSTABLE(1024);
  125. extern COSTABLE(2048);
  126. extern COSTABLE(4096);
  127. extern COSTABLE(8192);
  128. extern COSTABLE(16384);
  129. extern COSTABLE(32768);
  130. extern COSTABLE(65536);
  131. extern COSTABLE_CONST FFTSample* const FFT_NAME(ff_cos_tabs)[17];
  132.  
  133. #define ff_init_ff_cos_tabs FFT_NAME(ff_init_ff_cos_tabs)
  134.  
  135. /**
  136.  * Initialize the cosine table in ff_cos_tabs[index]
  137.  * @param index index in ff_cos_tabs array of the table to initialize
  138.  */
  139. void ff_init_ff_cos_tabs(int index);
  140.  
  141. #define ff_fft_init FFT_NAME(ff_fft_init)
  142. #define ff_fft_end  FFT_NAME(ff_fft_end)
  143.  
  144. /**
  145.  * Set up a complex FFT.
  146.  * @param nbits           log2 of the length of the input array
  147.  * @param inverse         if 0 perform the forward transform, if 1 perform the inverse
  148.  */
  149. int ff_fft_init(FFTContext *s, int nbits, int inverse);
  150.  
  151. void ff_fft_init_x86(FFTContext *s);
  152. void ff_fft_init_arm(FFTContext *s);
  153. void ff_fft_init_mips(FFTContext *s);
  154. void ff_fft_init_ppc(FFTContext *s);
  155.  
  156. void ff_fft_fixed_init_arm(FFTContext *s);
  157.  
  158. void ff_fft_end(FFTContext *s);
  159.  
  160. #define ff_mdct_init FFT_NAME(ff_mdct_init)
  161. #define ff_mdct_end  FFT_NAME(ff_mdct_end)
  162.  
  163. int ff_mdct_init(FFTContext *s, int nbits, int inverse, double scale);
  164. void ff_mdct_end(FFTContext *s);
  165.  
  166. #endif /* AVCODEC_FFT_H */
  167.