annotate dct-test.c @ 2497:69adfbbdcdeb libavcodec

- samples from mplayer ftp in the "adv" profile seem to have profile=2, which isn't the advanced one; and indeed, using adv. profile parser fails. Using normal parser works, and that's what is done - attempt at taking care of stride for NORM2 bitplane decoding - duplication of much code from msmpeg4.c; this code isn't yet used, but goes down as far as the block layer (mainly Transform Type stuff, the remains are wild editing without checking). Unusable yet, and lacks the AC decoding (but a step further in bitstream parsing) patch by anonymous
author michael
date Fri, 04 Feb 2005 02:20:38 +0000
parents 1396e33a9cb6
children 062b2d5d1eba
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1106
1e39f273ecd6 per file doxy
michaelni
parents: 1064
diff changeset
1 /**
1e39f273ecd6 per file doxy
michaelni
parents: 1064
diff changeset
2 * @file dct-test.c
1e39f273ecd6 per file doxy
michaelni
parents: 1064
diff changeset
3 * DCT test. (c) 2001 Fabrice Bellard.
1e39f273ecd6 per file doxy
michaelni
parents: 1064
diff changeset
4 * Started from sample code by Juan J. Sierralta P.
1e39f273ecd6 per file doxy
michaelni
parents: 1064
diff changeset
5 */
1e39f273ecd6 per file doxy
michaelni
parents: 1064
diff changeset
6
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
7 #include <stdlib.h>
986e461dc072 Initial revision
glantau
parents:
diff changeset
8 #include <stdio.h>
986e461dc072 Initial revision
glantau
parents:
diff changeset
9 #include <string.h>
986e461dc072 Initial revision
glantau
parents:
diff changeset
10 #include <sys/time.h>
986e461dc072 Initial revision
glantau
parents:
diff changeset
11 #include <unistd.h>
986e461dc072 Initial revision
glantau
parents:
diff changeset
12
986e461dc072 Initial revision
glantau
parents:
diff changeset
13 #include "dsputil.h"
986e461dc072 Initial revision
glantau
parents:
diff changeset
14
33
7cf705a32d1c updated dct-test to test IDCTs too
glantau
parents: 0
diff changeset
15 #include "i386/mmx.h"
633
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
16 #include "simple_idct.h"
1557
5d53c03186a1 floating point AAN DCT
michael
parents: 1106
diff changeset
17 #include "faandct.h"
33
7cf705a32d1c updated dct-test to test IDCTs too
glantau
parents: 0
diff changeset
18
980
0c32f81b42b2 suppressed getopt.h
bellard
parents: 722
diff changeset
19 #ifndef MAX
0c32f81b42b2 suppressed getopt.h
bellard
parents: 722
diff changeset
20 #define MAX(a, b) (((a) > (b)) ? (a) : (b))
0c32f81b42b2 suppressed getopt.h
bellard
parents: 722
diff changeset
21 #endif
0c32f81b42b2 suppressed getopt.h
bellard
parents: 722
diff changeset
22
33
7cf705a32d1c updated dct-test to test IDCTs too
glantau
parents: 0
diff changeset
23 /* reference fdct/idct */
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
24 extern void fdct(DCTELEM *block);
33
7cf705a32d1c updated dct-test to test IDCTs too
glantau
parents: 0
diff changeset
25 extern void idct(DCTELEM *block);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
26 extern void init_fdct();
986e461dc072 Initial revision
glantau
parents:
diff changeset
27
33
7cf705a32d1c updated dct-test to test IDCTs too
glantau
parents: 0
diff changeset
28 extern void j_rev_dct(DCTELEM *data);
7cf705a32d1c updated dct-test to test IDCTs too
glantau
parents: 0
diff changeset
29 extern void ff_mmx_idct(DCTELEM *data);
7cf705a32d1c updated dct-test to test IDCTs too
glantau
parents: 0
diff changeset
30 extern void ff_mmxext_idct(DCTELEM *data);
7cf705a32d1c updated dct-test to test IDCTs too
glantau
parents: 0
diff changeset
31
633
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
32 extern void odivx_idct_c (short *block);
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
33
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
34 #define AANSCALE_BITS 12
986e461dc072 Initial revision
glantau
parents:
diff changeset
35 static const unsigned short aanscales[64] = {
986e461dc072 Initial revision
glantau
parents:
diff changeset
36 /* precomputed values scaled up by 14 bits */
986e461dc072 Initial revision
glantau
parents:
diff changeset
37 16384, 22725, 21407, 19266, 16384, 12873, 8867, 4520,
986e461dc072 Initial revision
glantau
parents:
diff changeset
38 22725, 31521, 29692, 26722, 22725, 17855, 12299, 6270,
986e461dc072 Initial revision
glantau
parents:
diff changeset
39 21407, 29692, 27969, 25172, 21407, 16819, 11585, 5906,
986e461dc072 Initial revision
glantau
parents:
diff changeset
40 19266, 26722, 25172, 22654, 19266, 15137, 10426, 5315,
986e461dc072 Initial revision
glantau
parents:
diff changeset
41 16384, 22725, 21407, 19266, 16384, 12873, 8867, 4520,
986e461dc072 Initial revision
glantau
parents:
diff changeset
42 12873, 17855, 16819, 15137, 12873, 10114, 6967, 3552,
986e461dc072 Initial revision
glantau
parents:
diff changeset
43 8867, 12299, 11585, 10426, 8867, 6967, 4799, 2446,
986e461dc072 Initial revision
glantau
parents:
diff changeset
44 4520, 6270, 5906, 5315, 4520, 3552, 2446, 1247
986e461dc072 Initial revision
glantau
parents:
diff changeset
45 };
986e461dc072 Initial revision
glantau
parents:
diff changeset
46
1064
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 980
diff changeset
47 uint8_t cropTbl[256 + 2 * MAX_NEG_CROP];
633
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
48
1064
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 980
diff changeset
49 int64_t gettime(void)
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
50 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
51 struct timeval tv;
986e461dc072 Initial revision
glantau
parents:
diff changeset
52 gettimeofday(&tv,NULL);
1064
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 980
diff changeset
53 return (int64_t)tv.tv_sec * 1000000 + tv.tv_usec;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
54 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
55
986e461dc072 Initial revision
glantau
parents:
diff changeset
56 #define NB_ITS 20000
986e461dc072 Initial revision
glantau
parents:
diff changeset
57 #define NB_ITS_SPEED 50000
986e461dc072 Initial revision
glantau
parents:
diff changeset
58
33
7cf705a32d1c updated dct-test to test IDCTs too
glantau
parents: 0
diff changeset
59 static short idct_mmx_perm[64];
7cf705a32d1c updated dct-test to test IDCTs too
glantau
parents: 0
diff changeset
60
633
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
61 static short idct_simple_mmx_perm[64]={
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
62 0x00, 0x08, 0x04, 0x09, 0x01, 0x0C, 0x05, 0x0D,
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
63 0x10, 0x18, 0x14, 0x19, 0x11, 0x1C, 0x15, 0x1D,
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
64 0x20, 0x28, 0x24, 0x29, 0x21, 0x2C, 0x25, 0x2D,
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
65 0x12, 0x1A, 0x16, 0x1B, 0x13, 0x1E, 0x17, 0x1F,
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
66 0x02, 0x0A, 0x06, 0x0B, 0x03, 0x0E, 0x07, 0x0F,
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
67 0x30, 0x38, 0x34, 0x39, 0x31, 0x3C, 0x35, 0x3D,
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
68 0x22, 0x2A, 0x26, 0x2B, 0x23, 0x2E, 0x27, 0x2F,
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
69 0x32, 0x3A, 0x36, 0x3B, 0x33, 0x3E, 0x37, 0x3F,
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
70 };
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
71
33
7cf705a32d1c updated dct-test to test IDCTs too
glantau
parents: 0
diff changeset
72 void idct_mmx_init(void)
7cf705a32d1c updated dct-test to test IDCTs too
glantau
parents: 0
diff changeset
73 {
7cf705a32d1c updated dct-test to test IDCTs too
glantau
parents: 0
diff changeset
74 int i;
7cf705a32d1c updated dct-test to test IDCTs too
glantau
parents: 0
diff changeset
75
7cf705a32d1c updated dct-test to test IDCTs too
glantau
parents: 0
diff changeset
76 /* the mmx/mmxext idct uses a reordered input, so we patch scan tables */
7cf705a32d1c updated dct-test to test IDCTs too
glantau
parents: 0
diff changeset
77 for (i = 0; i < 64; i++) {
7cf705a32d1c updated dct-test to test IDCTs too
glantau
parents: 0
diff changeset
78 idct_mmx_perm[i] = (i & 0x38) | ((i & 6) >> 1) | ((i & 1) << 2);
633
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
79 // idct_simple_mmx_perm[i] = simple_block_permute_op(i);
33
7cf705a32d1c updated dct-test to test IDCTs too
glantau
parents: 0
diff changeset
80 }
7cf705a32d1c updated dct-test to test IDCTs too
glantau
parents: 0
diff changeset
81 }
7cf705a32d1c updated dct-test to test IDCTs too
glantau
parents: 0
diff changeset
82
7cf705a32d1c updated dct-test to test IDCTs too
glantau
parents: 0
diff changeset
83 static DCTELEM block[64] __attribute__ ((aligned (8)));
7cf705a32d1c updated dct-test to test IDCTs too
glantau
parents: 0
diff changeset
84 static DCTELEM block1[64] __attribute__ ((aligned (8)));
633
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
85 static DCTELEM block_org[64] __attribute__ ((aligned (8)));
33
7cf705a32d1c updated dct-test to test IDCTs too
glantau
parents: 0
diff changeset
86
7cf705a32d1c updated dct-test to test IDCTs too
glantau
parents: 0
diff changeset
87 void dct_error(const char *name, int is_idct,
7cf705a32d1c updated dct-test to test IDCTs too
glantau
parents: 0
diff changeset
88 void (*fdct_func)(DCTELEM *block),
633
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
89 void (*fdct_ref)(DCTELEM *block), int test)
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
90 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
91 int it, i, scale;
986e461dc072 Initial revision
glantau
parents:
diff changeset
92 int err_inf, v;
1064
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 980
diff changeset
93 int64_t err2, ti, ti1, it1;
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 980
diff changeset
94 int64_t sysErr[64], sysErrMax=0;
633
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
95 int maxout=0;
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
96 int blockSumErrMax=0, blockSumErr;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
97
986e461dc072 Initial revision
glantau
parents:
diff changeset
98 srandom(0);
986e461dc072 Initial revision
glantau
parents:
diff changeset
99
986e461dc072 Initial revision
glantau
parents:
diff changeset
100 err_inf = 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
101 err2 = 0;
633
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
102 for(i=0; i<64; i++) sysErr[i]=0;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
103 for(it=0;it<NB_ITS;it++) {
633
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
104 for(i=0;i<64;i++)
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
105 block1[i] = 0;
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
106 switch(test){
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
107 case 0:
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
108 for(i=0;i<64;i++)
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
109 block1[i] = (random() % 512) -256;
635
3e0f62e5eed6 dct cleanup
michaelni
parents: 633
diff changeset
110 if (is_idct){
633
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
111 fdct(block1);
635
3e0f62e5eed6 dct cleanup
michaelni
parents: 633
diff changeset
112
3e0f62e5eed6 dct cleanup
michaelni
parents: 633
diff changeset
113 for(i=0;i<64;i++)
3e0f62e5eed6 dct cleanup
michaelni
parents: 633
diff changeset
114 block1[i]>>=3;
3e0f62e5eed6 dct cleanup
michaelni
parents: 633
diff changeset
115 }
633
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
116 break;
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
117 case 1:{
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
118 int num= (random()%10)+1;
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
119 for(i=0;i<num;i++)
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
120 block1[random()%64] = (random() % 512) -256;
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
121 }break;
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
122 case 2:
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
123 block1[0]= (random()%4096)-2048;
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
124 block1[63]= (block1[0]&1)^1;
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
125 break;
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
126 }
33
7cf705a32d1c updated dct-test to test IDCTs too
glantau
parents: 0
diff changeset
127
633
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
128 #if 0 // simulate mismatch control
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
129 { int sum=0;
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
130 for(i=0;i<64;i++)
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
131 sum+=block1[i];
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
132
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
133 if((sum&1)==0) block1[63]^=1;
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
134 }
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
135 #endif
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
136
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
137 for(i=0; i<64; i++)
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
138 block_org[i]= block1[i];
33
7cf705a32d1c updated dct-test to test IDCTs too
glantau
parents: 0
diff changeset
139
7cf705a32d1c updated dct-test to test IDCTs too
glantau
parents: 0
diff changeset
140 if (fdct_func == ff_mmx_idct ||
633
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
141 fdct_func == j_rev_dct || fdct_func == ff_mmxext_idct) {
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
142 for(i=0;i<64;i++)
33
7cf705a32d1c updated dct-test to test IDCTs too
glantau
parents: 0
diff changeset
143 block[idct_mmx_perm[i]] = block1[i];
720
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
144 } else if(fdct_func == ff_simple_idct_mmx ) {
633
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
145 for(i=0;i<64;i++)
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
146 block[idct_simple_mmx_perm[i]] = block1[i];
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
147
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
148 } else {
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
149 for(i=0; i<64; i++)
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
150 block[i]= block1[i];
33
7cf705a32d1c updated dct-test to test IDCTs too
glantau
parents: 0
diff changeset
151 }
633
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
152 #if 0 // simulate mismatch control for tested IDCT but not the ref
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
153 { int sum=0;
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
154 for(i=0;i<64;i++)
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
155 sum+=block[i];
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
156
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
157 if((sum&1)==0) block[63]^=1;
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
158 }
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
159 #endif
33
7cf705a32d1c updated dct-test to test IDCTs too
glantau
parents: 0
diff changeset
160
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
161 fdct_func(block);
33
7cf705a32d1c updated dct-test to test IDCTs too
glantau
parents: 0
diff changeset
162 emms(); /* for ff_mmx_idct */
7cf705a32d1c updated dct-test to test IDCTs too
glantau
parents: 0
diff changeset
163
1562
bf452704100f optionally merge postscale into quantization table for the float aan dct
michael
parents: 1557
diff changeset
164 if (fdct_func == fdct_ifast
bf452704100f optionally merge postscale into quantization table for the float aan dct
michael
parents: 1557
diff changeset
165 #ifndef FAAN_POSTSCALE
bf452704100f optionally merge postscale into quantization table for the float aan dct
michael
parents: 1557
diff changeset
166 || fdct_func == ff_faandct
bf452704100f optionally merge postscale into quantization table for the float aan dct
michael
parents: 1557
diff changeset
167 #endif
bf452704100f optionally merge postscale into quantization table for the float aan dct
michael
parents: 1557
diff changeset
168 ) {
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
169 for(i=0; i<64; i++) {
635
3e0f62e5eed6 dct cleanup
michaelni
parents: 633
diff changeset
170 scale = 8*(1 << (AANSCALE_BITS + 11)) / aanscales[i];
633
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
171 block[i] = (block[i] * scale /*+ (1<<(AANSCALE_BITS-1))*/) >> AANSCALE_BITS;
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
172 }
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
173 }
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
174
33
7cf705a32d1c updated dct-test to test IDCTs too
glantau
parents: 0
diff changeset
175 fdct_ref(block1);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
176
633
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
177 blockSumErr=0;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
178 for(i=0;i<64;i++) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
179 v = abs(block[i] - block1[i]);
986e461dc072 Initial revision
glantau
parents:
diff changeset
180 if (v > err_inf)
986e461dc072 Initial revision
glantau
parents:
diff changeset
181 err_inf = v;
986e461dc072 Initial revision
glantau
parents:
diff changeset
182 err2 += v * v;
633
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
183 sysErr[i] += block[i] - block1[i];
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
184 blockSumErr += v;
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
185 if( abs(block[i])>maxout) maxout=abs(block[i]);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
186 }
633
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
187 if(blockSumErrMax < blockSumErr) blockSumErrMax= blockSumErr;
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
188 #if 0 // print different matrix pairs
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
189 if(blockSumErr){
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
190 printf("\n");
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
191 for(i=0; i<64; i++){
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
192 if((i&7)==0) printf("\n");
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
193 printf("%4d ", block_org[i]);
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
194 }
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
195 for(i=0; i<64; i++){
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
196 if((i&7)==0) printf("\n");
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
197 printf("%4d ", block[i] - block1[i]);
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
198 }
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
199 }
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
200 #endif
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
201 }
633
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
202 for(i=0; i<64; i++) sysErrMax= MAX(sysErrMax, ABS(sysErr[i]));
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
203
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
204 #if 1 // dump systematic errors
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
205 for(i=0; i<64; i++){
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
206 if(i%8==0) printf("\n");
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
207 printf("%5d ", (int)sysErr[i]);
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
208 }
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
209 printf("\n");
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
210 #endif
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
211
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
212 printf("%s %s: err_inf=%d err2=%0.8f syserr=%0.8f maxout=%d blockSumErr=%d\n",
33
7cf705a32d1c updated dct-test to test IDCTs too
glantau
parents: 0
diff changeset
213 is_idct ? "IDCT" : "DCT",
633
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
214 name, err_inf, (double)err2 / NB_ITS / 64.0, (double)sysErrMax / NB_ITS, maxout, blockSumErrMax);
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
215 #if 1 //Speed test
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
216 /* speed test */
633
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
217 for(i=0;i<64;i++)
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
218 block1[i] = 0;
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
219 switch(test){
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
220 case 0:
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
221 for(i=0;i<64;i++)
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
222 block1[i] = (random() % 512) -256;
635
3e0f62e5eed6 dct cleanup
michaelni
parents: 633
diff changeset
223 if (is_idct){
633
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
224 fdct(block1);
635
3e0f62e5eed6 dct cleanup
michaelni
parents: 633
diff changeset
225
3e0f62e5eed6 dct cleanup
michaelni
parents: 633
diff changeset
226 for(i=0;i<64;i++)
3e0f62e5eed6 dct cleanup
michaelni
parents: 633
diff changeset
227 block1[i]>>=3;
3e0f62e5eed6 dct cleanup
michaelni
parents: 633
diff changeset
228 }
633
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
229 break;
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
230 case 1:{
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
231 case 2:
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
232 block1[0] = (random() % 512) -256;
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
233 block1[1] = (random() % 512) -256;
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
234 block1[2] = (random() % 512) -256;
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
235 block1[3] = (random() % 512) -256;
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
236 }break;
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
237 }
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
238
33
7cf705a32d1c updated dct-test to test IDCTs too
glantau
parents: 0
diff changeset
239 if (fdct_func == ff_mmx_idct ||
633
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
240 fdct_func == j_rev_dct || fdct_func == ff_mmxext_idct) {
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
241 for(i=0;i<64;i++)
33
7cf705a32d1c updated dct-test to test IDCTs too
glantau
parents: 0
diff changeset
242 block[idct_mmx_perm[i]] = block1[i];
720
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
243 } else if(fdct_func == ff_simple_idct_mmx ) {
633
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
244 for(i=0;i<64;i++)
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
245 block[idct_simple_mmx_perm[i]] = block1[i];
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
246 } else {
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
247 for(i=0; i<64; i++)
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
248 block[i]= block1[i];
33
7cf705a32d1c updated dct-test to test IDCTs too
glantau
parents: 0
diff changeset
249 }
7cf705a32d1c updated dct-test to test IDCTs too
glantau
parents: 0
diff changeset
250
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
251 ti = gettime();
986e461dc072 Initial revision
glantau
parents:
diff changeset
252 it1 = 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
253 do {
986e461dc072 Initial revision
glantau
parents:
diff changeset
254 for(it=0;it<NB_ITS_SPEED;it++) {
633
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
255 for(i=0; i<64; i++)
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
256 block[i]= block1[i];
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
257 // memcpy(block, block1, sizeof(DCTELEM) * 64);
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
258 // dont memcpy especially not fastmemcpy because it does movntq !!!
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
259 fdct_func(block);
986e461dc072 Initial revision
glantau
parents:
diff changeset
260 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
261 it1 += NB_ITS_SPEED;
986e461dc072 Initial revision
glantau
parents:
diff changeset
262 ti1 = gettime() - ti;
986e461dc072 Initial revision
glantau
parents:
diff changeset
263 } while (ti1 < 1000000);
33
7cf705a32d1c updated dct-test to test IDCTs too
glantau
parents: 0
diff changeset
264 emms();
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
265
633
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
266 printf("%s %s: %0.1f kdct/s\n",
33
7cf705a32d1c updated dct-test to test IDCTs too
glantau
parents: 0
diff changeset
267 is_idct ? "IDCT" : "DCT",
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
268 name, (double)it1 * 1000.0 / (double)ti1);
633
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
269 #endif
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
270 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
271
1064
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 980
diff changeset
272 static uint8_t img_dest[64] __attribute__ ((aligned (8)));
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 980
diff changeset
273 static uint8_t img_dest1[64] __attribute__ ((aligned (8)));
720
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
274
1064
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 980
diff changeset
275 void idct248_ref(uint8_t *dest, int linesize, int16_t *block)
720
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
276 {
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
277 static int init;
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
278 static double c8[8][8];
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
279 static double c4[4][4];
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
280 double block1[64], block2[64], block3[64];
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
281 double s, sum, v;
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
282 int i, j, k;
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
283
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
284 if (!init) {
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
285 init = 1;
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
286
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
287 for(i=0;i<8;i++) {
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
288 sum = 0;
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
289 for(j=0;j<8;j++) {
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
290 s = (i==0) ? sqrt(1.0/8.0) : sqrt(1.0/4.0);
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
291 c8[i][j] = s * cos(M_PI * i * (j + 0.5) / 8.0);
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
292 sum += c8[i][j] * c8[i][j];
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
293 }
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
294 }
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
295
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
296 for(i=0;i<4;i++) {
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
297 sum = 0;
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
298 for(j=0;j<4;j++) {
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
299 s = (i==0) ? sqrt(1.0/4.0) : sqrt(1.0/2.0);
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
300 c4[i][j] = s * cos(M_PI * i * (j + 0.5) / 4.0);
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
301 sum += c4[i][j] * c4[i][j];
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
302 }
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
303 }
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
304 }
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
305
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
306 /* butterfly */
722
ff90043f4a2d in fact IDCT248 needs to be normalized as I suspected
bellard
parents: 720
diff changeset
307 s = 0.5 * sqrt(2.0);
720
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
308 for(i=0;i<4;i++) {
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
309 for(j=0;j<8;j++) {
722
ff90043f4a2d in fact IDCT248 needs to be normalized as I suspected
bellard
parents: 720
diff changeset
310 block1[8*(2*i)+j] = (block[8*(2*i)+j] + block[8*(2*i+1)+j]) * s;
ff90043f4a2d in fact IDCT248 needs to be normalized as I suspected
bellard
parents: 720
diff changeset
311 block1[8*(2*i+1)+j] = (block[8*(2*i)+j] - block[8*(2*i+1)+j]) * s;
720
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
312 }
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
313 }
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
314
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
315 /* idct8 on lines */
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
316 for(i=0;i<8;i++) {
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
317 for(j=0;j<8;j++) {
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
318 sum = 0;
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
319 for(k=0;k<8;k++)
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
320 sum += c8[k][j] * block1[8*i+k];
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
321 block2[8*i+j] = sum;
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
322 }
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
323 }
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
324
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
325 /* idct4 */
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
326 for(i=0;i<8;i++) {
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
327 for(j=0;j<4;j++) {
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
328 /* top */
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
329 sum = 0;
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
330 for(k=0;k<4;k++)
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
331 sum += c4[k][j] * block2[8*(2*k)+i];
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
332 block3[8*(2*j)+i] = sum;
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
333
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
334 /* bottom */
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
335 sum = 0;
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
336 for(k=0;k<4;k++)
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
337 sum += c4[k][j] * block2[8*(2*k+1)+i];
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
338 block3[8*(2*j+1)+i] = sum;
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
339 }
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
340 }
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
341
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
342 /* clamp and store the result */
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
343 for(i=0;i<8;i++) {
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
344 for(j=0;j<8;j++) {
722
ff90043f4a2d in fact IDCT248 needs to be normalized as I suspected
bellard
parents: 720
diff changeset
345 v = block3[8*i+j];
720
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
346 if (v < 0)
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
347 v = 0;
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
348 else if (v > 255)
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
349 v = 255;
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
350 dest[i * linesize + j] = (int)rint(v);
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
351 }
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
352 }
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
353 }
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
354
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
355 void idct248_error(const char *name,
1064
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 980
diff changeset
356 void (*idct248_put)(uint8_t *dest, int line_size, int16_t *block))
720
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
357 {
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
358 int it, i, it1, ti, ti1, err_max, v;
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
359
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
360 srandom(0);
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
361
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
362 /* just one test to see if code is correct (precision is less
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
363 important here) */
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
364 err_max = 0;
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
365 for(it=0;it<NB_ITS;it++) {
722
ff90043f4a2d in fact IDCT248 needs to be normalized as I suspected
bellard
parents: 720
diff changeset
366
ff90043f4a2d in fact IDCT248 needs to be normalized as I suspected
bellard
parents: 720
diff changeset
367 /* XXX: use forward transform to generate values */
720
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
368 for(i=0;i<64;i++)
722
ff90043f4a2d in fact IDCT248 needs to be normalized as I suspected
bellard
parents: 720
diff changeset
369 block1[i] = (random() % 256) - 128;
ff90043f4a2d in fact IDCT248 needs to be normalized as I suspected
bellard
parents: 720
diff changeset
370 block1[0] += 1024;
ff90043f4a2d in fact IDCT248 needs to be normalized as I suspected
bellard
parents: 720
diff changeset
371
720
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
372 for(i=0; i<64; i++)
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
373 block[i]= block1[i];
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
374 idct248_ref(img_dest1, 8, block);
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
375
722
ff90043f4a2d in fact IDCT248 needs to be normalized as I suspected
bellard
parents: 720
diff changeset
376 for(i=0; i<64; i++)
ff90043f4a2d in fact IDCT248 needs to be normalized as I suspected
bellard
parents: 720
diff changeset
377 block[i]= block1[i];
ff90043f4a2d in fact IDCT248 needs to be normalized as I suspected
bellard
parents: 720
diff changeset
378 idct248_put(img_dest, 8, block);
ff90043f4a2d in fact IDCT248 needs to be normalized as I suspected
bellard
parents: 720
diff changeset
379
ff90043f4a2d in fact IDCT248 needs to be normalized as I suspected
bellard
parents: 720
diff changeset
380 for(i=0;i<64;i++) {
ff90043f4a2d in fact IDCT248 needs to be normalized as I suspected
bellard
parents: 720
diff changeset
381 v = abs((int)img_dest[i] - (int)img_dest1[i]);
ff90043f4a2d in fact IDCT248 needs to be normalized as I suspected
bellard
parents: 720
diff changeset
382 if (v == 255)
ff90043f4a2d in fact IDCT248 needs to be normalized as I suspected
bellard
parents: 720
diff changeset
383 printf("%d %d\n", img_dest[i], img_dest1[i]);
ff90043f4a2d in fact IDCT248 needs to be normalized as I suspected
bellard
parents: 720
diff changeset
384 if (v > err_max)
ff90043f4a2d in fact IDCT248 needs to be normalized as I suspected
bellard
parents: 720
diff changeset
385 err_max = v;
ff90043f4a2d in fact IDCT248 needs to be normalized as I suspected
bellard
parents: 720
diff changeset
386 }
720
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
387 #if 0
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
388 printf("ref=\n");
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
389 for(i=0;i<8;i++) {
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
390 int j;
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
391 for(j=0;j<8;j++) {
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
392 printf(" %3d", img_dest1[i*8+j]);
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
393 }
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
394 printf("\n");
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
395 }
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
396
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
397 printf("out=\n");
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
398 for(i=0;i<8;i++) {
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
399 int j;
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
400 for(j=0;j<8;j++) {
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
401 printf(" %3d", img_dest[i*8+j]);
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
402 }
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
403 printf("\n");
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
404 }
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
405 #endif
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
406 }
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
407 printf("%s %s: err_inf=%d\n",
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
408 1 ? "IDCT248" : "DCT248",
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
409 name, err_max);
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
410
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
411 ti = gettime();
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
412 it1 = 0;
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
413 do {
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
414 for(it=0;it<NB_ITS_SPEED;it++) {
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
415 for(i=0; i<64; i++)
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
416 block[i]= block1[i];
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
417 // memcpy(block, block1, sizeof(DCTELEM) * 64);
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
418 // dont memcpy especially not fastmemcpy because it does movntq !!!
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
419 idct248_put(img_dest, 8, block);
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
420 }
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
421 it1 += NB_ITS_SPEED;
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
422 ti1 = gettime() - ti;
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
423 } while (ti1 < 1000000);
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
424 emms();
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
425
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
426 printf("%s %s: %0.1f kdct/s\n",
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
427 1 ? "IDCT248" : "DCT248",
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
428 name, (double)it1 * 1000.0 / (double)ti1);
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
429 }
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
430
33
7cf705a32d1c updated dct-test to test IDCTs too
glantau
parents: 0
diff changeset
431 void help(void)
7cf705a32d1c updated dct-test to test IDCTs too
glantau
parents: 0
diff changeset
432 {
633
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
433 printf("dct-test [-i] [<test-number>]\n"
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
434 "test-number 0 -> test with random matrixes\n"
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
435 " 1 -> test with random sparse matrixes\n"
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
436 " 2 -> do 3. test from mpeg4 std\n"
720
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
437 "-i test IDCT implementations\n"
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
438 "-4 test IDCT248 implementations\n");
33
7cf705a32d1c updated dct-test to test IDCTs too
glantau
parents: 0
diff changeset
439 exit(1);
7cf705a32d1c updated dct-test to test IDCTs too
glantau
parents: 0
diff changeset
440 }
7cf705a32d1c updated dct-test to test IDCTs too
glantau
parents: 0
diff changeset
441
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
442 int main(int argc, char **argv)
986e461dc072 Initial revision
glantau
parents:
diff changeset
443 {
720
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
444 int test_idct = 0, test_248_dct = 0;
633
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
445 int c,i;
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
446 int test=1;
33
7cf705a32d1c updated dct-test to test IDCTs too
glantau
parents: 0
diff changeset
447
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
448 init_fdct();
33
7cf705a32d1c updated dct-test to test IDCTs too
glantau
parents: 0
diff changeset
449 idct_mmx_init();
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
450
633
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
451 for(i=0;i<256;i++) cropTbl[i + MAX_NEG_CROP] = i;
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
452 for(i=0;i<MAX_NEG_CROP;i++) {
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
453 cropTbl[i] = 0;
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
454 cropTbl[i + MAX_NEG_CROP + 256] = 255;
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
455 }
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
456
33
7cf705a32d1c updated dct-test to test IDCTs too
glantau
parents: 0
diff changeset
457 for(;;) {
720
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
458 c = getopt(argc, argv, "ih4");
33
7cf705a32d1c updated dct-test to test IDCTs too
glantau
parents: 0
diff changeset
459 if (c == -1)
7cf705a32d1c updated dct-test to test IDCTs too
glantau
parents: 0
diff changeset
460 break;
7cf705a32d1c updated dct-test to test IDCTs too
glantau
parents: 0
diff changeset
461 switch(c) {
7cf705a32d1c updated dct-test to test IDCTs too
glantau
parents: 0
diff changeset
462 case 'i':
7cf705a32d1c updated dct-test to test IDCTs too
glantau
parents: 0
diff changeset
463 test_idct = 1;
7cf705a32d1c updated dct-test to test IDCTs too
glantau
parents: 0
diff changeset
464 break;
720
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
465 case '4':
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
466 test_248_dct = 1;
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
467 break;
633
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
468 default :
33
7cf705a32d1c updated dct-test to test IDCTs too
glantau
parents: 0
diff changeset
469 case 'h':
7cf705a32d1c updated dct-test to test IDCTs too
glantau
parents: 0
diff changeset
470 help();
7cf705a32d1c updated dct-test to test IDCTs too
glantau
parents: 0
diff changeset
471 break;
7cf705a32d1c updated dct-test to test IDCTs too
glantau
parents: 0
diff changeset
472 }
7cf705a32d1c updated dct-test to test IDCTs too
glantau
parents: 0
diff changeset
473 }
633
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
474
e7b72c1dfa1b dct-test update
michaelni
parents: 474
diff changeset
475 if(optind <argc) test= atoi(argv[optind]);
33
7cf705a32d1c updated dct-test to test IDCTs too
glantau
parents: 0
diff changeset
476
7cf705a32d1c updated dct-test to test IDCTs too
glantau
parents: 0
diff changeset
477 printf("ffmpeg DCT/IDCT test\n");
7cf705a32d1c updated dct-test to test IDCTs too
glantau
parents: 0
diff changeset
478
720
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
479 if (test_248_dct) {
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
480 idct248_error("SIMPLE-C", simple_idct248_put);
33
7cf705a32d1c updated dct-test to test IDCTs too
glantau
parents: 0
diff changeset
481 } else {
720
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
482 if (!test_idct) {
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
483 dct_error("REF-DBL", 0, fdct, fdct, test); /* only to verify code ! */
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
484 dct_error("IJG-AAN-INT", 0, fdct_ifast, fdct, test);
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
485 dct_error("IJG-LLM-INT", 0, ff_jpeg_fdct_islow, fdct, test);
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
486 dct_error("MMX", 0, ff_fdct_mmx, fdct, test);
1574
michael
parents: 1562
diff changeset
487 dct_error("MMX2", 0, ff_fdct_mmx2, fdct, test);
1557
5d53c03186a1 floating point AAN DCT
michael
parents: 1106
diff changeset
488 dct_error("FAAN", 0, ff_faandct, fdct, test);
720
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
489 } else {
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
490 dct_error("REF-DBL", 1, idct, idct, test);
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
491 dct_error("INT", 1, j_rev_dct, idct, test);
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
492 dct_error("LIBMPEG2-MMX", 1, ff_mmx_idct, idct, test);
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
493 dct_error("LIBMPEG2-MMXEXT", 1, ff_mmxext_idct, idct, test);
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
494 dct_error("SIMPLE-C", 1, simple_idct, idct, test);
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
495 dct_error("SIMPLE-MMX", 1, ff_simple_idct_mmx, idct, test);
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
496 // dct_error("ODIVX-C", 1, odivx_idct_c, idct);
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
497 //printf(" test against odivx idct\n");
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
498 // dct_error("REF", 1, idct, odivx_idct_c);
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
499 // dct_error("INT", 1, j_rev_dct, odivx_idct_c);
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
500 // dct_error("MMX", 1, ff_mmx_idct, odivx_idct_c);
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
501 // dct_error("MMXEXT", 1, ff_mmxext_idct, odivx_idct_c);
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
502 // dct_error("SIMPLE-C", 1, simple_idct, odivx_idct_c);
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
503 // dct_error("SIMPLE-MMX", 1, ff_simple_idct_mmx, odivx_idct_c);
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
504 // dct_error("ODIVX-C", 1, odivx_idct_c, odivx_idct_c);
409bdaa0b964 added IDCT248 testing
bellard
parents: 687
diff changeset
505 }
33
7cf705a32d1c updated dct-test to test IDCTs too
glantau
parents: 0
diff changeset
506 }
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
507 return 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
508 }