Mercurial > libavcodec.hg
annotate mdct.c @ 6323:e6da66f378c7 libavcodec
mpegvideo.h has two function declarations with the 'inline' specifier
but no definition for those functions. The C standard requires a
definition to appear in the same translation unit for any function
declared with 'inline'. Most of the files including mpegvideo.h do not
define those functions. Fix this by removing the 'inline' specifiers
from the header.
patch by Uoti Urpala
author | diego |
---|---|
date | Sun, 03 Feb 2008 17:54:30 +0000 |
parents | a35b838ab955 |
children | d9c48a85fd23 |
rev | line source |
---|---|
781 | 1 /* |
2 * MDCT/IMDCT transforms | |
3 * Copyright (c) 2002 Fabrice Bellard. | |
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 | 8 * modify it under the terms of the GNU Lesser General Public |
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 | 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 | 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 | |
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 | 20 */ |
21 #include "dsputil.h" | |
22 | |
1106 | 23 /** |
24 * @file mdct.c | |
25 * MDCT/IMDCT transforms. | |
26 */ | |
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 | 51 /** |
52 * init MDCT or IMDCT computation. | |
781 | 53 */ |
794 | 54 int ff_mdct_init(MDCTContext *s, int nbits, int inverse) |
781 | 55 { |
56 int n, n4, i; | |
57 float alpha; | |
58 | |
59 memset(s, 0, sizeof(*s)); | |
60 n = 1 << nbits; | |
61 s->nbits = nbits; | |
62 s->n = n; | |
63 n4 = n >> 2; | |
970 | 64 s->tcos = av_malloc(n4 * sizeof(FFTSample)); |
781 | 65 if (!s->tcos) |
66 goto fail; | |
970 | 67 s->tsin = av_malloc(n4 * sizeof(FFTSample)); |
781 | 68 if (!s->tsin) |
69 goto fail; | |
70 | |
71 for(i=0;i<n4;i++) { | |
72 alpha = 2 * M_PI * (i + 1.0 / 8.0) / n; | |
73 s->tcos[i] = -cos(alpha); | |
74 s->tsin[i] = -sin(alpha); | |
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 | 77 goto fail; |
78 return 0; | |
79 fail: | |
80 av_freep(&s->tcos); | |
81 av_freep(&s->tsin); | |
82 return -1; | |
83 } | |
84 | |
85 /* complex multiplication: p = a * b */ | |
86 #define CMUL(pre, pim, are, aim, bre, bim) \ | |
87 {\ | |
88 float _are = (are);\ | |
89 float _aim = (aim);\ | |
90 float _bre = (bre);\ | |
91 float _bim = (bim);\ | |
92 (pre) = _are * _bre - _aim * _bim;\ | |
93 (pim) = _are * _bim + _aim * _bre;\ | |
94 } | |
95 | |
96 /** | |
97 * Compute inverse MDCT of size N = 2^nbits | |
98 * @param output N samples | |
99 * @param input N/2 samples | |
100 * @param tmp N/2 samples | |
101 */ | |
2967 | 102 void ff_imdct_calc(MDCTContext *s, FFTSample *output, |
794 | 103 const FFTSample *input, FFTSample *tmp) |
781 | 104 { |
105 int k, n8, n4, n2, n, j; | |
106 const uint16_t *revtab = s->fft.revtab; | |
107 const FFTSample *tcos = s->tcos; | |
108 const FFTSample *tsin = s->tsin; | |
109 const FFTSample *in1, *in2; | |
110 FFTComplex *z = (FFTComplex *)tmp; | |
111 | |
112 n = 1 << s->nbits; | |
113 n2 = n >> 1; | |
114 n4 = n >> 2; | |
115 n8 = n >> 3; | |
116 | |
117 /* pre rotation */ | |
118 in1 = input; | |
119 in2 = input + n2 - 1; | |
120 for(k = 0; k < n4; k++) { | |
121 j=revtab[k]; | |
122 CMUL(z[j].re, z[j].im, *in2, *in1, tcos[k], tsin[k]); | |
123 in1 += 2; | |
124 in2 -= 2; | |
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 | 127 |
128 /* post rotation + reordering */ | |
129 /* XXX: optimize */ | |
130 for(k = 0; k < n4; k++) { | |
131 CMUL(z[k].re, z[k].im, z[k].re, z[k].im, tcos[k], tsin[k]); | |
132 } | |
133 for(k = 0; k < n8; k++) { | |
134 output[2*k] = -z[n8 + k].im; | |
135 output[n2-1-2*k] = z[n8 + k].im; | |
136 | |
137 output[2*k+1] = z[n8-1-k].re; | |
138 output[n2-1-2*k-1] = -z[n8-1-k].re; | |
139 | |
140 output[n2 + 2*k]=-z[k+n8].re; | |
141 output[n-1- 2*k]=-z[k+n8].re; | |
142 | |
143 output[n2 + 2*k+1]=z[n8-k-1].im; | |
144 output[n-2 - 2 * k] = z[n8-k-1].im; | |
145 } | |
146 } | |
147 | |
148 /** | |
149 * Compute MDCT of size N = 2^nbits | |
150 * @param input N samples | |
151 * @param out N/2 samples | |
152 * @param tmp temporary storage of N/2 samples | |
153 */ | |
2967 | 154 void ff_mdct_calc(MDCTContext *s, FFTSample *out, |
794 | 155 const FFTSample *input, FFTSample *tmp) |
781 | 156 { |
157 int i, j, n, n8, n4, n2, n3; | |
158 FFTSample re, im, re1, im1; | |
159 const uint16_t *revtab = s->fft.revtab; | |
160 const FFTSample *tcos = s->tcos; | |
161 const FFTSample *tsin = s->tsin; | |
162 FFTComplex *x = (FFTComplex *)tmp; | |
163 | |
164 n = 1 << s->nbits; | |
165 n2 = n >> 1; | |
166 n4 = n >> 2; | |
167 n8 = n >> 3; | |
168 n3 = 3 * n4; | |
169 | |
170 /* pre rotation */ | |
171 for(i=0;i<n8;i++) { | |
172 re = -input[2*i+3*n4] - input[n3-1-2*i]; | |
173 im = -input[n4+2*i] + input[n4-1-2*i]; | |
174 j = revtab[i]; | |
175 CMUL(x[j].re, x[j].im, re, im, -tcos[i], tsin[i]); | |
176 | |
177 re = input[2*i] - input[n2-1-2*i]; | |
178 im = -(input[n2+2*i] + input[n-1-2*i]); | |
179 j = revtab[n8 + i]; | |
180 CMUL(x[j].re, x[j].im, re, im, -tcos[n8 + i], tsin[n8 + i]); | |
181 } | |
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 | 184 |
781 | 185 /* post rotation */ |
186 for(i=0;i<n4;i++) { | |
187 re = x[i].re; | |
188 im = x[i].im; | |
189 CMUL(re1, im1, re, im, -tsin[i], -tcos[i]); | |
190 out[2*i] = im1; | |
191 out[n2-1-2*i] = re1; | |
192 } | |
193 } | |
194 | |
794 | 195 void ff_mdct_end(MDCTContext *s) |
781 | 196 { |
197 av_freep(&s->tcos); | |
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 | 200 } |