Reindent.
[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
FB
36#include "dsputil.h"
37
86748dbc 38#include "simple_idct.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 */
de6d9b64 49extern void fdct(DCTELEM *block);
9e1586fc 50extern void idct(DCTELEM *block);
de6d9b64
FB
51extern void init_fdct();
52
9e1586fc
FB
53extern void ff_mmx_idct(DCTELEM *data);
54extern void ff_mmxext_idct(DCTELEM *data);
55
86748dbc
MN
56extern void odivx_idct_c (short *block);
57
3ac35bdb
MH
58// BFIN
59extern void ff_bfin_idct (DCTELEM *block) ;
60extern void ff_bfin_fdct (DCTELEM *block) ;
61
62// ALTIVEC
63extern void fdct_altivec (DCTELEM *block);
64//extern void idct_altivec (DCTELEM *block);?? no routine
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);
ad246860 72 enum formattag { NO_PERM,MMX_PERM, MMX_SIMPLE_PERM, SCALE_PERM, SSE2_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
3ac35bdb 82struct algo algos[] = {
1a7ee380
AS
83 {"REF-DBL", 0, fdct, fdct, NO_PERM},
84 {"FAAN", 0, ff_faandct, fdct, FAAN_SCALE},
85 {"FAANI", 1, ff_faanidct, idct, NO_PERM},
86 {"IJG-AAN-INT", 0, fdct_ifast, fdct, SCALE_PERM},
87 {"IJG-LLM-INT", 0, ff_jpeg_fdct_islow, fdct, NO_PERM},
88 {"REF-DBL", 1, idct, idct, NO_PERM},
89 {"INT", 1, j_rev_dct, idct, MMX_PERM},
90 {"SIMPLE-C", 1, ff_simple_idct, idct, NO_PERM},
3ac35bdb 91
ee3035f3 92#ifdef HAVE_MMX
3794b928 93 {"MMX", 0, ff_fdct_mmx, fdct, NO_PERM, MM_MMX},
94254fc0 94#ifdef HAVE_MMX2
3794b928 95 {"MMX2", 0, ff_fdct_mmx2, fdct, NO_PERM, MM_MMXEXT},
94254fc0 96#endif
3ac35bdb 97
b9702de5 98#ifdef CONFIG_GPL
3794b928
AS
99 {"LIBMPEG2-MMX", 1, ff_mmx_idct, idct, MMX_PERM, MM_MMX},
100 {"LIBMPEG2-MMXEXT", 1, ff_mmxext_idct, idct, MMX_PERM, MM_MMXEXT},
b9702de5 101#endif
3794b928
AS
102 {"SIMPLE-MMX", 1, ff_simple_idct_mmx, idct, MMX_SIMPLE_PERM, MM_MMX},
103 {"XVID-MMX", 1, ff_idct_xvid_mmx, idct, NO_PERM, MM_MMX},
104 {"XVID-MMX2", 1, ff_idct_xvid_mmx2, idct, NO_PERM, MM_MMXEXT},
ad246860 105 {"XVID-SSE2", 1, ff_idct_xvid_sse2, idct, SSE2_PERM, MM_SSE2},
3ac35bdb
MH
106#endif
107
108#ifdef HAVE_ALTIVEC
3794b928 109 {"altivecfdct", 0, fdct_altivec, fdct, NO_PERM, MM_ALTIVEC},
3ac35bdb
MH
110#endif
111
112#ifdef ARCH_BFIN
1a7ee380
AS
113 {"BFINfdct", 0, ff_bfin_fdct, fdct, NO_PERM},
114 {"BFINidct", 1, ff_bfin_idct, idct, NO_PERM},
3ac35bdb
MH
115#endif
116
117 { 0 }
118};
119
de6d9b64
FB
120#define AANSCALE_BITS 12
121static const unsigned short aanscales[64] = {
122 /* precomputed values scaled up by 14 bits */
123 16384, 22725, 21407, 19266, 16384, 12873, 8867, 4520,
124 22725, 31521, 29692, 26722, 22725, 17855, 12299, 6270,
125 21407, 29692, 27969, 25172, 21407, 16819, 11585, 5906,
126 19266, 26722, 25172, 22654, 19266, 15137, 10426, 5315,
127 16384, 22725, 21407, 19266, 16384, 12873, 8867, 4520,
128 12873, 17855, 16819, 15137, 12873, 10114, 6967, 3552,
129 8867, 12299, 11585, 10426, 8867, 6967, 4799, 2446,
130 4520, 6270, 5906, 5315, 4520, 3552, 2446, 1247
131};
132
486497e0 133uint8_t cropTbl[256 + 2 * MAX_NEG_CROP];
86748dbc 134
0c1a9eda 135int64_t gettime(void)
de6d9b64
FB
136{
137 struct timeval tv;
138 gettimeofday(&tv,NULL);
0c1a9eda 139 return (int64_t)tv.tv_sec * 1000000 + tv.tv_usec;
de6d9b64
FB
140}
141
142#define NB_ITS 20000
143#define NB_ITS_SPEED 50000
144
9e1586fc
FB
145static short idct_mmx_perm[64];
146
86748dbc 147static short idct_simple_mmx_perm[64]={
bb270c08
DB
148 0x00, 0x08, 0x04, 0x09, 0x01, 0x0C, 0x05, 0x0D,
149 0x10, 0x18, 0x14, 0x19, 0x11, 0x1C, 0x15, 0x1D,
150 0x20, 0x28, 0x24, 0x29, 0x21, 0x2C, 0x25, 0x2D,
151 0x12, 0x1A, 0x16, 0x1B, 0x13, 0x1E, 0x17, 0x1F,
152 0x02, 0x0A, 0x06, 0x0B, 0x03, 0x0E, 0x07, 0x0F,
153 0x30, 0x38, 0x34, 0x39, 0x31, 0x3C, 0x35, 0x3D,
154 0x22, 0x2A, 0x26, 0x2B, 0x23, 0x2E, 0x27, 0x2F,
155 0x32, 0x3A, 0x36, 0x3B, 0x33, 0x3E, 0x37, 0x3F,
86748dbc
MN
156};
157
ad246860
AS
158static const uint8_t idct_sse2_row_perm[8] = {0, 4, 1, 5, 2, 6, 3, 7};
159
9e1586fc
FB
160void idct_mmx_init(void)
161{
162 int i;
163
164 /* the mmx/mmxext idct uses a reordered input, so we patch scan tables */
165 for (i = 0; i < 64; i++) {
bb270c08
DB
166 idct_mmx_perm[i] = (i & 0x38) | ((i & 6) >> 1) | ((i & 1) << 2);
167// idct_simple_mmx_perm[i] = simple_block_permute_op(i);
9e1586fc
FB
168 }
169}
170
55727a83 171static DCTELEM block[64] __attribute__ ((aligned (16)));
9e1586fc 172static DCTELEM block1[64] __attribute__ ((aligned (8)));
86748dbc 173static DCTELEM block_org[64] __attribute__ ((aligned (8)));
9e1586fc
FB
174
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];
bb270c08 238 } else {
86748dbc
MN
239 for(i=0; i<64; i++)
240 block[i]= block1[i];
9e1586fc 241 }
86748dbc
MN
242#if 0 // simulate mismatch control for tested IDCT but not the ref
243{ int sum=0;
244 for(i=0;i<64;i++)
245 sum+=block[i];
246
115329f1 247 if((sum&1)==0) block[63]^=1;
86748dbc
MN
248}
249#endif
9e1586fc 250
de6d9b64 251 fdct_func(block);
19ef2ba5 252 emms_c(); /* for ff_mmx_idct */
9e1586fc 253
3ac35bdb 254 if (form == SCALE_PERM) {
de6d9b64 255 for(i=0; i<64; i++) {
ad324c93 256 scale = 8*(1 << (AANSCALE_BITS + 11)) / aanscales[i];
86748dbc
MN
257 block[i] = (block[i] * scale /*+ (1<<(AANSCALE_BITS-1))*/) >> AANSCALE_BITS;
258 }
259 }
260
9e1586fc 261 fdct_ref(block1);
de6d9b64 262
86748dbc 263 blockSumErr=0;
de6d9b64
FB
264 for(i=0;i<64;i++) {
265 v = abs(block[i] - block1[i]);
266 if (v > err_inf)
267 err_inf = v;
268 err2 += v * v;
bb270c08
DB
269 sysErr[i] += block[i] - block1[i];
270 blockSumErr += v;
271 if( abs(block[i])>maxout) maxout=abs(block[i]);
de6d9b64 272 }
86748dbc
MN
273 if(blockSumErrMax < blockSumErr) blockSumErrMax= blockSumErr;
274#if 0 // print different matrix pairs
275 if(blockSumErr){
276 printf("\n");
277 for(i=0; i<64; i++){
278 if((i&7)==0) printf("\n");
279 printf("%4d ", block_org[i]);
280 }
281 for(i=0; i<64; i++){
282 if((i&7)==0) printf("\n");
283 printf("%4d ", block[i] - block1[i]);
284 }
285 }
286#endif
287 }
ae32e509 288 for(i=0; i<64; i++) sysErrMax= FFMAX(sysErrMax, FFABS(sysErr[i]));
115329f1 289
86748dbc
MN
290#if 1 // dump systematic errors
291 for(i=0; i<64; i++){
bb270c08 292 if(i%8==0) printf("\n");
86748dbc 293 printf("%5d ", (int)sysErr[i]);
de6d9b64 294 }
86748dbc
MN
295 printf("\n");
296#endif
115329f1 297
86748dbc 298 printf("%s %s: err_inf=%d err2=%0.8f syserr=%0.8f maxout=%d blockSumErr=%d\n",
9e1586fc 299 is_idct ? "IDCT" : "DCT",
86748dbc
MN
300 name, err_inf, (double)err2 / NB_ITS / 64.0, (double)sysErrMax / NB_ITS, maxout, blockSumErrMax);
301#if 1 //Speed test
de6d9b64 302 /* speed test */
86748dbc
MN
303 for(i=0;i<64;i++)
304 block1[i] = 0;
305 switch(test){
115329f1 306 case 0:
86748dbc
MN
307 for(i=0;i<64;i++)
308 block1[i] = (random() % 512) -256;
ad324c93 309 if (is_idct){
86748dbc 310 fdct(block1);
ad324c93
MN
311
312 for(i=0;i<64;i++)
313 block1[i]>>=3;
314 }
86748dbc
MN
315 break;
316 case 1:{
317 case 2:
318 block1[0] = (random() % 512) -256;
319 block1[1] = (random() % 512) -256;
320 block1[2] = (random() % 512) -256;
321 block1[3] = (random() % 512) -256;
322 }break;
323 }
de6d9b64 324
3ac35bdb 325 if (form == MMX_PERM) {
86748dbc 326 for(i=0;i<64;i++)
9e1586fc 327 block[idct_mmx_perm[i]] = block1[i];
3ac35bdb 328 } else if(form == MMX_SIMPLE_PERM) {
86748dbc
MN
329 for(i=0;i<64;i++)
330 block[idct_simple_mmx_perm[i]] = block1[i];
331 } else {
332 for(i=0; i<64; i++)
333 block[i]= block1[i];
9e1586fc
FB
334 }
335
de6d9b64
FB
336 ti = gettime();
337 it1 = 0;
338 do {
339 for(it=0;it<NB_ITS_SPEED;it++) {
86748dbc
MN
340 for(i=0; i<64; i++)
341 block[i]= block1[i];
342// memcpy(block, block1, sizeof(DCTELEM) * 64);
755bfeab 343// do not memcpy especially not fastmemcpy because it does movntq !!!
de6d9b64
FB
344 fdct_func(block);
345 }
346 it1 += NB_ITS_SPEED;
347 ti1 = gettime() - ti;
348 } while (ti1 < 1000000);
19ef2ba5 349 emms_c();
de6d9b64 350
86748dbc 351 printf("%s %s: %0.1f kdct/s\n",
9e1586fc 352 is_idct ? "IDCT" : "DCT",
de6d9b64 353 name, (double)it1 * 1000.0 / (double)ti1);
86748dbc 354#endif
de6d9b64
FB
355}
356
0c1a9eda
ZK
357static uint8_t img_dest[64] __attribute__ ((aligned (8)));
358static uint8_t img_dest1[64] __attribute__ ((aligned (8)));
a46a3ce4 359
0c1a9eda 360void idct248_ref(uint8_t *dest, int linesize, int16_t *block)
a46a3ce4
FB
361{
362 static int init;
363 static double c8[8][8];
364 static double c4[4][4];
365 double block1[64], block2[64], block3[64];
366 double s, sum, v;
367 int i, j, k;
368
369 if (!init) {
370 init = 1;
371
372 for(i=0;i<8;i++) {
373 sum = 0;
374 for(j=0;j<8;j++) {
375 s = (i==0) ? sqrt(1.0/8.0) : sqrt(1.0/4.0);
376 c8[i][j] = s * cos(M_PI * i * (j + 0.5) / 8.0);
377 sum += c8[i][j] * c8[i][j];
378 }
379 }
115329f1 380
a46a3ce4
FB
381 for(i=0;i<4;i++) {
382 sum = 0;
383 for(j=0;j<4;j++) {
384 s = (i==0) ? sqrt(1.0/4.0) : sqrt(1.0/2.0);
385 c4[i][j] = s * cos(M_PI * i * (j + 0.5) / 4.0);
386 sum += c4[i][j] * c4[i][j];
387 }
388 }
389 }
390
391 /* butterfly */
652f0197 392 s = 0.5 * sqrt(2.0);
a46a3ce4
FB
393 for(i=0;i<4;i++) {
394 for(j=0;j<8;j++) {
652f0197
FB
395 block1[8*(2*i)+j] = (block[8*(2*i)+j] + block[8*(2*i+1)+j]) * s;
396 block1[8*(2*i+1)+j] = (block[8*(2*i)+j] - block[8*(2*i+1)+j]) * s;
a46a3ce4
FB
397 }
398 }
399
400 /* idct8 on lines */
401 for(i=0;i<8;i++) {
402 for(j=0;j<8;j++) {
403 sum = 0;
404 for(k=0;k<8;k++)
405 sum += c8[k][j] * block1[8*i+k];
406 block2[8*i+j] = sum;
407 }
408 }
409
410 /* idct4 */
411 for(i=0;i<8;i++) {
412 for(j=0;j<4;j++) {
413 /* top */
414 sum = 0;
415 for(k=0;k<4;k++)
416 sum += c4[k][j] * block2[8*(2*k)+i];
417 block3[8*(2*j)+i] = sum;
418
419 /* bottom */
420 sum = 0;
421 for(k=0;k<4;k++)
422 sum += c4[k][j] * block2[8*(2*k+1)+i];
423 block3[8*(2*j+1)+i] = sum;
424 }
425 }
426
427 /* clamp and store the result */
428 for(i=0;i<8;i++) {
429 for(j=0;j<8;j++) {
652f0197 430 v = block3[8*i+j];
a46a3ce4
FB
431 if (v < 0)
432 v = 0;
433 else if (v > 255)
434 v = 255;
435 dest[i * linesize + j] = (int)rint(v);
436 }
437 }
438}
439
115329f1 440void idct248_error(const char *name,
0c1a9eda 441 void (*idct248_put)(uint8_t *dest, int line_size, int16_t *block))
a46a3ce4
FB
442{
443 int it, i, it1, ti, ti1, err_max, v;
444
445 srandom(0);
115329f1 446
a46a3ce4
FB
447 /* just one test to see if code is correct (precision is less
448 important here) */
449 err_max = 0;
450 for(it=0;it<NB_ITS;it++) {
115329f1 451
652f0197
FB
452 /* XXX: use forward transform to generate values */
453 for(i=0;i<64;i++)
454 block1[i] = (random() % 256) - 128;
455 block1[0] += 1024;
456
a46a3ce4
FB
457 for(i=0; i<64; i++)
458 block[i]= block1[i];
459 idct248_ref(img_dest1, 8, block);
115329f1 460
652f0197
FB
461 for(i=0; i<64; i++)
462 block[i]= block1[i];
463 idct248_put(img_dest, 8, block);
115329f1 464
652f0197
FB
465 for(i=0;i<64;i++) {
466 v = abs((int)img_dest[i] - (int)img_dest1[i]);
467 if (v == 255)
468 printf("%d %d\n", img_dest[i], img_dest1[i]);
469 if (v > err_max)
470 err_max = v;
471 }
a46a3ce4
FB
472#if 0
473 printf("ref=\n");
474 for(i=0;i<8;i++) {
475 int j;
476 for(j=0;j<8;j++) {
477 printf(" %3d", img_dest1[i*8+j]);
478 }
479 printf("\n");
480 }
115329f1 481
a46a3ce4
FB
482 printf("out=\n");
483 for(i=0;i<8;i++) {
484 int j;
485 for(j=0;j<8;j++) {
486 printf(" %3d", img_dest[i*8+j]);
487 }
488 printf("\n");
489 }
490#endif
a46a3ce4
FB
491 }
492 printf("%s %s: err_inf=%d\n",
493 1 ? "IDCT248" : "DCT248",
494 name, err_max);
495
496 ti = gettime();
497 it1 = 0;
498 do {
499 for(it=0;it<NB_ITS_SPEED;it++) {
500 for(i=0; i<64; i++)
501 block[i]= block1[i];
502// memcpy(block, block1, sizeof(DCTELEM) * 64);
755bfeab 503// do not memcpy especially not fastmemcpy because it does movntq !!!
a46a3ce4
FB
504 idct248_put(img_dest, 8, block);
505 }
506 it1 += NB_ITS_SPEED;
507 ti1 = gettime() - ti;
508 } while (ti1 < 1000000);
19ef2ba5 509 emms_c();
a46a3ce4
FB
510
511 printf("%s %s: %0.1f kdct/s\n",
512 1 ? "IDCT248" : "DCT248",
513 name, (double)it1 * 1000.0 / (double)ti1);
514}
515
9e1586fc
FB
516void help(void)
517{
86748dbc
MN
518 printf("dct-test [-i] [<test-number>]\n"
519 "test-number 0 -> test with random matrixes\n"
520 " 1 -> test with random sparse matrixes\n"
521 " 2 -> do 3. test from mpeg4 std\n"
a46a3ce4
FB
522 "-i test IDCT implementations\n"
523 "-4 test IDCT248 implementations\n");
9e1586fc
FB
524}
525
de6d9b64
FB
526int main(int argc, char **argv)
527{
a46a3ce4 528 int test_idct = 0, test_248_dct = 0;
86748dbc
MN
529 int c,i;
530 int test=1;
9e1586fc 531
de6d9b64 532 init_fdct();
9e1586fc 533 idct_mmx_init();
28c47a42 534 mm_flags = mm_support();
de6d9b64 535
486497e0 536 for(i=0;i<256;i++) cropTbl[i + MAX_NEG_CROP] = i;
86748dbc 537 for(i=0;i<MAX_NEG_CROP;i++) {
486497e0
MR
538 cropTbl[i] = 0;
539 cropTbl[i + MAX_NEG_CROP + 256] = 255;
86748dbc 540 }
115329f1 541
9e1586fc 542 for(;;) {
a46a3ce4 543 c = getopt(argc, argv, "ih4");
9e1586fc
FB
544 if (c == -1)
545 break;
546 switch(c) {
547 case 'i':
548 test_idct = 1;
549 break;
a46a3ce4
FB
550 case '4':
551 test_248_dct = 1;
552 break;
86748dbc 553 default :
9e1586fc
FB
554 case 'h':
555 help();
c6bdc908 556 return 0;
9e1586fc
FB
557 }
558 }
115329f1 559
86748dbc 560 if(optind <argc) test= atoi(argv[optind]);
115329f1 561
9e1586fc
FB
562 printf("ffmpeg DCT/IDCT test\n");
563
a46a3ce4 564 if (test_248_dct) {
59e6f60a 565 idct248_error("SIMPLE-C", ff_simple_idct248_put);
9e1586fc 566 } else {
3ac35bdb 567 for (i=0;algos[i].name;i++)
3794b928 568 if (algos[i].is_idct == test_idct && !(~mm_flags & algos[i].mm_support)) {
3ac35bdb 569 dct_error (algos[i].name, algos[i].is_idct, algos[i].func, algos[i].ref, algos[i].format, test);
a46a3ce4 570 }
9e1586fc 571 }
de6d9b64
FB
572 return 0;
573}