]> rtime.felk.cvut.cz Git - frescor/ffmpeg.git/blobdiff - libavcodec/fft.c
Added cancelation of contracts
[frescor/ffmpeg.git] / libavcodec / fft.c
index 7b0d3b3b61310b554f2ca85a1adf7a2b73c4d938..a3f115147210251fd07045cb936d053042dbae05 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * FFT/IFFT transforms
  * Copyright (c) 2008 Loren Merritt
- * Copyright (c) 2002 Fabrice Bellard.
+ * Copyright (c) 2002 Fabrice Bellard
  * Partly based on libdjbfft by D. J. Bernstein
  *
  * This file is part of FFmpeg.
@@ -22,7 +22,7 @@
  */
 
 /**
- * @file fft.c
+ * @file libavcodec/fft.c
  * FFT/IFFT transforms.
  */
 
@@ -42,7 +42,7 @@ DECLARE_ALIGNED_16(FFTSample, ff_cos_8192[4096]);
 DECLARE_ALIGNED_16(FFTSample, ff_cos_16384[8192]);
 DECLARE_ALIGNED_16(FFTSample, ff_cos_32768[16384]);
 DECLARE_ALIGNED_16(FFTSample, ff_cos_65536[32768]);
-static FFTSample *ff_cos_tabs[] = {
+FFTSample *ff_cos_tabs[] = {
     ff_cos_16, ff_cos_32, ff_cos_64, ff_cos_128, ff_cos_256, ff_cos_512, ff_cos_1024,
     ff_cos_2048, ff_cos_4096, ff_cos_8192, ff_cos_16384, ff_cos_32768, ff_cos_65536,
 };
@@ -58,11 +58,7 @@ static int split_radix_permutation(int i, int n, int inverse)
     else                  return split_radix_permutation(i, m, inverse)*4 - 1;
 }
 
