annotate fft.c @ 5757:ace63c809071 libavcodec

Remove uses of SIGILL for CPU extension detection, that method is not acceptable in a library. Should not change anything for PPC, the autodetection is currently pointless due to other code being compiled with -maltivec as well (and detection for OSX and AmigaOS remains in place). SPARC binaries built with VIS support can now only run on systems with VIS.
author reimar
date Tue, 02 Oct 2007 18:18:35 +0000
parents c8c591fe26f8
children 311c95dddb16
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
781
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
1 /*
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
2 * FFT/IFFT transforms
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
3 * Copyright (c) 2002 Fabrice Bellard.
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
4 *
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3746
diff changeset
5 * This file is part of FFmpeg.
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3746
diff changeset
6 *
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3746
diff changeset
7 * FFmpeg is free software; you can redistribute it and/or
781
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
8 * modify it under the terms of the GNU Lesser General Public
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
9 * License as published by the Free Software Foundation; either
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3746
diff changeset
10 * version 2.1 of the License, or (at your option) any later version.
781
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
11 *
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3746
diff changeset
12 * FFmpeg is distributed in the hope that it will be useful,
781
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
15 * Lesser General Public License for more details.
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
16 *
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
17 * You should have received a copy of the GNU Lesser General Public
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3746
diff changeset
18 * License along with FFmpeg; if not, write to the Free Software
3036
0b546eab515d Update licensing information: The FSF changed postal address.
diego
parents: 2979
diff changeset
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
781
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
20 */
1106
1e39f273ecd6 per file doxy
michaelni
parents: 1009
diff changeset
21
1e39f273ecd6 per file doxy
michaelni
parents: 1009
diff changeset
22 /**
1e39f273ecd6 per file doxy
michaelni
parents: 1009
diff changeset
23 * @file fft.c
1e39f273ecd6 per file doxy
michaelni
parents: 1009
diff changeset
24 * FFT/IFFT transforms.
1e39f273ecd6 per file doxy
michaelni
parents: 1009
diff changeset
25 */
1e39f273ecd6 per file doxy
michaelni
parents: 1009
diff changeset
26
781
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
27 #include "dsputil.h"
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
28
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
29 /**
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
30 * The size of the FFT is 2^nbits. If inverse is TRUE, inverse FFT is
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 1879
diff changeset
31 * done
781
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
32 */
1879
dd63cb7e5080 fft_*() renamed into ff_fft_*() patch by (Gildas Bazin <gbazin at altern dot org>)
michael
parents: 1106
diff changeset
33 int ff_fft_init(FFTContext *s, int nbits, int inverse)
781
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
34 {
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
35 int i, j, m, n;
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
36 float alpha, c1, s1, s2;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 1879
diff changeset
37
781
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
38 s->nbits = nbits;
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
39 n = 1 << nbits;
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
40
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
41 s->exptab = av_malloc((n / 2) * sizeof(FFTComplex));
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
42 if (!s->exptab)
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
43 goto fail;
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
44 s->revtab = av_malloc(n * sizeof(uint16_t));
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
45 if (!s->revtab)
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
46 goto fail;
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
47 s->inverse = inverse;
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
48
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
49 s2 = inverse ? 1.0 : -1.0;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 1879
diff changeset
50
781
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
51 for(i=0;i<(n/2);i++) {
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
52 alpha = 2 * M_PI * (float)i / (float)n;
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
53 c1 = cos(alpha);
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
54 s1 = sin(alpha) * s2;
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
55 s->exptab[i].re = c1;
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
56 s->exptab[i].im = s1;
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
57 }
1879
dd63cb7e5080 fft_*() renamed into ff_fft_*() patch by (Gildas Bazin <gbazin at altern dot org>)
michael
parents: 1106
diff changeset
58 s->fft_calc = ff_fft_calc_c;
3555
5ea82888103e 3dnow2 implementation of imdct.
lorenm
parents: 3383
diff changeset
59 s->imdct_calc = ff_imdct_calc;
781
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
60 s->exptab1 = NULL;
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
61
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
62 /* compute constant table for HAVE_SSE version */
3590
a3d97c60ea07 ff_fft_calc_3dn/3dn2/sse: convert intrinsics to inline asm.
lorenm
parents: 3567
diff changeset
63 #if defined(HAVE_MMX) \
3567
1f8730f62765 r5954 broke fft on cpus with 3dnow but without mm3dnow.h
lorenm
parents: 3555
diff changeset
64 || (defined(HAVE_ALTIVEC) && !defined(ALTIVEC_USE_REFERENCE_C_CODE))
975
e05d525505c5 fft altivec by Romain Dolbeau - simplified patch, test it on PPC with fft-test and wma decoding
bellard
parents: 971
diff changeset
65 {
3567
1f8730f62765 r5954 broke fft on cpus with 3dnow but without mm3dnow.h
lorenm
parents: 3555
diff changeset
66 int has_vectors = mm_support();
781
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
67
3567
1f8730f62765 r5954 broke fft on cpus with 3dnow but without mm3dnow.h
lorenm
parents: 3555
diff changeset
68 if (has_vectors) {
975
e05d525505c5 fft altivec by Romain Dolbeau - simplified patch, test it on PPC with fft-test and wma decoding
bellard
parents: 971
diff changeset
69 #if defined(HAVE_MMX)
3746
2ec498208c6a sse implementation of imdct.
lorenm
parents: 3591
diff changeset
70 if (has_vectors & MM_3DNOWEXT) {
2ec498208c6a sse implementation of imdct.
lorenm
parents: 3591
diff changeset
71 /* 3DNowEx for K7/K8 */
3567
1f8730f62765 r5954 broke fft on cpus with 3dnow but without mm3dnow.h
lorenm
parents: 3555
diff changeset
72 s->imdct_calc = ff_imdct_calc_3dn2;
1f8730f62765 r5954 broke fft on cpus with 3dnow but without mm3dnow.h
lorenm
parents: 3555
diff changeset
73 s->fft_calc = ff_fft_calc_3dn2;
3746
2ec498208c6a sse implementation of imdct.
lorenm
parents: 3591
diff changeset
74 } else if (has_vectors & MM_3DNOW) {
3567
1f8730f62765 r5954 broke fft on cpus with 3dnow but without mm3dnow.h
lorenm
parents: 3555
diff changeset
75 /* 3DNow! for K6-2/3 */
1f8730f62765 r5954 broke fft on cpus with 3dnow but without mm3dnow.h
lorenm
parents: 3555
diff changeset
76 s->fft_calc = ff_fft_calc_3dn;
3746
2ec498208c6a sse implementation of imdct.
lorenm
parents: 3591
diff changeset
77 } else if (has_vectors & MM_SSE) {
3591
088be7d7c4fd use ff_fft_calc_3dn2 instead of sse on a K8.
lorenm
parents: 3590
diff changeset
78 /* SSE for P3/P4 */
3746
2ec498208c6a sse implementation of imdct.
lorenm
parents: 3591
diff changeset
79 s->imdct_calc = ff_imdct_calc_sse;
3567
1f8730f62765 r5954 broke fft on cpus with 3dnow but without mm3dnow.h
lorenm
parents: 3555
diff changeset
80 s->fft_calc = ff_fft_calc_sse;
3746
2ec498208c6a sse implementation of imdct.
lorenm
parents: 3591
diff changeset
81 }
3567
1f8730f62765 r5954 broke fft on cpus with 3dnow but without mm3dnow.h
lorenm
parents: 3555
diff changeset
82 #else /* HAVE_MMX */
1f8730f62765 r5954 broke fft on cpus with 3dnow but without mm3dnow.h
lorenm
parents: 3555
diff changeset
83 if (has_vectors & MM_ALTIVEC)
1f8730f62765 r5954 broke fft on cpus with 3dnow but without mm3dnow.h
lorenm
parents: 3555
diff changeset
84 s->fft_calc = ff_fft_calc_altivec;
1f8730f62765 r5954 broke fft on cpus with 3dnow but without mm3dnow.h
lorenm
parents: 3555
diff changeset
85 #endif
1f8730f62765 r5954 broke fft on cpus with 3dnow but without mm3dnow.h
lorenm
parents: 3555
diff changeset
86 }
1f8730f62765 r5954 broke fft on cpus with 3dnow but without mm3dnow.h
lorenm
parents: 3555
diff changeset
87 if (s->fft_calc != ff_fft_calc_c) {
975
e05d525505c5 fft altivec by Romain Dolbeau - simplified patch, test it on PPC with fft-test and wma decoding
bellard
parents: 971
diff changeset
88 int np, nblocks, np2, l;
e05d525505c5 fft altivec by Romain Dolbeau - simplified patch, test it on PPC with fft-test and wma decoding
bellard
parents: 971
diff changeset
89 FFTComplex *q;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 1879
diff changeset
90
975
e05d525505c5 fft altivec by Romain Dolbeau - simplified patch, test it on PPC with fft-test and wma decoding
bellard
parents: 971
diff changeset
91 np = 1 << nbits;
e05d525505c5 fft altivec by Romain Dolbeau - simplified patch, test it on PPC with fft-test and wma decoding
bellard
parents: 971
diff changeset
92 nblocks = np >> 3;
e05d525505c5 fft altivec by Romain Dolbeau - simplified patch, test it on PPC with fft-test and wma decoding
bellard
parents: 971
diff changeset
93 np2 = np >> 1;
e05d525505c5 fft altivec by Romain Dolbeau - simplified patch, test it on PPC with fft-test and wma decoding
bellard
parents: 971
diff changeset
94 s->exptab1 = av_malloc(np * 2 * sizeof(FFTComplex));
e05d525505c5 fft altivec by Romain Dolbeau - simplified patch, test it on PPC with fft-test and wma decoding
bellard
parents: 971
diff changeset
95 if (!s->exptab1)
e05d525505c5 fft altivec by Romain Dolbeau - simplified patch, test it on PPC with fft-test and wma decoding
bellard
parents: 971
diff changeset
96 goto fail;
e05d525505c5 fft altivec by Romain Dolbeau - simplified patch, test it on PPC with fft-test and wma decoding
bellard
parents: 971
diff changeset
97 q = s->exptab1;
e05d525505c5 fft altivec by Romain Dolbeau - simplified patch, test it on PPC with fft-test and wma decoding
bellard
parents: 971
diff changeset
98 do {
e05d525505c5 fft altivec by Romain Dolbeau - simplified patch, test it on PPC with fft-test and wma decoding
bellard
parents: 971
diff changeset
99 for(l = 0; l < np2; l += 2 * nblocks) {
e05d525505c5 fft altivec by Romain Dolbeau - simplified patch, test it on PPC with fft-test and wma decoding
bellard
parents: 971
diff changeset
100 *q++ = s->exptab[l];
e05d525505c5 fft altivec by Romain Dolbeau - simplified patch, test it on PPC with fft-test and wma decoding
bellard
parents: 971
diff changeset
101 *q++ = s->exptab[l + nblocks];
e05d525505c5 fft altivec by Romain Dolbeau - simplified patch, test it on PPC with fft-test and wma decoding
bellard
parents: 971
diff changeset
102
e05d525505c5 fft altivec by Romain Dolbeau - simplified patch, test it on PPC with fft-test and wma decoding
bellard
parents: 971
diff changeset
103 q->re = -s->exptab[l].im;
e05d525505c5 fft altivec by Romain Dolbeau - simplified patch, test it on PPC with fft-test and wma decoding
bellard
parents: 971
diff changeset
104 q->im = s->exptab[l].re;
e05d525505c5 fft altivec by Romain Dolbeau - simplified patch, test it on PPC with fft-test and wma decoding
bellard
parents: 971
diff changeset
105 q++;
e05d525505c5 fft altivec by Romain Dolbeau - simplified patch, test it on PPC with fft-test and wma decoding
bellard
parents: 971
diff changeset
106 q->re = -s->exptab[l + nblocks].im;
e05d525505c5 fft altivec by Romain Dolbeau - simplified patch, test it on PPC with fft-test and wma decoding
bellard
parents: 971
diff changeset
107 q->im = s->exptab[l + nblocks].re;
e05d525505c5 fft altivec by Romain Dolbeau - simplified patch, test it on PPC with fft-test and wma decoding
bellard
parents: 971
diff changeset
108 q++;
e05d525505c5 fft altivec by Romain Dolbeau - simplified patch, test it on PPC with fft-test and wma decoding
bellard
parents: 971
diff changeset
109 }
e05d525505c5 fft altivec by Romain Dolbeau - simplified patch, test it on PPC with fft-test and wma decoding
bellard
parents: 971
diff changeset
110 nblocks = nblocks >> 1;
e05d525505c5 fft altivec by Romain Dolbeau - simplified patch, test it on PPC with fft-test and wma decoding
bellard
parents: 971
diff changeset
111 } while (nblocks != 0);
e05d525505c5 fft altivec by Romain Dolbeau - simplified patch, test it on PPC with fft-test and wma decoding
bellard
parents: 971
diff changeset
112 av_freep(&s->exptab);
e05d525505c5 fft altivec by Romain Dolbeau - simplified patch, test it on PPC with fft-test and wma decoding
bellard
parents: 971
diff changeset
113 }
781
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
114 }
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
115 #endif
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
116
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
117 /* compute bit reverse table */
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
118
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
119 for(i=0;i<n;i++) {
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
120 m=0;
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
121 for(j=0;j<nbits;j++) {
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
122 m |= ((i >> j) & 1) << (nbits-j-1);
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
123 }
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
124 s->revtab[i]=m;
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
125 }
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
126 return 0;
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
127 fail:
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
128 av_freep(&s->revtab);
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
129 av_freep(&s->exptab);
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
130 av_freep(&s->exptab1);
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
131 return -1;
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
132 }
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
133
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
134 /* butter fly op */
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
135 #define BF(pre, pim, qre, qim, pre1, pim1, qre1, qim1) \
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
136 {\
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
137 FFTSample ax, ay, bx, by;\
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
138 bx=pre1;\
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
139 by=pim1;\
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
140 ax=qre1;\
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
141 ay=qim1;\
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
142 pre = (bx + ax);\
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
143 pim = (by + ay);\
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
144 qre = (bx - ax);\
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
145 qim = (by - ay);\
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
146 }
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
147
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
148 #define MUL16(a,b) ((a) * (b))
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
149
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
150 #define CMUL(pre, pim, are, aim, bre, bim) \
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
151 {\
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
152 pre = (MUL16(are, bre) - MUL16(aim, bim));\
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
153 pim = (MUL16(are, bim) + MUL16(bre, aim));\
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
154 }
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
155
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
156 /**
1879
dd63cb7e5080 fft_*() renamed into ff_fft_*() patch by (Gildas Bazin <gbazin at altern dot org>)
michael
parents: 1106
diff changeset
157 * Do a complex FFT with the parameters defined in ff_fft_init(). The
781
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
158 * input data must be permuted before with s->revtab table. No
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 1879
diff changeset
159 * 1.0/sqrt(n) normalization is done.
781
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
160 */
1879
dd63cb7e5080 fft_*() renamed into ff_fft_*() patch by (Gildas Bazin <gbazin at altern dot org>)
michael
parents: 1106
diff changeset
161 void ff_fft_calc_c(FFTContext *s, FFTComplex *z)
781
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
162 {
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
163 int ln = s->nbits;
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
164 int j, np, np2;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
165 int nblocks, nloops;
781
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
166 register FFTComplex *p, *q;
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
167 FFTComplex *exptab = s->exptab;
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
168 int l;
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
169 FFTSample tmp_re, tmp_im;
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
170
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
171 np = 1 << ln;
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
172
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
173 /* pass 0 */
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
174
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
175 p=&z[0];
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
176 j=(np >> 1);
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
177 do {
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 1879
diff changeset
178 BF(p[0].re, p[0].im, p[1].re, p[1].im,
781
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
179 p[0].re, p[0].im, p[1].re, p[1].im);
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
180 p+=2;
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
181 } while (--j != 0);
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
182
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
183 /* pass 1 */
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
184
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 1879
diff changeset
185
781
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
186 p=&z[0];
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
187 j=np >> 2;
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
188 if (s->inverse) {
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
189 do {
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 1879
diff changeset
190 BF(p[0].re, p[0].im, p[2].re, p[2].im,
781
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
191 p[0].re, p[0].im, p[2].re, p[2].im);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 1879
diff changeset
192 BF(p[1].re, p[1].im, p[3].re, p[3].im,
781
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
193 p[1].re, p[1].im, -p[3].im, p[3].re);
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
194 p+=4;
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
195 } while (--j != 0);
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
196 } else {
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
197 do {
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 1879
diff changeset
198 BF(p[0].re, p[0].im, p[2].re, p[2].im,
781
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
199 p[0].re, p[0].im, p[2].re, p[2].im);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 1879
diff changeset
200 BF(p[1].re, p[1].im, p[3].re, p[3].im,
781
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
201 p[1].re, p[1].im, p[3].im, -p[3].re);
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
202 p+=4;
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
203 } while (--j != 0);
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
204 }
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
205 /* pass 2 .. ln-1 */
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
206
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
207 nblocks = np >> 3;
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
208 nloops = 1 << 2;
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
209 np2 = np >> 1;
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
210 do {
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
211 p = z;
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
212 q = z + nloops;
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
213 for (j = 0; j < nblocks; ++j) {
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
214 BF(p->re, p->im, q->re, q->im,
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
215 p->re, p->im, q->re, q->im);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 1879
diff changeset
216
781
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
217 p++;
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
218 q++;
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
219 for(l = nblocks; l < np2; l += nblocks) {
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
220 CMUL(tmp_re, tmp_im, exptab[l].re, exptab[l].im, q->re, q->im);
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
221 BF(p->re, p->im, q->re, q->im,
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
222 p->re, p->im, tmp_re, tmp_im);
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
223 p++;
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
224 q++;
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
225 }
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
226
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
227 p += nloops;
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
228 q += nloops;
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
229 }
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
230 nblocks = nblocks >> 1;
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
231 nloops = nloops << 1;
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
232 } while (nblocks != 0);
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
233 }
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
234
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
235 /**
1879
dd63cb7e5080 fft_*() renamed into ff_fft_*() patch by (Gildas Bazin <gbazin at altern dot org>)
michael
parents: 1106
diff changeset
236 * Do the permutation needed BEFORE calling ff_fft_calc()
781
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
237 */
1879
dd63cb7e5080 fft_*() renamed into ff_fft_*() patch by (Gildas Bazin <gbazin at altern dot org>)
michael
parents: 1106
diff changeset
238 void ff_fft_permute(FFTContext *s, FFTComplex *z)
781
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
239 {
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
240 int j, k, np;
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
241 FFTComplex tmp;
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
242 const uint16_t *revtab = s->revtab;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 1879
diff changeset
243
781
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
244 /* reverse */
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
245 np = 1 << s->nbits;
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
246 for(j=0;j<np;j++) {
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
247 k = revtab[j];
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
248 if (k < j) {
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
249 tmp = z[k];
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
250 z[k] = z[j];
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
251 z[j] = tmp;
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
252 }
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
253 }
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
254 }
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
255
1879
dd63cb7e5080 fft_*() renamed into ff_fft_*() patch by (Gildas Bazin <gbazin at altern dot org>)
michael
parents: 1106
diff changeset
256 void ff_fft_end(FFTContext *s)
781
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
257 {
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
258 av_freep(&s->revtab);
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
259 av_freep(&s->exptab);
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
260 av_freep(&s->exptab1);
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
261 }
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
262