Mercurial > libavcodec.hg
annotate fft-test.c @ 12494:94eaea836bf4 libavcodec
Check avctx width/height more thoroughly (e.g. all values 0 except width would
have been accepted before).
Also do not fail if they are invalid but instead override them to 0.
This allows decoding e.g. MPEG video when only the container values are corrupted.
For encoding a value of 0,0 of course makes no sense, but was allowed
through before and will be caught by an extra check in the encode function.
author | reimar |
---|---|
date | Wed, 15 Sep 2010 04:46:55 +0000 |
parents | 77dfabe0d66f |
children |
rev | line source |
---|---|
3699
c537a97eec66
Add official LGPL license headers to the files that were missing them.
diego
parents:
2967
diff
changeset
|
1 /* |
c537a97eec66
Add official LGPL license headers to the files that were missing them.
diego
parents:
2967
diff
changeset
|
2 * (c) 2002 Fabrice Bellard |
c537a97eec66
Add official LGPL license headers to the files that were missing them.
diego
parents:
2967
diff
changeset
|
3 * |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3699
diff
changeset
|
4 * This file is part of FFmpeg. |
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3699
diff
changeset
|
5 * |
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3699
diff
changeset
|
6 * FFmpeg is free software; you can redistribute it and/or |
3699
c537a97eec66
Add official LGPL license headers to the files that were missing them.
diego
parents:
2967
diff
changeset
|
7 * modify it under the terms of the GNU Lesser General Public |
c537a97eec66
Add official LGPL license headers to the files that were missing them.
diego
parents:
2967
diff
changeset
|
8 * 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:
3699
diff
changeset
|
9 * version 2.1 of the License, or (at your option) any later version. |
3699
c537a97eec66
Add official LGPL license headers to the files that were missing them.
diego
parents:
2967
diff
changeset
|
10 * |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3699
diff
changeset
|
11 * FFmpeg is distributed in the hope that it will be useful, |
3699
c537a97eec66
Add official LGPL license headers to the files that were missing them.
diego
parents:
2967
diff
changeset
|
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
c537a97eec66
Add official LGPL license headers to the files that were missing them.
diego
parents:
2967
diff
changeset
|
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
c537a97eec66
Add official LGPL license headers to the files that were missing them.
diego
parents:
2967
diff
changeset
|
14 * Lesser General Public License for more details. |
c537a97eec66
Add official LGPL license headers to the files that were missing them.
diego
parents:
2967
diff
changeset
|
15 * |
c537a97eec66
Add official LGPL license headers to the files that were missing them.
diego
parents:
2967
diff
changeset
|
16 * 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:
3699
diff
changeset
|
17 * License along with FFmpeg; if not, write to the Free Software |
3699
c537a97eec66
Add official LGPL license headers to the files that were missing them.
diego
parents:
2967
diff
changeset
|
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
c537a97eec66
Add official LGPL license headers to the files that were missing them.
diego
parents:
2967
diff
changeset
|
19 */ |
c537a97eec66
Add official LGPL license headers to the files that were missing them.
diego
parents:
2967
diff
changeset
|
20 |
1106 | 21 /** |
11644
7dd2a45249a9
Remove explicit filename from Doxygen @file commands.
diego
parents:
11583
diff
changeset
|
22 * @file |
1106 | 23 * FFT and MDCT tests. |
24 */ | |
25 | |
11390 | 26 #include "libavutil/mathematics.h" |
9199
ea0e5e9a520f
Replace random() usage in test programs by av_lfg_*().
diego
parents:
8718
diff
changeset
|
27 #include "libavutil/lfg.h" |
11390 | 28 #include "libavutil/log.h" |
29 #include "fft.h" | |
781 | 30 #include <math.h> |
980 | 31 #include <unistd.h> |
781 | 32 #include <sys/time.h> |
5118
3b190bc34546
Add some #includes to allow compilation without HAVE_AV_CONFIG_H.
diego
parents:
4760
diff
changeset
|
33 #include <stdlib.h> |
3b190bc34546
Add some #includes to allow compilation without HAVE_AV_CONFIG_H.
diego
parents:
4760
diff
changeset
|
34 #include <string.h> |
781 | 35 |
4760 | 36 #undef exit |
37 | |
781 | 38 /* reference fft */ |
39 | |
40 #define MUL16(a,b) ((a) * (b)) | |
41 | |
42 #define CMAC(pre, pim, are, aim, bre, bim) \ | |
43 {\ | |
44 pre += (MUL16(are, bre) - MUL16(aim, bim));\ | |
45 pim += (MUL16(are, bim) + MUL16(bre, aim));\ | |
46 } | |
47 | |
48 FFTComplex *exptab; | |
49 | |
9295
b225f51903af
Mark non-exported functions in test and example programs as static.
diego
parents:
9199
diff
changeset
|
50 static void fft_ref_init(int nbits, int inverse) |
781 | 51 { |
52 int n, i; | |
5418
95234f2e0bdd
make the reference code use double instead of float where it is easy
michael
parents:
5417
diff
changeset
|
53 double c1, s1, alpha; |
781 | 54 |
55 n = 1 << nbits; | |
56 exptab = av_malloc((n / 2) * sizeof(FFTComplex)); | |
57 | |
10807 | 58 for (i = 0; i < (n/2); i++) { |
781 | 59 alpha = 2 * M_PI * (float)i / (float)n; |
60 c1 = cos(alpha); | |
61 s1 = sin(alpha); | |
62 if (!inverse) | |
63 s1 = -s1; | |
64 exptab[i].re = c1; | |
65 exptab[i].im = s1; | |
66 } | |
67 } | |
68 | |
9295
b225f51903af
Mark non-exported functions in test and example programs as static.
diego
parents:
9199
diff
changeset
|
69 static void fft_ref(FFTComplex *tabr, FFTComplex *tab, int nbits) |
781 | 70 { |
71 int n, i, j, k, n2; | |
5418
95234f2e0bdd
make the reference code use double instead of float where it is easy
michael
parents:
5417
diff
changeset
|
72 double tmp_re, tmp_im, s, c; |
781 | 73 FFTComplex *q; |
74 | |
75 n = 1 << nbits; | |
76 n2 = n >> 1; | |
10807 | 77 for (i = 0; i < n; i++) { |
781 | 78 tmp_re = 0; |
79 tmp_im = 0; | |
80 q = tab; | |
10807 | 81 for (j = 0; j < n; j++) { |
781 | 82 k = (i * j) & (n - 1); |
83 if (k >= n2) { | |
84 c = -exptab[k - n2].re; | |
85 s = -exptab[k - n2].im; | |
86 } else { | |
87 c = exptab[k].re; | |
88 s = exptab[k].im; | |
89 } | |
90 CMAC(tmp_re, tmp_im, c, s, q->re, q->im); | |
91 q++; | |
92 } | |
93 tabr[i].re = tmp_re; | |
94 tabr[i].im = tmp_im; | |
95 } | |
96 } | |
97 | |
9295
b225f51903af
Mark non-exported functions in test and example programs as static.
diego
parents:
9199
diff
changeset
|
98 static void imdct_ref(float *out, float *in, int nbits) |
781 | 99 { |
5442 | 100 int n = 1<<nbits; |
781 | 101 int k, i, a; |
5418
95234f2e0bdd
make the reference code use double instead of float where it is easy
michael
parents:
5417
diff
changeset
|
102 double sum, f; |
781 | 103 |
10807 | 104 for (i = 0; i < n; i++) { |
781 | 105 sum = 0; |
10807 | 106 for (k = 0; k < n/2; k++) { |
781 | 107 a = (2 * i + 1 + (n / 2)) * (2 * k + 1); |
108 f = cos(M_PI * a / (double)(2 * n)); | |
109 sum += f * in[k]; | |
110 } | |
111 out[i] = -sum; | |
112 } | |
113 } | |
114 | |
115 /* NOTE: no normalisation by 1 / N is done */ | |
9295
b225f51903af
Mark non-exported functions in test and example programs as static.
diego
parents:
9199
diff
changeset
|
116 static void mdct_ref(float *output, float *input, int nbits) |
781 | 117 { |
5442 | 118 int n = 1<<nbits; |
781 | 119 int k, i; |
5418
95234f2e0bdd
make the reference code use double instead of float where it is easy
michael
parents:
5417
diff
changeset
|
120 double a, s; |
781 | 121 |
122 /* do it by hand */ | |
10807 | 123 for (k = 0; k < n/2; k++) { |
781 | 124 s = 0; |
10807 | 125 for (i = 0; i < n; i++) { |
781 | 126 a = (2*M_PI*(2*i+1+n/2)*(2*k+1) / (4 * n)); |
127 s += input[i] * cos(a); | |
128 } | |
129 output[k] = s; | |
130 } | |
131 } | |
132 | |
10944 | 133 static void idct_ref(float *output, float *input, int nbits) |
134 { | |
135 int n = 1<<nbits; | |
136 int k, i; | |
137 double a, s; | |
138 | |
139 /* do it by hand */ | |
140 for (i = 0; i < n; i++) { | |
141 s = 0.5 * input[0]; | |
142 for (k = 1; k < n; k++) { | |
143 a = M_PI*k*(i+0.5) / n; | |
144 s += input[k] * cos(a); | |
145 } | |
146 output[i] = 2 * s / n; | |
147 } | |
148 } | |
149 static void dct_ref(float *output, float *input, int nbits) | |
150 { | |
151 int n = 1<<nbits; | |
152 int k, i; | |
153 double a, s; | |
154 | |
155 /* do it by hand */ | |
156 for (k = 0; k < n; k++) { | |
157 s = 0; | |
158 for (i = 0; i < n; i++) { | |
159 a = M_PI*k*(i+0.5) / n; | |
160 s += input[i] * cos(a); | |
161 } | |
162 output[k] = s; | |
163 } | |
164 } | |
165 | |
781 | 166 |
10074
c4a83f3a5c9f
bring back some randomness in fft-test. (regression in r18070)
lorenm
parents:
9674
diff
changeset
|
167 static float frandom(AVLFG *prng) |
781 | 168 { |
10074
c4a83f3a5c9f
bring back some randomness in fft-test. (regression in r18070)
lorenm
parents:
9674
diff
changeset
|
169 return (int16_t)av_lfg_get(prng) / 32768.0; |
781 | 170 } |
171 | |
9295
b225f51903af
Mark non-exported functions in test and example programs as static.
diego
parents:
9199
diff
changeset
|
172 static int64_t gettime(void) |
781 | 173 { |
174 struct timeval tv; | |
175 gettimeofday(&tv,NULL); | |
1064 | 176 return (int64_t)tv.tv_sec * 1000000 + tv.tv_usec; |
781 | 177 } |
178 | |
12364 | 179 static int check_diff(float *tab1, float *tab2, int n, double scale) |
781 | 180 { |
181 int i; | |
5417 | 182 double max= 0; |
183 double error= 0; | |
12364 | 184 int err = 0; |
781 | 185 |
10807 | 186 for (i = 0; i < n; i++) { |
9674
dac20d8df581
Support for testing (i)MDCT output scale factor in fft-test tool.
serge
parents:
9658
diff
changeset
|
187 double e= fabsf(tab1[i] - (tab2[i] / scale)); |
5417 | 188 if (e >= 1e-3) { |
12389 | 189 av_log(NULL, AV_LOG_ERROR, "ERROR %5d: %10.6f %10.6f\n", |
781 | 190 i, tab1[i], tab2[i]); |
12364 | 191 err = 1; |
781 | 192 } |
5417 | 193 error+= e*e; |
194 if(e>max) max= e; | |
781 | 195 } |
5417 | 196 av_log(NULL, AV_LOG_INFO, "max:%f e:%g\n", max, sqrt(error)/n); |
12364 | 197 return err; |
781 | 198 } |
199 | |
200 | |
9295
b225f51903af
Mark non-exported functions in test and example programs as static.
diego
parents:
9199
diff
changeset
|
201 static void help(void) |
781 | 202 { |
2593
786ccf72ccd5
printf -> av_log patch by (Benjamin Larsson <>banan student.ltu se)
michael
parents:
1879
diff
changeset
|
203 av_log(NULL, AV_LOG_INFO,"usage: fft-test [-h] [-s] [-i] [-n b]\n" |
781 | 204 "-h print this help\n" |
205 "-s speed test\n" | |
206 "-m (I)MDCT test\n" | |
10944 | 207 "-d (I)DCT test\n" |
11583 | 208 "-r (I)RDFT test\n" |
781 | 209 "-i inverse transform test\n" |
210 "-n b set the transform size to 2^b\n" | |
9674
dac20d8df581
Support for testing (i)MDCT output scale factor in fft-test tool.
serge
parents:
9658
diff
changeset
|
211 "-f x set scale factor for output data of (I)MDCT to x\n" |
781 | 212 ); |
213 exit(1); | |
214 } | |
215 | |
10846
8dbceaa5fa2f
fft-test: Replace do_mdct with a tf_transform enum and switch on it.
alexc
parents:
10807
diff
changeset
|
216 enum tf_transform { |
8dbceaa5fa2f
fft-test: Replace do_mdct with a tf_transform enum and switch on it.
alexc
parents:
10807
diff
changeset
|
217 TRANSFORM_FFT, |
8dbceaa5fa2f
fft-test: Replace do_mdct with a tf_transform enum and switch on it.
alexc
parents:
10807
diff
changeset
|
218 TRANSFORM_MDCT, |
10847 | 219 TRANSFORM_RDFT, |
10944 | 220 TRANSFORM_DCT, |
10846
8dbceaa5fa2f
fft-test: Replace do_mdct with a tf_transform enum and switch on it.
alexc
parents:
10807
diff
changeset
|
221 }; |
781 | 222 |
223 int main(int argc, char **argv) | |
224 { | |
225 FFTComplex *tab, *tab1, *tab_ref; | |
7546 | 226 FFTSample *tab2; |
781 | 227 int it, i, c; |
228 int do_speed = 0; | |
12364 | 229 int err = 1; |
10846
8dbceaa5fa2f
fft-test: Replace do_mdct with a tf_transform enum and switch on it.
alexc
parents:
10807
diff
changeset
|
230 enum tf_transform transform = TRANSFORM_FFT; |
781 | 231 int do_inverse = 0; |
232 FFTContext s1, *s = &s1; | |
10199 | 233 FFTContext m1, *m = &m1; |
10847 | 234 RDFTContext r1, *r = &r1; |
10944 | 235 DCTContext d1, *d = &d1; |
10847 | 236 int fft_nbits, fft_size, fft_size_2; |
9674
dac20d8df581
Support for testing (i)MDCT output scale factor in fft-test tool.
serge
parents:
9658
diff
changeset
|
237 double scale = 1.0; |
10074
c4a83f3a5c9f
bring back some randomness in fft-test. (regression in r18070)
lorenm
parents:
9674
diff
changeset
|
238 AVLFG prng; |
c4a83f3a5c9f
bring back some randomness in fft-test. (regression in r18070)
lorenm
parents:
9674
diff
changeset
|
239 av_lfg_init(&prng, 1); |
781 | 240 |
241 fft_nbits = 9; | |
242 for(;;) { | |
10944 | 243 c = getopt(argc, argv, "hsimrdn:f:"); |
781 | 244 if (c == -1) |
245 break; | |
246 switch(c) { | |
247 case 'h': | |
248 help(); | |
249 break; | |
250 case 's': | |
251 do_speed = 1; | |
252 break; | |
253 case 'i': | |
254 do_inverse = 1; | |
255 break; | |
256 case 'm': | |
10846
8dbceaa5fa2f
fft-test: Replace do_mdct with a tf_transform enum and switch on it.
alexc
parents:
10807
diff
changeset
|
257 transform = TRANSFORM_MDCT; |
781 | 258 break; |
10847 | 259 case 'r': |
260 transform = TRANSFORM_RDFT; | |
261 break; | |
10944 | 262 case 'd': |
263 transform = TRANSFORM_DCT; | |
264 break; | |
781 | 265 case 'n': |
266 fft_nbits = atoi(optarg); | |
267 break; | |
9674
dac20d8df581
Support for testing (i)MDCT output scale factor in fft-test tool.
serge
parents:
9658
diff
changeset
|
268 case 'f': |
dac20d8df581
Support for testing (i)MDCT output scale factor in fft-test tool.
serge
parents:
9658
diff
changeset
|
269 scale = atof(optarg); |
dac20d8df581
Support for testing (i)MDCT output scale factor in fft-test tool.
serge
parents:
9658
diff
changeset
|
270 break; |
781 | 271 } |
272 } | |
273 | |
274 fft_size = 1 << fft_nbits; | |
10847 | 275 fft_size_2 = fft_size >> 1; |
781 | 276 tab = av_malloc(fft_size * sizeof(FFTComplex)); |
277 tab1 = av_malloc(fft_size * sizeof(FFTComplex)); | |
278 tab_ref = av_malloc(fft_size * sizeof(FFTComplex)); | |
279 tab2 = av_malloc(fft_size * sizeof(FFTSample)); | |
280 | |
10846
8dbceaa5fa2f
fft-test: Replace do_mdct with a tf_transform enum and switch on it.
alexc
parents:
10807
diff
changeset
|
281 switch (transform) { |
8dbceaa5fa2f
fft-test: Replace do_mdct with a tf_transform enum and switch on it.
alexc
parents:
10807
diff
changeset
|
282 case TRANSFORM_MDCT: |
9674
dac20d8df581
Support for testing (i)MDCT output scale factor in fft-test tool.
serge
parents:
9658
diff
changeset
|
283 av_log(NULL, AV_LOG_INFO,"Scale factor is set to %f\n", scale); |
781 | 284 if (do_inverse) |
2593
786ccf72ccd5
printf -> av_log patch by (Benjamin Larsson <>banan student.ltu se)
michael
parents:
1879
diff
changeset
|
285 av_log(NULL, AV_LOG_INFO,"IMDCT"); |
781 | 286 else |
2593
786ccf72ccd5
printf -> av_log patch by (Benjamin Larsson <>banan student.ltu se)
michael
parents:
1879
diff
changeset
|
287 av_log(NULL, AV_LOG_INFO,"MDCT"); |
9674
dac20d8df581
Support for testing (i)MDCT output scale factor in fft-test tool.
serge
parents:
9658
diff
changeset
|
288 ff_mdct_init(m, fft_nbits, do_inverse, scale); |
10846
8dbceaa5fa2f
fft-test: Replace do_mdct with a tf_transform enum and switch on it.
alexc
parents:
10807
diff
changeset
|
289 break; |
8dbceaa5fa2f
fft-test: Replace do_mdct with a tf_transform enum and switch on it.
alexc
parents:
10807
diff
changeset
|
290 case TRANSFORM_FFT: |
781 | 291 if (do_inverse) |
2593
786ccf72ccd5
printf -> av_log patch by (Benjamin Larsson <>banan student.ltu se)
michael
parents:
1879
diff
changeset
|
292 av_log(NULL, AV_LOG_INFO,"IFFT"); |
781 | 293 else |
2593
786ccf72ccd5
printf -> av_log patch by (Benjamin Larsson <>banan student.ltu se)
michael
parents:
1879
diff
changeset
|
294 av_log(NULL, AV_LOG_INFO,"FFT"); |
1879
dd63cb7e5080
fft_*() renamed into ff_fft_*() patch by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
1106
diff
changeset
|
295 ff_fft_init(s, fft_nbits, do_inverse); |
781 | 296 fft_ref_init(fft_nbits, do_inverse); |
10846
8dbceaa5fa2f
fft-test: Replace do_mdct with a tf_transform enum and switch on it.
alexc
parents:
10807
diff
changeset
|
297 break; |
10847 | 298 case TRANSFORM_RDFT: |
299 if (do_inverse) | |
11391 | 300 av_log(NULL, AV_LOG_INFO,"IDFT_C2R"); |
10847 | 301 else |
11391 | 302 av_log(NULL, AV_LOG_INFO,"DFT_R2C"); |
303 ff_rdft_init(r, fft_nbits, do_inverse ? IDFT_C2R : DFT_R2C); | |
10847 | 304 fft_ref_init(fft_nbits, do_inverse); |
305 break; | |
10944 | 306 case TRANSFORM_DCT: |
307 if (do_inverse) | |
11582
23cad4157bfb
Make code using 1d-DCT consistent with the API change
vitor
parents:
11391
diff
changeset
|
308 av_log(NULL, AV_LOG_INFO,"DCT_III"); |
10944 | 309 else |
11582
23cad4157bfb
Make code using 1d-DCT consistent with the API change
vitor
parents:
11391
diff
changeset
|
310 av_log(NULL, AV_LOG_INFO,"DCT_II"); |
23cad4157bfb
Make code using 1d-DCT consistent with the API change
vitor
parents:
11391
diff
changeset
|
311 ff_dct_init(d, fft_nbits, do_inverse ? DCT_III : DCT_II); |
10944 | 312 break; |
781 | 313 } |
2593
786ccf72ccd5
printf -> av_log patch by (Benjamin Larsson <>banan student.ltu se)
michael
parents:
1879
diff
changeset
|
314 av_log(NULL, AV_LOG_INFO," %d test\n", fft_size); |
781 | 315 |
316 /* generate random data */ | |
317 | |
10807 | 318 for (i = 0; i < fft_size; i++) { |
10074
c4a83f3a5c9f
bring back some randomness in fft-test. (regression in r18070)
lorenm
parents:
9674
diff
changeset
|
319 tab1[i].re = frandom(&prng); |
c4a83f3a5c9f
bring back some randomness in fft-test. (regression in r18070)
lorenm
parents:
9674
diff
changeset
|
320 tab1[i].im = frandom(&prng); |
781 | 321 } |
322 | |
323 /* checking result */ | |
2593
786ccf72ccd5
printf -> av_log patch by (Benjamin Larsson <>banan student.ltu se)
michael
parents:
1879
diff
changeset
|
324 av_log(NULL, AV_LOG_INFO,"Checking...\n"); |
781 | 325 |
10846
8dbceaa5fa2f
fft-test: Replace do_mdct with a tf_transform enum and switch on it.
alexc
parents:
10807
diff
changeset
|
326 switch (transform) { |
8dbceaa5fa2f
fft-test: Replace do_mdct with a tf_transform enum and switch on it.
alexc
parents:
10807
diff
changeset
|
327 case TRANSFORM_MDCT: |
781 | 328 if (do_inverse) { |
5442 | 329 imdct_ref((float *)tab_ref, (float *)tab1, fft_nbits); |
7546 | 330 ff_imdct_calc(m, tab2, (float *)tab1); |
12364 | 331 err = check_diff((float *)tab_ref, tab2, fft_size, scale); |
781 | 332 } else { |
5442 | 333 mdct_ref((float *)tab_ref, (float *)tab1, fft_nbits); |
2967 | 334 |
7546 | 335 ff_mdct_calc(m, tab2, (float *)tab1); |
781 | 336 |
12364 | 337 err = check_diff((float *)tab_ref, tab2, fft_size / 2, scale); |
781 | 338 } |
10846
8dbceaa5fa2f
fft-test: Replace do_mdct with a tf_transform enum and switch on it.
alexc
parents:
10807
diff
changeset
|
339 break; |
8dbceaa5fa2f
fft-test: Replace do_mdct with a tf_transform enum and switch on it.
alexc
parents:
10807
diff
changeset
|
340 case TRANSFORM_FFT: |
781 | 341 memcpy(tab, tab1, fft_size * sizeof(FFTComplex)); |
1879
dd63cb7e5080
fft_*() renamed into ff_fft_*() patch by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
1106
diff
changeset
|
342 ff_fft_permute(s, tab); |
dd63cb7e5080
fft_*() renamed into ff_fft_*() patch by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
1106
diff
changeset
|
343 ff_fft_calc(s, tab); |
2967 | 344 |
781 | 345 fft_ref(tab_ref, tab1, fft_nbits); |
12364 | 346 err = check_diff((float *)tab_ref, (float *)tab, fft_size * 2, 1.0); |
10846
8dbceaa5fa2f
fft-test: Replace do_mdct with a tf_transform enum and switch on it.
alexc
parents:
10807
diff
changeset
|
347 break; |
10847 | 348 case TRANSFORM_RDFT: |
349 if (do_inverse) { | |
350 tab1[ 0].im = 0; | |
351 tab1[fft_size_2].im = 0; | |
352 for (i = 1; i < fft_size_2; i++) { | |
353 tab1[fft_size_2+i].re = tab1[fft_size_2-i].re; | |
354 tab1[fft_size_2+i].im = -tab1[fft_size_2-i].im; | |
355 } | |
356 | |
357 memcpy(tab2, tab1, fft_size * sizeof(FFTSample)); | |
358 tab2[1] = tab1[fft_size_2].re; | |
359 | |
360 ff_rdft_calc(r, tab2); | |
361 fft_ref(tab_ref, tab1, fft_nbits); | |
362 for (i = 0; i < fft_size; i++) { | |
363 tab[i].re = tab2[i]; | |
364 tab[i].im = 0; | |
365 } | |
12364 | 366 err = check_diff((float *)tab_ref, (float *)tab, fft_size * 2, 0.5); |
10847 | 367 } else { |
368 for (i = 0; i < fft_size; i++) { | |
369 tab2[i] = tab1[i].re; | |
370 tab1[i].im = 0; | |
371 } | |
372 ff_rdft_calc(r, tab2); | |
373 fft_ref(tab_ref, tab1, fft_nbits); | |
374 tab_ref[0].im = tab_ref[fft_size_2].re; | |
12364 | 375 err = check_diff((float *)tab_ref, (float *)tab2, fft_size, 1.0); |
10847 | 376 } |
10944 | 377 break; |
378 case TRANSFORM_DCT: | |
379 memcpy(tab, tab1, fft_size * sizeof(FFTComplex)); | |
380 ff_dct_calc(d, tab); | |
381 if (do_inverse) { | |
382 idct_ref(tab_ref, tab1, fft_nbits); | |
383 } else { | |
384 dct_ref(tab_ref, tab1, fft_nbits); | |
385 } | |
12364 | 386 err = check_diff((float *)tab_ref, (float *)tab, fft_size, 1.0); |
10944 | 387 break; |
781 | 388 } |
389 | |
390 /* do a speed test */ | |
391 | |
392 if (do_speed) { | |
1064 | 393 int64_t time_start, duration; |
781 | 394 int nb_its; |
395 | |
2593
786ccf72ccd5
printf -> av_log patch by (Benjamin Larsson <>banan student.ltu se)
michael
parents:
1879
diff
changeset
|
396 av_log(NULL, AV_LOG_INFO,"Speed test...\n"); |
781 | 397 /* we measure during about 1 seconds */ |
398 nb_its = 1; | |
399 for(;;) { | |
400 time_start = gettime(); | |
10807 | 401 for (it = 0; it < nb_its; it++) { |
10846
8dbceaa5fa2f
fft-test: Replace do_mdct with a tf_transform enum and switch on it.
alexc
parents:
10807
diff
changeset
|
402 switch (transform) { |
8dbceaa5fa2f
fft-test: Replace do_mdct with a tf_transform enum and switch on it.
alexc
parents:
10807
diff
changeset
|
403 case TRANSFORM_MDCT: |
781 | 404 if (do_inverse) { |
7546 | 405 ff_imdct_calc(m, (float *)tab, (float *)tab1); |
781 | 406 } else { |
7546 | 407 ff_mdct_calc(m, (float *)tab, (float *)tab1); |
781 | 408 } |
10846
8dbceaa5fa2f
fft-test: Replace do_mdct with a tf_transform enum and switch on it.
alexc
parents:
10807
diff
changeset
|
409 break; |
8dbceaa5fa2f
fft-test: Replace do_mdct with a tf_transform enum and switch on it.
alexc
parents:
10807
diff
changeset
|
410 case TRANSFORM_FFT: |
781 | 411 memcpy(tab, tab1, fft_size * sizeof(FFTComplex)); |
1879
dd63cb7e5080
fft_*() renamed into ff_fft_*() patch by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
1106
diff
changeset
|
412 ff_fft_calc(s, tab); |
10846
8dbceaa5fa2f
fft-test: Replace do_mdct with a tf_transform enum and switch on it.
alexc
parents:
10807
diff
changeset
|
413 break; |
10847 | 414 case TRANSFORM_RDFT: |
415 memcpy(tab2, tab1, fft_size * sizeof(FFTSample)); | |
416 ff_rdft_calc(r, tab2); | |
417 break; | |
10944 | 418 case TRANSFORM_DCT: |
419 memcpy(tab2, tab1, fft_size * sizeof(FFTSample)); | |
420 ff_dct_calc(d, tab2); | |
421 break; | |
781 | 422 } |
423 } | |
424 duration = gettime() - time_start; | |
425 if (duration >= 1000000) | |
426 break; | |
427 nb_its *= 2; | |
428 } | |
2967 | 429 av_log(NULL, AV_LOG_INFO,"time: %0.1f us/transform [total time=%0.2f s its=%d]\n", |
430 (double)duration / nb_its, | |
781 | 431 (double)duration / 1000000.0, |
432 nb_its); | |
433 } | |
2967 | 434 |
10846
8dbceaa5fa2f
fft-test: Replace do_mdct with a tf_transform enum and switch on it.
alexc
parents:
10807
diff
changeset
|
435 switch (transform) { |
8dbceaa5fa2f
fft-test: Replace do_mdct with a tf_transform enum and switch on it.
alexc
parents:
10807
diff
changeset
|
436 case TRANSFORM_MDCT: |
969 | 437 ff_mdct_end(m); |
10846
8dbceaa5fa2f
fft-test: Replace do_mdct with a tf_transform enum and switch on it.
alexc
parents:
10807
diff
changeset
|
438 break; |
8dbceaa5fa2f
fft-test: Replace do_mdct with a tf_transform enum and switch on it.
alexc
parents:
10807
diff
changeset
|
439 case TRANSFORM_FFT: |
1879
dd63cb7e5080
fft_*() renamed into ff_fft_*() patch by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
1106
diff
changeset
|
440 ff_fft_end(s); |
10846
8dbceaa5fa2f
fft-test: Replace do_mdct with a tf_transform enum and switch on it.
alexc
parents:
10807
diff
changeset
|
441 break; |
10847 | 442 case TRANSFORM_RDFT: |
443 ff_rdft_end(r); | |
444 break; | |
10944 | 445 case TRANSFORM_DCT: |
446 ff_dct_end(d); | |
447 break; | |
781 | 448 } |
12370 | 449 |
450 av_free(tab); | |
451 av_free(tab1); | |
452 av_free(tab2); | |
453 av_free(tab_ref); | |
454 av_free(exptab); | |
455 | |
12364 | 456 return err; |
781 | 457 } |