-/**
- * The size of the FFT is 2^nbits. If inverse is TRUE, inverse FFT is
- * done
- */
-int ff_fft_init(FFTContext *s, int nbits, int inverse)
+av_cold int ff_fft_init(FFTContext *s, int nbits, int inverse)
 {
     int i, j, m, n;
     float alpha, c1, s1, s2;
@@ -75,7 +71,7 @@ int ff_fft_init(FFTContext *s, int nbits, int inverse)
     n = 1 << nbits;
 
     s->tmp_buf = NULL;
-    s->exptab = av_malloc((n / 2) * sizeof(FFTComplex));
+    s->exptab  = av_malloc((n / 2) * sizeof(FFTComplex));
     if (!s->exptab)
         goto fail;
     s->revtab = av_malloc(n * sizeof(uint16_t));
@@ -86,31 +82,33 @@ int ff_fft_init(FFTContext *s, int nbits, int inverse)
     s2 = inverse ? 1.0 : -1.0;
 
     s->fft_permute = ff_fft_permute_c;
-    s->fft_calc = ff_fft_calc_c;
-    s->imdct_calc = ff_imdct_calc;
-    s->imdct_half = ff_imdct_half;
-    s->exptab1 = NULL;
+    s->fft_calc    = ff_fft_calc_c;
+    s->imdct_calc  = ff_imdct_calc_c;
+    s->imdct_half  = ff_imdct_half_c;
+    s->exptab1     = NULL;
 
-#if defined HAVE_MMX && defined HAVE_YASM
+#if HAVE_MMX && HAVE_YASM
     has_vectors = mm_support();
-    if (has_vectors & MM_SSE) {
+    if (has_vectors & FF_MM_SSE && HAVE_SSE) {
         /* SSE for P3/P4/K8 */
-        s->imdct_calc = ff_imdct_calc_sse;
-        s->imdct_half = ff_imdct_half_sse;
+        s->imdct_calc  = ff_imdct_calc_sse;
+        s->imdct_half  = ff_imdct_half_sse;
         s->fft_permute = ff_fft_permute_sse;
-        s->fft_calc = ff_fft_calc_sse;
-    } else if (has_vectors & MM_3DNOWEXT) {
+        s->fft_calc    = ff_fft_calc_sse;
+    } else if (has_vectors & FF_MM_3DNOWEXT && HAVE_AMD3DNOWEXT) {
         /* 3DNowEx for K7 */
         s->imdct_calc = ff_imdct_calc_3dn2;
         s->imdct_half = ff_imdct_half_3dn2;
-        s->fft_calc = ff_fft_calc_3dn2;
-    } else if (has_vectors & MM_3DNOW) {
+        s->fft_calc   = ff_fft_calc_3dn2;
+    } else if (has_vectors & FF_MM_3DNOW && HAVE_AMD3DNOW) {
         /* 3DNow! for K6-2/3 */
-        s->fft_calc = ff_fft_calc_3dn;
+        s->imdct_calc = ff_imdct_calc_3dn;
+        s->imdct_half = ff_imdct_half_3dn;
+        s->fft_calc   = ff_fft_calc_3dn;
     }
-#elif defined HAVE_ALTIVEC && !defined ALTIVEC_USE_REFERENCE_C_CODE
+#elif HAVE_ALTIVEC
     has_vectors = mm_support();
-    if (has_vectors & MM_ALTIVEC) {
+    if (has_vectors & FF_MM_ALTIVEC) {
         s->fft_calc = ff_fft_calc_altivec;
         split_radix = 0;
     }
@@ -164,15 +162,14 @@ int ff_fft_init(FFTContext *s, int nbits, int inverse)
         } while (nblocks != 0);
         av_freep(&s->exptab);
 
-    /* compute bit reverse table */
-
-    for(i=0;i<n;i++) {
-        m=0;
-        for(j=0;j<nbits;j++) {
-            m |= ((i >> j) & 1) << (nbits-j-1);
+        /* compute bit reverse table */
+        for(i=0;i<n;i++) {
+            m=0;
+            for(j=0;j<nbits;j++) {
+                m |= ((i >> j) & 1) << (nbits-j-1);
+            }
+            s->revtab[i]=m;
         }
-        s->revtab[i]=m;
-    }
     }
 
     return 0;
@@ -184,9 +181,6 @@ int ff_fft_init(FFTContext *s, int nbits, int inverse)
     return -1;
 }
 
-/**
- * Do the permutation needed BEFORE calling ff_fft_calc()
- */
 void ff_fft_permute_c(FFTContext *s, FFTComplex *z)
 {
     int j, k, np;
@@ -212,7 +206,7 @@ void ff_fft_permute_c(FFTContext *s, FFTComplex *z)
     }
 }
 
-void ff_fft_end(FFTContext *s)
+av_cold void ff_fft_end(FFTContext *s)
 {
     av_freep(&s->revtab);
     av_freep(&s->exptab);
@@ -335,7 +329,7 @@ static void fft8(FFTComplex *z)
     TRANSFORM(z[1],z[3],z[5],z[7],sqrthalf,sqrthalf);
 }
 
-#ifndef CONFIG_SMALL
+#if !CONFIG_SMALL
 static void fft16(FFTComplex *z)
 {
     FFTSample t1, t2, t3, t4, t5, t6;
@@ -357,7 +351,7 @@ DECL_FFT(64,32,16)
 DECL_FFT(128,64,32)
 DECL_FFT(256,128,64)
 DECL_FFT(512,256,128)
-#ifndef CONFIG_SMALL
+#if !CONFIG_SMALL
 #define pass pass_big
 #endif
 DECL_FFT(1024,512,256)
@@ -373,11 +367,6 @@ static void (*fft_dispatch[])(FFTComplex*) = {
     fft2048, fft4096, fft8192, fft16384, fft32768, fft65536,
 };
 
-/**
- * Do a complex FFT with the parameters defined in ff_fft_init(). The
- * input data must be permuted before with s->revtab table. No
- * 1.0/sqrt(n) normalization is done.
- */
 void ff_fft_calc_c(FFTContext *s, FFTComplex *z)
 {
     fft_dispatch[s->nbits-2](z);