mark read-only data as const
[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
FB
34
35#include "dsputil.h"
36
86748dbc 37#include "simple_idct.h"
65e4c8c9 38#include "faandct.h"
6f08c541 39#include "faanidct.h"
54a0b6e5 40#include "i386/idct_xvid.h"
9e1586fc 41
e366e679
FB
42#ifndef MAX
43#define MAX(a, b) (((a) > (b)) ? (a) : (b))
44#endif
45
434df899 46#undef printf
cc61f96f 47#undef random
434df899
MN
48
49void *fast_memcpy(void *a, const void *b, size_t c){return memcpy(a,b,c);};
50
9e1586fc 51/* reference fdct/idct */
de6d9b64 52extern void fdct(DCTELEM *block);
9e1586fc 53extern void idct(DCTELEM *block);
de6d9b64
FB
54extern void init_fdct();
55
9e1586fc
FB
56extern void ff_mmx_idct(DCTELEM *data);
57extern void ff_mmxext_idct(DCTELEM *data);
58
86748dbc
MN
59extern void odivx_idct_c (short *block);
60
3ac35bdb
MH
61// BFIN
62extern void ff_bfin_idct (DCTELEM *block) ;
63extern void ff_bfin_fdct (DCTELEM *block) ;
64
65// ALTIVEC
66extern void fdct_altivec (DCTELEM *block);
67//extern void idct_altivec (DCTELEM *block);?? no routine
68
69
70struct algo {
f5b67781 71 const char *name;
3ac35bdb
MH
72 enum { FDCT, IDCT } is_idct;
73 void (* func) (DCTELEM *block);
74 void (* ref) (DCTELEM *block);
ad246860 75 enum formattag { NO_PERM,MMX_PERM, MMX_SIMPLE_PERM, SCALE_PERM, SSE2_PERM } format;
3794b928 76 int mm_support;
3ac35bdb
MH
77};
78
79#ifndef FAAN_POSTSCALE
80#define FAAN_SCALE SCALE_PERM
81#else
82#define FAAN_SCALE NO_PERM
83#endif
84
3ac35bdb 85struct algo algos[] = {
1a7ee380
AS
86 {"REF-DBL", 0, fdct, fdct, NO_PERM},
87 {"FAAN", 0, ff_faandct, fdct, FAAN_SCALE},
88 {"FAANI", 1, ff_faanidct, idct, NO_PERM},
89 {"IJG-AAN-INT", 0, fdct_ifast, fdct, SCALE_PERM},
90 {"IJG-LLM-INT", 0, ff_jpeg_fdct_islow, fdct, NO_PERM},
91 {"REF-DBL", 1, idct, idct, NO_PERM},
92 {"INT", 1, j_rev_dct, idct, MMX_PERM},
93 {"SIMPLE-C", 1, ff_simple_idct, idct, NO_PERM},
3ac35bdb 94
ee3035f3 95#ifdef HAVE_MMX
3794b928 96 {"MMX", 0, ff_fdct_mmx, fdct, NO_PERM, MM_MMX},
94254fc0 97#ifdef HAVE_MMX2
3794b928 98 {"MMX2", 0, ff_fdct_mmx2, fdct, NO_PERM, MM_MMXEXT},
94254fc0 99#endif
3ac35bdb 100
b9702de5 101#ifdef CONFIG_GPL
3794b928
AS
102 {"LIBMPEG2-MMX", 1, ff_mmx_idct, idct, MMX_PERM, MM_MMX},
103 {"LIBMPEG2-MMXEXT", 1, ff_mmxext_idct, idct, MMX_PERM, MM_MMXEXT},
b9702de5 104#endif
3794b928
AS
105 {"SIMPLE-MMX", 1, ff_simple_idct_mmx, idct, MMX_SIMPLE_PERM, MM_MMX},
106 {"XVID-MMX", 1, ff_idct_xvid_mmx, idct, NO_PERM, MM_MMX},
107 {"XVID-MMX2", 1, ff_idct_xvid_mmx2, idct, NO_PERM, MM_MMXEXT},
ad246860 108 {"XVID-SSE2", 1, ff_idct_xvid_sse2, idct, SSE2_PERM, MM_SSE2},
3ac35bdb
MH
109#endif
110
111#ifdef HAVE_ALTIVEC
3794b928 112 {"altivecfdct", 0, fdct_altivec, fdct, NO_PERM, 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
FB
123#define AANSCALE_BITS 12
124static const unsigned short aanscales[64] = {
125 /* precomputed values scaled up by 14 bits */
126 16384, 22725, 21407, 19266, 16384, 12873, 8867, 4520,
127 22725, 31521, 29692, 26722, 22725, 17855, 12299, 6270,
128 21407, 29692, 27969, 25172, 21407, 16819, 11585, 5906,
129 19266, 26722, 25172, 22654, 19266, 15137, 10426, 5315,
130 16384, 22725, 21407, 19266, 16384, 12873, 8867, 4520,
131 12873, 17855, 16819, 15137, 12873, 10114, 6967, 3552,
132 8867, 12299, 11585, 10426, 8867, 6967, 4799, 2446,
133 4520, 6270, 5906, 5315, 4520, 3552, 2446, 1247
134};
135
486497e0 136uint8_t cropTbl[256 + 2 * MAX_NEG_CROP];
86748dbc 137
0c1a9eda 138int64_t gettime(void)
de6d9b64
FB
139{
140 struct timeval tv;
141 gettimeofday(&tv,NULL);
0c1a9eda 142 return (int64_t)tv.tv_sec * 1000000 + tv.tv_usec;
de6d9b64
FB
143}
144
145#define NB_ITS 20000
146#define NB_ITS_SPEED 50000
147
9e1586fc
FB
148static short idct_mmx_perm[64];
149
86748dbc 150static short idct_simple_mmx_perm[64]={
bb270c08
DB
151 0x00, 0x08, 0x04, 0x09, 0x01, 0x0C, 0x05, 0x0D,
152 0x10, 0x18, 0x14, 0x19, 0x11, 0x1C, 0x15, 0x1D,
153 0x20, 0x28, 0x24, 0x29, 0x21, 0x2C, 0x25, 0x2D,
154 0x12, 0x1A, 0x16, 0x1B, 0x13, 0x1E, 0x17, 0x1F,
155 0x02, 0x0A, 0x06, 0x0B, 0x03, 0x0E, 0x07, 0x0F,
156 0x30, 0x38, 0x34, 0x39, 0x31, 0x3C, 0x35, 0x3D,
157 0x22, 0x2A, 0x26, 0x2B, 0x23, 0x2E, 0x27, 0x2F,
158 0x32, 0x3A, 0x36, 0x3B, 0x33, 0x3E, 0x37, 0x3F,
86748dbc
MN
159};
160
ad246860
AS
161static const uint8_t idct_sse2_row_perm[8] = {0, 4, 1, 5, 2, 6, 3, 7};
162
9e1586fc
FB
163void idct_mmx_init(void)
164{
165 int i;
166
167 /* the mmx/mmxext idct uses a reordered input, so we patch scan tables */
168 for (i = 0; i < 64; i++) {
bb270c08
DB
169 idct_mmx_perm[i] = (i & 0x38) | ((i & 6) >> 1) | ((i & 1) << 2);
170// idct_simple_mmx_perm[i] = simple_block_permute_op(i);
9e1586fc
FB
171 }
172}
173
55727a83 174static DCTELEM block[64] __attribute__ ((aligned (16)));
9e1586fc 175static DCTELEM block1[64] __attribute__ ((aligned (8)));
86748dbc 176static DCTELEM block_org[64] __attribute__ ((aligned (8)));
9e1586fc
FB
177
178void dct_error(const char *name, int is_idct,
179 void (*fdct_func)(DCTELEM *block),
3ac35bdb 180 void (*fdct_ref)(DCTELEM *block), int form, int test)
de6d9b64
FB
181{
182 int it, i, scale;
de6d9b64 183 int err_inf, v;
0c1a9eda
ZK
184 int64_t err2, ti, ti1, it1;
185 int64_t sysErr[64], sysErrMax=0;
86748dbc 186 int maxout=0;
86748dbc 187 int blockSumErrMax=0, blockSumErr;
de6d9b64
FB
188
189 srandom(0);
190
191 err_inf = 0;
192 err2 = 0;
86748dbc 193 for(i=0; i<64; i++) sysErr[i]=0;
de6d9b64 194 for(it=0;it<NB_ITS;it++) {
86748dbc
MN
195 for(i=0;i<64;i++)
196 block1[i] = 0;
197 switch(test){
115329f1 198 case 0:
86748dbc
MN
199 for(i=0;i<64;i++)
200 block1[i] = (random() % 512) -256;
ad324c93 201 if (is_idct){
86748dbc 202 fdct(block1);
ad324c93
MN
203
204 for(i=0;i<64;i++)
205 block1[i]>>=3;
206 }
86748dbc
MN
207 break;
208 case 1:{
209 int num= (random()%10)+1;
210 for(i=0;i<num;i++)
211 block1[random()%64] = (random() % 512) -256;
212 }break;
213 case 2:
214 block1[0]= (random()%4096)-2048;
215 block1[63]= (block1[0]&1)^1;
216 break;
217 }
9e1586fc 218
86748dbc
MN
219#if 0 // simulate mismatch control
220{ int sum=0;
221 for(i=0;i<64;i++)
222 sum+=block1[i];
223
115329f1 224 if((sum&1)==0) block1[63]^=1;
86748dbc
MN
225}
226#endif
227
228 for(i=0; i<64; i++)
229 block_org[i]= block1[i];
9e1586fc 230
3ac35bdb 231 if (form == MMX_PERM) {
86748dbc 232 for(i=0;i<64;i++)
9e1586fc 233 block[idct_mmx_perm[i]] = block1[i];
3ac35bdb 234 } else if (form == MMX_SIMPLE_PERM) {
86748dbc
MN
235 for(i=0;i<64;i++)
236 block[idct_simple_mmx_perm[i]] = block1[i];
237
ad246860
AS
238 } else if (form == SSE2_PERM) {
239 for(i=0; i<64; i++)
240 block[(i&0x38) | idct_sse2_row_perm[i&7]] = 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);
19ef2ba5 255 emms_c(); /* for ff_mmx_idct */
9e1586fc 256
3ac35bdb 257 if (form == SCALE_PERM) {
de6d9b64 258 for(i=0; i<64; i++) {
ad324c93 259 scale = 8*(1 << (AANSCALE_BITS + 11)) / 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 }
c26abfa5 291 for(i=0; i<64; i++) sysErrMax= MAX(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);
19ef2ba5 352 emms_c();
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);
19ef2ba5 512 emms_c();
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;
9e1586fc 534
de6d9b64 535 init_fdct();
9e1586fc 536 idct_mmx_init();
28c47a42 537 mm_flags = mm_support();
de6d9b64 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++)
3794b928 571 if (algos[i].is_idct == test_idct && !(~mm_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}