Mercurial > libavcodec.hg
comparison fft-test.c @ 12364:2e96cab6ecde libavcodec
fft-test: exit with non-zero status if test failed
author | mru |
---|---|
date | Wed, 04 Aug 2010 06:56:55 +0000 |
parents | 7dd2a45249a9 |
children | 71b2c440157d |
comparison
equal
deleted
inserted
replaced
12363:8e3a8008bb90 | 12364:2e96cab6ecde |
---|---|
174 struct timeval tv; | 174 struct timeval tv; |
175 gettimeofday(&tv,NULL); | 175 gettimeofday(&tv,NULL); |
176 return (int64_t)tv.tv_sec * 1000000 + tv.tv_usec; | 176 return (int64_t)tv.tv_sec * 1000000 + tv.tv_usec; |
177 } | 177 } |
178 | 178 |
179 static void check_diff(float *tab1, float *tab2, int n, double scale) | 179 static int check_diff(float *tab1, float *tab2, int n, double scale) |
180 { | 180 { |
181 int i; | 181 int i; |
182 double max= 0; | 182 double max= 0; |
183 double error= 0; | 183 double error= 0; |
184 int err = 0; | |
184 | 185 |
185 for (i = 0; i < n; i++) { | 186 for (i = 0; i < n; i++) { |
186 double e= fabsf(tab1[i] - (tab2[i] / scale)); | 187 double e= fabsf(tab1[i] - (tab2[i] / scale)); |
187 if (e >= 1e-3) { | 188 if (e >= 1e-3) { |
188 av_log(NULL, AV_LOG_ERROR, "ERROR %d: %f %f\n", | 189 av_log(NULL, AV_LOG_ERROR, "ERROR %d: %f %f\n", |
189 i, tab1[i], tab2[i]); | 190 i, tab1[i], tab2[i]); |
191 err = 1; | |
190 } | 192 } |
191 error+= e*e; | 193 error+= e*e; |
192 if(e>max) max= e; | 194 if(e>max) max= e; |
193 } | 195 } |
194 av_log(NULL, AV_LOG_INFO, "max:%f e:%g\n", max, sqrt(error)/n); | 196 av_log(NULL, AV_LOG_INFO, "max:%f e:%g\n", max, sqrt(error)/n); |
197 return err; | |
195 } | 198 } |
196 | 199 |
197 | 200 |
198 static void help(void) | 201 static void help(void) |
199 { | 202 { |
221 { | 224 { |
222 FFTComplex *tab, *tab1, *tab_ref; | 225 FFTComplex *tab, *tab1, *tab_ref; |
223 FFTSample *tab2; | 226 FFTSample *tab2; |
224 int it, i, c; | 227 int it, i, c; |
225 int do_speed = 0; | 228 int do_speed = 0; |
229 int err = 1; | |
226 enum tf_transform transform = TRANSFORM_FFT; | 230 enum tf_transform transform = TRANSFORM_FFT; |
227 int do_inverse = 0; | 231 int do_inverse = 0; |
228 FFTContext s1, *s = &s1; | 232 FFTContext s1, *s = &s1; |
229 FFTContext m1, *m = &m1; | 233 FFTContext m1, *m = &m1; |
230 RDFTContext r1, *r = &r1; | 234 RDFTContext r1, *r = &r1; |
322 switch (transform) { | 326 switch (transform) { |
323 case TRANSFORM_MDCT: | 327 case TRANSFORM_MDCT: |
324 if (do_inverse) { | 328 if (do_inverse) { |
325 imdct_ref((float *)tab_ref, (float *)tab1, fft_nbits); | 329 imdct_ref((float *)tab_ref, (float *)tab1, fft_nbits); |
326 ff_imdct_calc(m, tab2, (float *)tab1); | 330 ff_imdct_calc(m, tab2, (float *)tab1); |
327 check_diff((float *)tab_ref, tab2, fft_size, scale); | 331 err = check_diff((float *)tab_ref, tab2, fft_size, scale); |
328 } else { | 332 } else { |
329 mdct_ref((float *)tab_ref, (float *)tab1, fft_nbits); | 333 mdct_ref((float *)tab_ref, (float *)tab1, fft_nbits); |
330 | 334 |
331 ff_mdct_calc(m, tab2, (float *)tab1); | 335 ff_mdct_calc(m, tab2, (float *)tab1); |
332 | 336 |
333 check_diff((float *)tab_ref, tab2, fft_size / 2, scale); | 337 err = check_diff((float *)tab_ref, tab2, fft_size / 2, scale); |
334 } | 338 } |
335 break; | 339 break; |
336 case TRANSFORM_FFT: | 340 case TRANSFORM_FFT: |
337 memcpy(tab, tab1, fft_size * sizeof(FFTComplex)); | 341 memcpy(tab, tab1, fft_size * sizeof(FFTComplex)); |
338 ff_fft_permute(s, tab); | 342 ff_fft_permute(s, tab); |
339 ff_fft_calc(s, tab); | 343 ff_fft_calc(s, tab); |
340 | 344 |
341 fft_ref(tab_ref, tab1, fft_nbits); | 345 fft_ref(tab_ref, tab1, fft_nbits); |
342 check_diff((float *)tab_ref, (float *)tab, fft_size * 2, 1.0); | 346 err = check_diff((float *)tab_ref, (float *)tab, fft_size * 2, 1.0); |
343 break; | 347 break; |
344 case TRANSFORM_RDFT: | 348 case TRANSFORM_RDFT: |
345 if (do_inverse) { | 349 if (do_inverse) { |
346 tab1[ 0].im = 0; | 350 tab1[ 0].im = 0; |
347 tab1[fft_size_2].im = 0; | 351 tab1[fft_size_2].im = 0; |
357 fft_ref(tab_ref, tab1, fft_nbits); | 361 fft_ref(tab_ref, tab1, fft_nbits); |
358 for (i = 0; i < fft_size; i++) { | 362 for (i = 0; i < fft_size; i++) { |
359 tab[i].re = tab2[i]; | 363 tab[i].re = tab2[i]; |
360 tab[i].im = 0; | 364 tab[i].im = 0; |
361 } | 365 } |
362 check_diff((float *)tab_ref, (float *)tab, fft_size * 2, 0.5); | 366 err = check_diff((float *)tab_ref, (float *)tab, fft_size * 2, 0.5); |
363 } else { | 367 } else { |
364 for (i = 0; i < fft_size; i++) { | 368 for (i = 0; i < fft_size; i++) { |
365 tab2[i] = tab1[i].re; | 369 tab2[i] = tab1[i].re; |
366 tab1[i].im = 0; | 370 tab1[i].im = 0; |
367 } | 371 } |
368 ff_rdft_calc(r, tab2); | 372 ff_rdft_calc(r, tab2); |
369 fft_ref(tab_ref, tab1, fft_nbits); | 373 fft_ref(tab_ref, tab1, fft_nbits); |
370 tab_ref[0].im = tab_ref[fft_size_2].re; | 374 tab_ref[0].im = tab_ref[fft_size_2].re; |
371 check_diff((float *)tab_ref, (float *)tab2, fft_size, 1.0); | 375 err = check_diff((float *)tab_ref, (float *)tab2, fft_size, 1.0); |
372 } | 376 } |
373 break; | 377 break; |
374 case TRANSFORM_DCT: | 378 case TRANSFORM_DCT: |
375 memcpy(tab, tab1, fft_size * sizeof(FFTComplex)); | 379 memcpy(tab, tab1, fft_size * sizeof(FFTComplex)); |
376 ff_dct_calc(d, tab); | 380 ff_dct_calc(d, tab); |
377 if (do_inverse) { | 381 if (do_inverse) { |
378 idct_ref(tab_ref, tab1, fft_nbits); | 382 idct_ref(tab_ref, tab1, fft_nbits); |
379 } else { | 383 } else { |
380 dct_ref(tab_ref, tab1, fft_nbits); | 384 dct_ref(tab_ref, tab1, fft_nbits); |
381 } | 385 } |
382 check_diff((float *)tab_ref, (float *)tab, fft_size, 1.0); | 386 err = check_diff((float *)tab_ref, (float *)tab, fft_size, 1.0); |
383 break; | 387 break; |
384 } | 388 } |
385 | 389 |
386 /* do a speed test */ | 390 /* do a speed test */ |
387 | 391 |
440 break; | 444 break; |
441 case TRANSFORM_DCT: | 445 case TRANSFORM_DCT: |
442 ff_dct_end(d); | 446 ff_dct_end(d); |
443 break; | 447 break; |
444 } | 448 } |
445 return 0; | 449 return err; |
446 } | 450 } |