dct-test: add PARTTRANS permutation
[libav.git] / libavcodec / dct-test.c
CommitLineData
04d7f601
DB
1/*
2 * (c) 2001 Fabrice Bellard
3ac35bdb 3 * 2007 Marc Hoffman <marc.hoffman@analog.com>
04d7f601 4 *
b78e7197
DB
5 * This file is part of FFmpeg.
6 *
7 * FFmpeg is free software; you can redistribute it and/or
04d7f601
DB
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
b78e7197 10 * version 2.1 of the License, or (at your option) any later version.
04d7f601 11 *
b78e7197 12 * FFmpeg is distributed in the hope that it will be useful,
04d7f601
DB
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
b78e7197 18 * License along with FFmpeg; if not, write to the Free Software
04d7f601
DB
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20 */
21
983e3246
MN
22/**
23 * @file dct-test.c
115329f1 24 * DCT test. (c) 2001 Fabrice Bellard.
983e3246
MN
25 * Started from sample code by Juan J. Sierralta P.
26 */
27
de6d9b64
FB
28#include <stdlib.h>
29#include <stdio.h>
30#include <string.h>
31#include <sys/time.h>
32#include <unistd.h>
12807c8d 33#include <math.h>
de6d9b64 34
ae32e509 35#include "libavutil/common.h"
de6d9b64 36
86748dbc 37#include "simple_idct.h"
10ac3618 38#include "aandcttab.h"
65e4c8c9 39#include "faandct.h"
6f08c541 40#include "faanidct.h"
54a0b6e5 41#include "i386/idct_xvid.h"
9e1586fc 42
434df899 43#undef printf
cc61f96f 44#undef random
434df899
MN
45
46void *fast_memcpy(void *a, const void *b, size_t c){return memcpy(a,b,c);};
47
9e1586fc 48/* reference fdct/idct */
9686df2b
DB
49void fdct(DCTELEM *block);
50void idct(DCTELEM *block);
51void init_fdct();
de6d9b64 52
9686df2b
DB
53void ff_mmx_idct(DCTELEM *data);
54void ff_mmxext_idct(DCTELEM *data);
9e1586fc 55
9686df2b 56void odivx_idct_c(short *block);
86748dbc 57
3ac35bdb 58// BFIN
9686df2b
DB
59void ff_bfin_idct(DCTELEM *block);
60void ff_bfin_fdct(DCTELEM *block);
3ac35bdb
MH
61
62// ALTIVEC
9686df2b
DB
63void fdct_altivec(DCTELEM *block);
64//void idct_altivec(DCTELEM *block);?? no routine
3ac35bdb
MH
65
66
67struct algo {
f5b67781 68 const char *name;
3ac35bdb
MH
69 enum { FDCT, IDCT } is_idct;
70 void (* func) (DCTELEM *block);
71 void (* ref) (DCTELEM *block);
875f3125 72 enum formattag { NO_PERM,MMX_PERM, MMX_SIMPLE_PERM, SCALE_PERM, SSE2_PERM, PARTTRANS_PERM } format;
3794b928 73 int mm_support;
3ac35bdb
MH
74};
75
76#ifndef FAAN_POSTSCALE
77#define FAAN_SCALE SCALE_PERM
78#else
79#define FAAN_SCALE NO_PERM
80#endif
81
aadd27cd
MN
82static int cpu_flags;
83
3ac35bdb 84struct algo algos[] = {
1a7ee380
AS
85 {"REF-DBL", 0, fdct, fdct, NO_PERM},
86 {"FAAN", 0, ff_faandct, fdct, FAAN_SCALE},
87 {"FAANI", 1, ff_faanidct, idct, NO_PERM},
88 {"IJG-AAN-INT", 0, fdct_ifast, fdct, SCALE_PERM},
89 {"IJG-LLM-INT", 0, ff_jpeg_fdct_islow, fdct, NO_PERM},
90 {"REF-DBL", 1, idct, idct, NO_PERM},
91 {"INT", 1, j_rev_dct, idct, MMX_PERM},
92 {"SIMPLE-C", 1, ff_simple_idct, idct, NO_PERM},
3ac35bdb 93
ee3035f3 94#ifdef HAVE_MMX
82d1605f 95 {"MMX", 0, ff_fdct_mmx, fdct, NO_PERM, FF_MM_MMX},
94254fc0 96#ifdef HAVE_MMX2
82d1605f 97 {"MMX2", 0, ff_fdct_mmx2, fdct, NO_PERM, FF_MM_MMXEXT},
83534418 98 {"SSE2", 0, ff_fdct_sse2, fdct, NO_PERM, FF_MM_SSE2},
94254fc0 99#endif
3ac35bdb 100
b9702de5 101#ifdef CONFIG_GPL
82d1605f
DM
102 {"LIBMPEG2-MMX", 1, ff_mmx_idct, idct, MMX_PERM, FF_MM_MMX},
103 {"LIBMPEG2-MMXEXT", 1, ff_mmxext_idct, idct, MMX_PERM, FF_MM_MMXEXT},
b9702de5 104#endif
82d1605f
DM
105 {"SIMPLE-MMX", 1, ff_simple_idct_mmx, idct, MMX_SIMPLE_PERM, FF_MM_MMX},
106 {"XVID-MMX", 1, ff_idct_xvid_mmx, idct, NO_PERM, FF_MM_MMX},
107 {"XVID-MMX2", 1, ff_idct_xvid_mmx2, idct, NO_PERM, FF_MM_MMXEXT},
108 {"XVID-SSE2", 1, ff_idct_xvid_sse2, idct, SSE2_PERM, FF_MM_SSE2},
3ac35bdb
MH
109#endif
110
111#ifdef HAVE_ALTIVEC
82d1605f 112 {"altivecfdct", 0, fdct_altivec, fdct, NO_PERM, FF_MM_ALTIVEC},
3ac35bdb
MH
113#endif
114
115#ifdef ARCH_BFIN
1a7ee380
AS
116 {"BFINfdct", 0, ff_bfin_fdct, fdct, NO_PERM},
117 {"BFINidct", 1, ff_bfin_idct, idct, NO_PERM},
3ac35bdb
MH
118#endif
119
120 { 0 }
121};
122
de6d9b64 123#define AANSCALE_BITS 12
de6d9b64 124
486497e0 125uint8_t cropTbl[256 + 2 * MAX_NEG_CROP];
86748dbc 126
0c1a9eda 127int64_t gettime(void)
de6d9b64
FB
128{
129 struct timeval tv;
130 gettimeofday(&tv,NULL);
0c1a9eda 131 return (int64_t)tv.tv_sec * 1000000 + tv.tv_usec;
de6d9b64
FB
132}
133
134#define NB_ITS 20000
135#define NB_ITS_SPEED 50000
136
9e1586fc
FB
137static short idct_mmx_perm[64];
138
86748dbc 139static short idct_simple_mmx_perm[64]={
bb270c08
DB
140 0x00, 0x08, 0x04, 0x09, 0x01, 0x0C, 0x05, 0x0D,
141 0x10, 0x18, 0x14, 0x19, 0x11, 0x1C, 0x15, 0x1D,
142 0x20, 0x28, 0x24, 0x29, 0x21, 0x2C, 0x25, 0x2D,
143 0x12, 0x1A, 0x16, 0x1B, 0x13, 0x1E, 0x17, 0x1F,
144 0x02, 0x0A, 0x06, 0x0B, 0x03, 0x0E, 0x07, 0x0F,
145 0x30, 0x38, 0x34, 0x39, 0x31, 0x3C, 0x35, 0x3D,
146 0x22, 0x2A, 0x26, 0x2B, 0x23, 0x2E, 0x27, 0x2F,
147 0x32, 0x3A, 0x36, 0x3B, 0x33, 0x3E, 0x37, 0x3F,
86748dbc
MN
148};
149
ad246860
AS
150static const uint8_t idct_sse2_row_perm[8] = {0, 4, 1, 5, 2, 6, 3, 7};
151
9e1586fc
FB
152void idct_mmx_init(void)
153{
154 int i;
155
156 /* the mmx/mmxext idct uses a reordered input, so we patch scan tables */
157 for (i = 0; i < 64; i++) {
bb270c08
DB
158 idct_mmx_perm[i] = (i & 0x38) | ((i & 6) >> 1) | ((i & 1) << 2);
159// idct_simple_mmx_perm[i] = simple_block_permute_op(i);
9e1586fc
FB
160 }
161}
162
55727a83 163static DCTELEM block[64] __attribute__ ((aligned (16)));
9e1586fc 164static DCTELEM block1[64] __attribute__ ((aligned (8)));
86748dbc 165static DCTELEM block_org[64] __attribute__ ((aligned (8)));
9e1586fc 166
aadd27cd
MN
167static inline void mmx_emms(void)
168{
169#ifdef HAVE_MMX
82d1605f 170 if (cpu_flags & FF_MM_MMX)
be449fca 171 __asm__ volatile ("emms\n\t");
aadd27cd
MN
172#endif
173}
174
9e1586fc
FB
175void dct_error(const char *name, int is_idct,
176 void (*fdct_func)(DCTELEM *block),
3ac35bdb 177 void (*fdct_ref)(DCTELEM *block), int form, int test)
de6d9b64
FB
178{
179 int it, i, scale;
de6d9b64 180 int err_inf, v;
0c1a9eda
ZK
181 int64_t err2, ti, ti1, it1;
182 int64_t sysErr[64], sysErrMax=0;
86748dbc 183 int maxout=0;
86748dbc 184 int blockSumErrMax=0, blockSumErr;
de6d9b64
FB
185
186 srandom(0);
187
188 err_inf = 0;
189 err2 = 0;
86748dbc 190 for(i=0; i<64; i++) sysErr[i]=0;
de6d9b64 191 for(it=0;it<NB_ITS;it++) {
86748dbc
MN
192 for(i=0;i<64;i++)
193 block1[i] = 0;
194 switch(test){
115329f1 195 case 0:
86748dbc
MN
196 for(i=0;i<64;i++)
197 block1[i] = (random() % 512) -256;
ad324c93 198 if (is_idct){
86748dbc 199 fdct(block1);
ad324c93
MN
200
201 for(i=0;i<64;i++)
202 block1[i]>>=3;
203 }
86748dbc
MN
204 break;
205 case 1:{
206 int num= (random()%10)+1;
207 for(i=0;i<num;i++)
208 block1[random()%64] = (random() % 512) -256;
209 }break;
210 case 2:
211 block1[0]= (random()%4096)-2048;
212 block1[63]= (block1[0]&1)^1;
213 break;
214 }
9e1586fc 215
86748dbc
MN
216#if 0 // simulate mismatch control
217{ int sum=0;
218 for(i=0;i<64;i++)
219 sum+=block1[i];
220
115329f1 221 if((sum&1)==0) block1[63]^=1;
86748dbc
MN
222}
223#endif
224
225 for(i=0; i<64; i++)
226 block_org[i]= block1[i];
9e1586fc 227
3ac35bdb 228 if (form == MMX_PERM) {
86748dbc 229 for(i=0;i<64;i++)
9e1586fc 230 block[idct_mmx_perm[i]] = block1[i];
3ac35bdb 231 } else if (form == MMX_SIMPLE_PERM) {
86748dbc
MN
232 for(i=0;i<64;i++)
233 block[idct_simple_mmx_perm[i]] = block1[i];
234
ad246860
AS
235 } else if (form == SSE2_PERM) {
236 for(i=0; i<64; i++)
237 block[(i&0x38) | idct_sse2_row_perm[i&7]] = block1[i];
875f3125
MR
238 } else if (form == PARTTRANS_PERM) {
239 for(i=0; i<64; i++)
240 block[(i&0x24) | ((i&3)<<3) | ((i>>3)&3)] = block1[i];
bb270c08 241 } else {
86748dbc
MN
242 for(i=0; i<64; i++)
243 block[i]= block1[i];
9e1586fc 244 }
86748dbc
MN
245#if 0 // simulate mismatch control for tested IDCT but not the ref
246{ int sum=0;
247 for(i=0;i<64;i++)
248 sum+=block[i];
249
115329f1 250 if((sum&1)==0) block[63]^=1;
86748dbc
MN
251}
252#endif
9e1586fc 253
de6d9b64 254 fdct_func(block);
aadd27cd 255 mmx_emms();
9e1586fc 256
3ac35bdb 257 if (form == SCALE_PERM) {
de6d9b64 258 for(i=0; i<64; i++) {
10ac3618 259 scale = 8*(1 << (AANSCALE_BITS + 11)) / ff_aanscales[i];
86748dbc
MN
260 block[i] = (block[i] * scale /*+ (1<<(AANSCALE_BITS-1))*/) >> AANSCALE_BITS;
261 }
262 }
263
9e1586fc 264 fdct_ref(block1);
de6d9b64 265
86748dbc 266 blockSumErr=0;
de6d9b64
FB
267 for(i=0;i<64;i++) {
268 v = abs(block[i] - block1[i]);
269 if (v > err_inf)
270 err_inf = v;
271 err2 += v * v;
bb270c08
DB
272 sysErr[i] += block[i] - block1[i];
273 blockSumErr += v;
274 if( abs(block[i])>maxout) maxout=abs(block[i]);
de6d9b64 275 }
86748dbc
MN
276 if(blockSumErrMax < blockSumErr) blockSumErrMax= blockSumErr;
277#if 0 // print different matrix pairs
278 if(blockSumErr){
279 printf("\n");
280 for(i=0; i<64; i++){
281 if((i&7)==0) printf("\n");
282 printf("%4d ", block_org[i]);
283 }
284 for(i=0; i<64; i++){
285 if((i&7)==0) printf("\n");
286 printf("%4d ", block[i] - block1[i]);
287 }
288 }
289#endif
290 }
ae32e509 291 for(i=0; i<64; i++) sysErrMax= FFMAX(sysErrMax, FFABS(sysErr[i]));
115329f1 292
86748dbc
MN
293#if 1 // dump systematic errors
294 for(i=0; i<64; i++){
bb270c08 295 if(i%8==0) printf("\n");
86748dbc 296 printf("%5d ", (int)sysErr[i]);
de6d9b64 297 }
86748dbc
MN
298 printf("\n");
299#endif
115329f1 300
86748dbc 301 printf("%s %s: err_inf=%d err2=%0.8f syserr=%0.8f maxout=%d blockSumErr=%d\n",
9e1586fc 302 is_idct ? "IDCT" : "DCT",
86748dbc
MN
303 name, err_inf, (double)err2 / NB_ITS / 64.0, (double)sysErrMax / NB_ITS, maxout, blockSumErrMax);
304#if 1 //Speed test
de6d9b64 305 /* speed test */
86748dbc
MN
306 for(i=0;i<64;i++)
307 block1[i] = 0;
308 switch(test){
115329f1 309 case 0:
86748dbc
MN
310 for(i=0;i<64;i++)
311 block1[i] = (random() % 512) -256;
ad324c93 312 if (is_idct){
86748dbc 313 fdct(block1);
ad324c93
MN
314
315 for(i=0;i<64;i++)
316 block1[i]>>=3;
317 }
86748dbc
MN
318 break;
319 case 1:{
320 case 2:
321 block1[0] = (random() % 512) -256;
322 block1[1] = (random() % 512) -256;
323 block1[2] = (random() % 512) -256;
324 block1[3] = (random() % 512) -256;
325 }break;
326 }
de6d9b64 327
3ac35bdb 328 if (form == MMX_PERM) {
86748dbc 329 for(i=0;i<64;i++)
9e1586fc 330 block[idct_mmx_perm[i]] = block1[i];
3ac35bdb 331 } else if(form == MMX_SIMPLE_PERM) {
86748dbc
MN
332 for(i=0;i<64;i++)
333 block[idct_simple_mmx_perm[i]] = block1[i];
334 } else {
335 for(i=0; i<64; i++)
336 block[i]= block1[i];
9e1586fc
FB
337 }
338
de6d9b64
FB
339 ti = gettime();
340 it1 = 0;
341 do {
342 for(it=0;it<NB_ITS_SPEED;it++) {
86748dbc
MN
343 for(i=0; i<64; i++)
344 block[i]= block1[i];
345// memcpy(block, block1, sizeof(DCTELEM) * 64);
755bfeab 346// do not memcpy especially not fastmemcpy because it does movntq !!!
de6d9b64
FB
347 fdct_func(block);
348 }
349 it1 += NB_ITS_SPEED;
350 ti1 = gettime() - ti;
351 } while (ti1 < 1000000);
aadd27cd 352 mmx_emms();
de6d9b64 353
86748dbc 354 printf("%s %s: %0.1f kdct/s\n",
9e1586fc 355 is_idct ? "IDCT" : "DCT",
de6d9b64 356 name, (double)it1 * 1000.0 / (double)ti1);
86748dbc 357#endif
de6d9b64
FB
358}
359
0c1a9eda
ZK
360static uint8_t img_dest[64] __attribute__ ((aligned (8)));
361static uint8_t img_dest1[64] __attribute__ ((aligned (8)));
a46a3ce4 362
0c1a9eda 363void idct248_ref(uint8_t *dest, int linesize, int16_t *block)
a46a3ce4
FB
364{
365 static int init;
366 static double c8[8][8];
367 static double c4[4][4];
368 double block1[64], block2[64], block3[64];
369 double s, sum, v;
370 int i, j, k;
371
372 if (!init) {
373 init = 1;
374
375 for(i=0;i<8;i++) {
376 sum = 0;
377 for(j=0;j<8;j++) {
378 s = (i==0) ? sqrt(1.0/8.0) : sqrt(1.0/4.0);
379 c8[i][j] = s * cos(M_PI * i * (j + 0.5) / 8.0);
380 sum += c8[i][j] * c8[i][j];
381 }
382 }
115329f1 383
a46a3ce4
FB
384 for(i=0;i<4;i++) {
385 sum = 0;
386 for(j=0;j<4;j++) {
387 s = (i==0) ? sqrt(1.0/4.0) : sqrt(1.0/2.0);
388 c4[i][j] = s * cos(M_PI * i * (j + 0.5) / 4.0);
389 sum += c4[i][j] * c4[i][j];
390 }
391 }
392 }
393
394 /* butterfly */
652f0197 395 s = 0.5 * sqrt(2.0);
a46a3ce4
FB
396 for(i=0;i<4;i++) {
397 for(j=0;j<8;j++) {
652f0197
FB
398 block1[8*(2*i)+j] = (block[8*(2*i)+j] + block[8*(2*i+1)+j]) * s;
399 block1[8*(2*i+1)+j] = (block[8*(2*i)+j] - block[8*(2*i+1)+j]) * s;
a46a3ce4
FB
400 }
401 }
402
403 /* idct8 on lines */
404 for(i=0;i<8;i++) {
405 for(j=0;j<8;j++) {
406 sum = 0;
407 for(k=0;k<8;k++)
408 sum += c8[k][j] * block1[8*i+k];
409 block2[8*i+j] = sum;
410 }
411 }
412
413 /* idct4 */
414 for(i=0;i<8;i++) {
415 for(j=0;j<4;j++) {
416 /* top */
417 sum = 0;
418 for(k=0;k<4;k++)
419 sum += c4[k][j] * block2[8*(2*k)+i];
420 block3[8*(2*j)+i] = sum;
421
422 /* bottom */
423 sum = 0;
424 for(k=0;k<4;k++)
425 sum += c4[k][j] * block2[8*(2*k+1)+i];
426 block3[8*(2*j+1)+i] = sum;
427 }
428 }
429
430 /* clamp and store the result */
431 for(i=0;i<8;i++) {
432 for(j=0;j<8;j++) {
652f0197 433 v = block3[8*i+j];
a46a3ce4
FB
434 if (v < 0)
435 v = 0;
436 else if (v > 255)
437 v = 255;
438 dest[i * linesize + j] = (int)rint(v);
439 }
440 }
441}
442
115329f1 443void idct248_error(const char *name,
0c1a9eda 444 void (*idct248_put)(uint8_t *dest, int line_size, int16_t *block))
a46a3ce4
FB
445{
446 int it, i, it1, ti, ti1, err_max, v;
447
448 srandom(0);
115329f1 449
a46a3ce4
FB
450 /* just one test to see if code is correct (precision is less
451 important here) */
452 err_max = 0;
453 for(it=0;it<NB_ITS;it++) {
115329f1 454
652f0197
FB
455 /* XXX: use forward transform to generate values */
456 for(i=0;i<64;i++)
457 block1[i] = (random() % 256) - 128;
458 block1[0] += 1024;
459
a46a3ce4
FB
460 for(i=0; i<64; i++)
461 block[i]= block1[i];
462 idct248_ref(img_dest1, 8, block);
115329f1 463
652f0197
FB
464 for(i=0; i<64; i++)
465 block[i]= block1[i];
466 idct248_put(img_dest, 8, block);
115329f1 467
652f0197
FB
468 for(i=0;i<64;i++) {
469 v = abs((int)img_dest[i] - (int)img_dest1[i]);
470 if (v == 255)
471 printf("%d %d\n", img_dest[i], img_dest1[i]);
472 if (v > err_max)
473 err_max = v;
474 }
a46a3ce4
FB
475#if 0
476 printf("ref=\n");
477 for(i=0;i<8;i++) {
478 int j;
479 for(j=0;j<8;j++) {
480 printf(" %3d", img_dest1[i*8+j]);
481 }
482 printf("\n");
483 }
115329f1 484
a46a3ce4
FB
485 printf("out=\n");
486 for(i=0;i<8;i++) {
487 int j;
488 for(j=0;j<8;j++) {
489 printf(" %3d", img_dest[i*8+j]);
490 }
491 printf("\n");
492 }
493#endif
a46a3ce4
FB
494 }
495 printf("%s %s: err_inf=%d\n",
496 1 ? "IDCT248" : "DCT248",
497 name, err_max);
498
499 ti = gettime();
500 it1 = 0;
501 do {
502 for(it=0;it<NB_ITS_SPEED;it++) {
503 for(i=0; i<64; i++)
504 block[i]= block1[i];
505// memcpy(block, block1, sizeof(DCTELEM) * 64);
755bfeab 506// do not memcpy especially not fastmemcpy because it does movntq !!!
a46a3ce4
FB
507 idct248_put(img_dest, 8, block);
508 }
509 it1 += NB_ITS_SPEED;
510 ti1 = gettime() - ti;
511 } while (ti1 < 1000000);
aadd27cd 512 mmx_emms();
a46a3ce4
FB
513
514 printf("%s %s: %0.1f kdct/s\n",
515 1 ? "IDCT248" : "DCT248",
516 name, (double)it1 * 1000.0 / (double)ti1);
517}
518
9e1586fc
FB
519void help(void)
520{
86748dbc
MN
521 printf("dct-test [-i] [<test-number>]\n"
522 "test-number 0 -> test with random matrixes\n"
523 " 1 -> test with random sparse matrixes\n"
524 " 2 -> do 3. test from mpeg4 std\n"
a46a3ce4
FB
525 "-i test IDCT implementations\n"
526 "-4 test IDCT248 implementations\n");
9e1586fc
FB
527}
528
de6d9b64
FB
529int main(int argc, char **argv)
530{
a46a3ce4 531 int test_idct = 0, test_248_dct = 0;
86748dbc
MN
532 int c,i;
533 int test=1;
aadd27cd 534 cpu_flags = mm_support();
9e1586fc 535
de6d9b64 536 init_fdct();
9e1586fc 537 idct_mmx_init();
f67a10cd 538
486497e0 539 for(i=0;i<256;i++) cropTbl[i + MAX_NEG_CROP] = i;
86748dbc 540 for(i=0;i<MAX_NEG_CROP;i++) {
486497e0
MR
541 cropTbl[i] = 0;
542 cropTbl[i + MAX_NEG_CROP + 256] = 255;
86748dbc 543 }
115329f1 544
9e1586fc 545 for(;;) {
a46a3ce4 546 c = getopt(argc, argv, "ih4");
9e1586fc
FB
547 if (c == -1)
548 break;
549 switch(c) {
550 case 'i':
551 test_idct = 1;
552 break;
a46a3ce4
FB
553 case '4':
554 test_248_dct = 1;
555 break;
86748dbc 556 default :
9e1586fc
FB
557 case 'h':
558 help();
c6bdc908 559 return 0;
9e1586fc
FB
560 }
561 }
115329f1 562
86748dbc 563 if(optind <argc) test= atoi(argv[optind]);
115329f1 564
9e1586fc
FB
565 printf("ffmpeg DCT/IDCT test\n");
566
a46a3ce4 567 if (test_248_dct) {
59e6f60a 568 idct248_error("SIMPLE-C", ff_simple_idct248_put);
9e1586fc 569 } else {
3ac35bdb 570 for (i=0;algos[i].name;i++)
dafe8824 571 if (algos[i].is_idct == test_idct && !(~cpu_flags & algos[i].mm_support)) {
3ac35bdb 572 dct_error (algos[i].name, algos[i].is_idct, algos[i].func, algos[i].ref, algos[i].format, test);
a46a3ce4 573 }
9e1586fc 574 }
de6d9b64
FB
575 return 0;
576}