annotate mdct.c @ 6693:6f13852a9161 libavcodec

Skip blocks in B-frames reuse motion vectors from next reference frame. So if referenced blocks is 16x8, 8x16 or 8x8 partitions, skip block will have them too.
author kostya
date Sat, 26 Apr 2008 13:09:36 +0000
parents d9c48a85fd23
children b0820b8bd4dd
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 * MDCT/IMDCT 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: 3036
diff changeset
5 * This file is part of FFmpeg.
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3036
diff changeset
6 *
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3036
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: 3036
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: 3036
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: 3036
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: 2967
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 */
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
21 #include "dsputil.h"
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
22
1106
1e39f273ecd6 per file doxy
michaelni
parents: 970
diff changeset
23 /**
1e39f273ecd6 per file doxy
michaelni
parents: 970
diff changeset
24 * @file mdct.c
1e39f273ecd6 per file doxy
michaelni
parents: 970
diff changeset
25 * MDCT/IMDCT transforms.
1e39f273ecd6 per file doxy
michaelni
parents: 970
diff changeset
26 */
1e39f273ecd6 per file doxy
michaelni
parents: 970
diff changeset
27
6139
5077d1562573 Make the Kaiser-Bessel window generator a common function
andoma
parents: 3947
diff changeset
28 // Generate a Kaiser-Bessel Derived Window.
6142
a35b838ab955 Add variable alpha and size of half window for Kaiser-Bessel Derived window
superdump
parents: 6139
diff changeset
29 #define BESSEL_I0_ITER 50 // default: 50 iterations of Bessel I0 approximation
a35b838ab955 Add variable alpha and size of half window for Kaiser-Bessel Derived window
superdump
parents: 6139
diff changeset
30 void ff_kbd_window_init(float *window, float alpha, int n)
6139
5077d1562573 Make the Kaiser-Bessel window generator a common function
andoma
parents: 3947
diff changeset
31 {
5077d1562573 Make the Kaiser-Bessel window generator a common function
andoma
parents: 3947
diff changeset
32 int i, j;
5077d1562573 Make the Kaiser-Bessel window generator a common function
andoma
parents: 3947
diff changeset
33 double sum = 0.0, bessel, tmp;
6142
a35b838ab955 Add variable alpha and size of half window for Kaiser-Bessel Derived window
superdump
parents: 6139
diff changeset
34 double local_window[n];
a35b838ab955 Add variable alpha and size of half window for Kaiser-Bessel Derived window
superdump
parents: 6139
diff changeset
35 double alpha2 = (alpha * M_PI / n) * (alpha * M_PI / n);
6139
5077d1562573 Make the Kaiser-Bessel window generator a common function
andoma
parents: 3947
diff changeset
36
6142
a35b838ab955 Add variable alpha and size of half window for Kaiser-Bessel Derived window
superdump
parents: 6139
diff changeset
37 for (i = 0; i < n; i++) {
a35b838ab955 Add variable alpha and size of half window for Kaiser-Bessel Derived window
superdump
parents: 6139
diff changeset
38 tmp = i * (n - i) * alpha2;
6139
5077d1562573 Make the Kaiser-Bessel window generator a common function
andoma
parents: 3947
diff changeset
39 bessel = 1.0;
6142
a35b838ab955 Add variable alpha and size of half window for Kaiser-Bessel Derived window
superdump
parents: 6139
diff changeset
40 for (j = BESSEL_I0_ITER; j > 0; j--)
6139
5077d1562573 Make the Kaiser-Bessel window generator a common function
andoma
parents: 3947
diff changeset
41 bessel = bessel * tmp / (j * j) + 1;
5077d1562573 Make the Kaiser-Bessel window generator a common function
andoma
parents: 3947
diff changeset
42 sum += bessel;
5077d1562573 Make the Kaiser-Bessel window generator a common function
andoma
parents: 3947
diff changeset
43 local_window[i] = sum;
5077d1562573 Make the Kaiser-Bessel window generator a common function
andoma
parents: 3947
diff changeset
44 }
5077d1562573 Make the Kaiser-Bessel window generator a common function
andoma
parents: 3947
diff changeset
45
5077d1562573 Make the Kaiser-Bessel window generator a common function
andoma
parents: 3947
diff changeset
46 sum++;
6142
a35b838ab955 Add variable alpha and size of half window for Kaiser-Bessel Derived window
superdump
parents: 6139
diff changeset
47 for (i = 0; i < n; i++)
6139
5077d1562573 Make the Kaiser-Bessel window generator a common function
andoma
parents: 3947
diff changeset
48 window[i] = sqrt(local_window[i] / sum);
5077d1562573 Make the Kaiser-Bessel window generator a common function
andoma
parents: 3947
diff changeset
49 }
5077d1562573 Make the Kaiser-Bessel window generator a common function
andoma
parents: 3947
diff changeset
50
1106
1e39f273ecd6 per file doxy
michaelni
parents: 970
diff changeset
51 /**
1e39f273ecd6 per file doxy
michaelni
parents: 970
diff changeset
52 * init MDCT or IMDCT computation.
781
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
53 */
794
670009af4fc2 avoid name clash
bellard
parents: 781
diff changeset
54 int ff_mdct_init(MDCTContext *s, int nbits, int inverse)
781
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
55 {
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
56 int n, n4, i;
6498
d9c48a85fd23 improve precision in mdct.c using double for some temporaries
mru
parents: 6142
diff changeset
57 double alpha;
781
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
58
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
59 memset(s, 0, sizeof(*s));
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
60 n = 1 << nbits;
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
61 s->nbits = nbits;
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
62 s->n = n;
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
63 n4 = n >> 2;
970
a521e0ecc5a8 use av_malloc instead of malloc
bellard
parents: 794
diff changeset
64 s->tcos = av_malloc(n4 * sizeof(FFTSample));
781
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
65 if (!s->tcos)
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
66 goto fail;
970
a521e0ecc5a8 use av_malloc instead of malloc
bellard
parents: 794
diff changeset
67 s->tsin = av_malloc(n4 * sizeof(FFTSample));
781
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
68 if (!s->tsin)
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
69 goto fail;
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
70
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
71 for(i=0;i<n4;i++) {
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
72 alpha = 2 * M_PI * (i + 1.0 / 8.0) / n;
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
73 s->tcos[i] = -cos(alpha);
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
74 s->tsin[i] = -sin(alpha);
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
75 }
1879
dd63cb7e5080 fft_*() renamed into ff_fft_*() patch by (Gildas Bazin <gbazin at altern dot org>)
michael
parents: 1106
diff changeset
76 if (ff_fft_init(&s->fft, s->nbits - 2, inverse) < 0)
781
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
77 goto fail;
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
78 return 0;
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
79 fail:
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
80 av_freep(&s->tcos);
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
81 av_freep(&s->tsin);
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
82 return -1;
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
83 }
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
84
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
85 /* complex multiplication: p = a * b */
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
86 #define CMUL(pre, pim, are, aim, bre, bim) \
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
87 {\
6498
d9c48a85fd23 improve precision in mdct.c using double for some temporaries
mru
parents: 6142
diff changeset
88 double _are = (are);\
d9c48a85fd23 improve precision in mdct.c using double for some temporaries
mru
parents: 6142
diff changeset
89 double _aim = (aim);\
d9c48a85fd23 improve precision in mdct.c using double for some temporaries
mru
parents: 6142
diff changeset
90 double _bre = (bre);\
d9c48a85fd23 improve precision in mdct.c using double for some temporaries
mru
parents: 6142
diff changeset
91 double _bim = (bim);\
781
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
92 (pre) = _are * _bre - _aim * _bim;\
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
93 (pim) = _are * _bim + _aim * _bre;\
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
94 }
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
95
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
96 /**
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
97 * Compute inverse MDCT of size N = 2^nbits
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
98 * @param output N samples
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
99 * @param input N/2 samples
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
100 * @param tmp N/2 samples
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
101 */
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 1879
diff changeset
102 void ff_imdct_calc(MDCTContext *s, FFTSample *output,
794
670009af4fc2 avoid name clash
bellard
parents: 781
diff changeset
103 const FFTSample *input, FFTSample *tmp)
781
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
104 {
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
105 int k, n8, n4, n2, n, j;
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
106 const uint16_t *revtab = s->fft.revtab;
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
107 const FFTSample *tcos = s->tcos;
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
108 const FFTSample *tsin = s->tsin;
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
109 const FFTSample *in1, *in2;
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
110 FFTComplex *z = (FFTComplex *)tmp;
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
111
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
112 n = 1 << s->nbits;
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
113 n2 = n >> 1;
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
114 n4 = n >> 2;
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
115 n8 = n >> 3;
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 /* pre rotation */
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
118 in1 = input;
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
119 in2 = input + n2 - 1;
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
120 for(k = 0; k < n4; k++) {
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
121 j=revtab[k];
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
122 CMUL(z[j].re, z[j].im, *in2, *in1, tcos[k], tsin[k]);
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
123 in1 += 2;
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
124 in2 -= 2;
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
125 }
1879
dd63cb7e5080 fft_*() renamed into ff_fft_*() patch by (Gildas Bazin <gbazin at altern dot org>)
michael
parents: 1106
diff changeset
126 ff_fft_calc(&s->fft, z);
781
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
127
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
128 /* post rotation + reordering */
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
129 /* XXX: optimize */
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
130 for(k = 0; k < n4; k++) {
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
131 CMUL(z[k].re, z[k].im, z[k].re, z[k].im, tcos[k], tsin[k]);
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 for(k = 0; k < n8; k++) {
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
134 output[2*k] = -z[n8 + k].im;
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
135 output[n2-1-2*k] = z[n8 + k].im;
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 output[2*k+1] = z[n8-1-k].re;
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
138 output[n2-1-2*k-1] = -z[n8-1-k].re;
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
139
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
140 output[n2 + 2*k]=-z[k+n8].re;
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
141 output[n-1- 2*k]=-z[k+n8].re;
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
142
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
143 output[n2 + 2*k+1]=z[n8-k-1].im;
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
144 output[n-2 - 2 * k] = z[n8-k-1].im;
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
145 }
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 /**
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
149 * Compute MDCT of size N = 2^nbits
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
150 * @param input N samples
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
151 * @param out N/2 samples
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
152 * @param tmp temporary storage of N/2 samples
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
153 */
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 1879
diff changeset
154 void ff_mdct_calc(MDCTContext *s, FFTSample *out,
794
670009af4fc2 avoid name clash
bellard
parents: 781
diff changeset
155 const FFTSample *input, FFTSample *tmp)
781
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
156 {
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
157 int i, j, n, n8, n4, n2, n3;
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
158 FFTSample re, im, re1, im1;
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
159 const uint16_t *revtab = s->fft.revtab;
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
160 const FFTSample *tcos = s->tcos;
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
161 const FFTSample *tsin = s->tsin;
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
162 FFTComplex *x = (FFTComplex *)tmp;
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
163
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
164 n = 1 << s->nbits;
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
165 n2 = n >> 1;
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
166 n4 = n >> 2;
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
167 n8 = n >> 3;
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
168 n3 = 3 * n4;
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
169
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
170 /* pre rotation */
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
171 for(i=0;i<n8;i++) {
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
172 re = -input[2*i+3*n4] - input[n3-1-2*i];
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
173 im = -input[n4+2*i] + input[n4-1-2*i];
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
174 j = revtab[i];
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
175 CMUL(x[j].re, x[j].im, re, im, -tcos[i], tsin[i]);
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
176
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
177 re = input[2*i] - input[n2-1-2*i];
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
178 im = -(input[n2+2*i] + input[n-1-2*i]);
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
179 j = revtab[n8 + i];
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
180 CMUL(x[j].re, x[j].im, re, im, -tcos[n8 + i], tsin[n8 + i]);
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
181 }
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
182
1879
dd63cb7e5080 fft_*() renamed into ff_fft_*() patch by (Gildas Bazin <gbazin at altern dot org>)
michael
parents: 1106
diff changeset
183 ff_fft_calc(&s->fft, x);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 1879
diff changeset
184
781
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
185 /* post rotation */
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
186 for(i=0;i<n4;i++) {
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
187 re = x[i].re;
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
188 im = x[i].im;
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
189 CMUL(re1, im1, re, im, -tsin[i], -tcos[i]);
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
190 out[2*i] = im1;
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
191 out[n2-1-2*i] = re1;
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
192 }
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
193 }
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
194
794
670009af4fc2 avoid name clash
bellard
parents: 781
diff changeset
195 void ff_mdct_end(MDCTContext *s)
781
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
196 {
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
197 av_freep(&s->tcos);
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
198 av_freep(&s->tsin);
1879
dd63cb7e5080 fft_*() renamed into ff_fft_*() patch by (Gildas Bazin <gbazin at altern dot org>)
michael
parents: 1106
diff changeset
199 ff_fft_end(&s->fft);
781
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
200 }