Mercurial > libavcodec.hg
annotate dct-test.c @ 6323:e6da66f378c7 libavcodec
mpegvideo.h has two function declarations with the 'inline' specifier
but no definition for those functions. The C standard requires a
definition to appear in the same translation unit for any function
declared with 'inline'. Most of the files including mpegvideo.h do not
define those functions. Fix this by removing the 'inline' specifiers
from the header.
patch by Uoti Urpala
author | diego |
---|---|
date | Sun, 03 Feb 2008 17:54:30 +0000 |
parents | f4859c13426b |
children | 7f9e2b5893fc |
rev | line source |
---|---|
3699
c537a97eec66
Add official LGPL license headers to the files that were missing them.
diego
parents:
3398
diff
changeset
|
1 /* |
c537a97eec66
Add official LGPL license headers to the files that were missing them.
diego
parents:
3398
diff
changeset
|
2 * (c) 2001 Fabrice Bellard |
4755
b7c27288e509
platform-independent restructuring and code simplification
diego
parents:
4754
diff
changeset
|
3 * 2007 Marc Hoffman <marc.hoffman@analog.com> |
3699
c537a97eec66
Add official LGPL license headers to the files that were missing them.
diego
parents:
3398
diff
changeset
|
4 * |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3699
diff
changeset
|
5 * This file is part of FFmpeg. |
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3699
diff
changeset
|
6 * |
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3699
diff
changeset
|
7 * FFmpeg is free software; you can redistribute it and/or |
3699
c537a97eec66
Add official LGPL license headers to the files that were missing them.
diego
parents:
3398
diff
changeset
|
8 * modify it under the terms of the GNU Lesser General Public |
c537a97eec66
Add official LGPL license headers to the files that were missing them.
diego
parents:
3398
diff
changeset
|
9 * License as published by the Free Software Foundation; either |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3699
diff
changeset
|
10 * version 2.1 of the License, or (at your option) any later version. |
3699
c537a97eec66
Add official LGPL license headers to the files that were missing them.
diego
parents:
3398
diff
changeset
|
11 * |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3699
diff
changeset
|
12 * FFmpeg is distributed in the hope that it will be useful, |
3699
c537a97eec66
Add official LGPL license headers to the files that were missing them.
diego
parents:
3398
diff
changeset
|
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
c537a97eec66
Add official LGPL license headers to the files that were missing them.
diego
parents:
3398
diff
changeset
|
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
c537a97eec66
Add official LGPL license headers to the files that were missing them.
diego
parents:
3398
diff
changeset
|
15 * Lesser General Public License for more details. |
c537a97eec66
Add official LGPL license headers to the files that were missing them.
diego
parents:
3398
diff
changeset
|
16 * |
c537a97eec66
Add official LGPL license headers to the files that were missing them.
diego
parents:
3398
diff
changeset
|
17 * You should have received a copy of the GNU Lesser General Public |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3699
diff
changeset
|
18 * License along with FFmpeg; if not, write to the Free Software |
3699
c537a97eec66
Add official LGPL license headers to the files that were missing them.
diego
parents:
3398
diff
changeset
|
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
c537a97eec66
Add official LGPL license headers to the files that were missing them.
diego
parents:
3398
diff
changeset
|
20 */ |
c537a97eec66
Add official LGPL license headers to the files that were missing them.
diego
parents:
3398
diff
changeset
|
21 |
1106 | 22 /** |
23 * @file dct-test.c | |
2967 | 24 * DCT test. (c) 2001 Fabrice Bellard. |
1106 | 25 * Started from sample code by Juan J. Sierralta P. |
26 */ | |
27 | |
0 | 28 #include <stdlib.h> |
29 #include <stdio.h> | |
30 #include <string.h> | |
31 #include <sys/time.h> | |
32 #include <unistd.h> | |
5118
3b190bc34546
Add some #includes to allow compilation without HAVE_AV_CONFIG_H.
diego
parents:
5110
diff
changeset
|
33 #include <math.h> |
0 | 34 |
35 #include "dsputil.h" | |
36 | |
633 | 37 #include "simple_idct.h" |
1557 | 38 #include "faandct.h" |
33 | 39 |
980 | 40 #ifndef MAX |
41 #define MAX(a, b) (((a) > (b)) ? (a) : (b)) | |
42 #endif | |
43 | |
2872 | 44 #undef printf |
5379
e9f8a337c5ce
Fix the compilation of dct-test, fft-test and motion-test which are using
takis
parents:
5127
diff
changeset
|
45 #undef random |
2872 | 46 |
47 void *fast_memcpy(void *a, const void *b, size_t c){return memcpy(a,b,c);}; | |
48 | |
33 | 49 /* reference fdct/idct */ |
0 | 50 extern void fdct(DCTELEM *block); |
33 | 51 extern void idct(DCTELEM *block); |
2872 | 52 extern void ff_idct_xvid_mmx(DCTELEM *block); |
53 extern void ff_idct_xvid_mmx2(DCTELEM *block); | |
0 | 54 extern void init_fdct(); |
55 | |
33 | 56 extern void ff_mmx_idct(DCTELEM *data); |
57 extern void ff_mmxext_idct(DCTELEM *data); | |
58 | |
633 | 59 extern void odivx_idct_c (short *block); |
60 | |
4755
b7c27288e509
platform-independent restructuring and code simplification
diego
parents:
4754
diff
changeset
|
61 // BFIN |
b7c27288e509
platform-independent restructuring and code simplification
diego
parents:
4754
diff
changeset
|
62 extern void ff_bfin_idct (DCTELEM *block) ; |
b7c27288e509
platform-independent restructuring and code simplification
diego
parents:
4754
diff
changeset
|
63 extern void ff_bfin_fdct (DCTELEM *block) ; |
b7c27288e509
platform-independent restructuring and code simplification
diego
parents:
4754
diff
changeset
|
64 |
b7c27288e509
platform-independent restructuring and code simplification
diego
parents:
4754
diff
changeset
|
65 // ALTIVEC |
b7c27288e509
platform-independent restructuring and code simplification
diego
parents:
4754
diff
changeset
|
66 extern void fdct_altivec (DCTELEM *block); |
b7c27288e509
platform-independent restructuring and code simplification
diego
parents:
4754
diff
changeset
|
67 //extern void idct_altivec (DCTELEM *block);?? no routine |
b7c27288e509
platform-independent restructuring and code simplification
diego
parents:
4754
diff
changeset
|
68 |
b7c27288e509
platform-independent restructuring and code simplification
diego
parents:
4754
diff
changeset
|
69 |
b7c27288e509
platform-independent restructuring and code simplification
diego
parents:
4754
diff
changeset
|
70 struct algo { |
b7c27288e509
platform-independent restructuring and code simplification
diego
parents:
4754
diff
changeset
|
71 char *name; |
b7c27288e509
platform-independent restructuring and code simplification
diego
parents:
4754
diff
changeset
|
72 enum { FDCT, IDCT } is_idct; |
b7c27288e509
platform-independent restructuring and code simplification
diego
parents:
4754
diff
changeset
|
73 void (* func) (DCTELEM *block); |
b7c27288e509
platform-independent restructuring and code simplification
diego
parents:
4754
diff
changeset
|
74 void (* ref) (DCTELEM *block); |
b7c27288e509
platform-independent restructuring and code simplification
diego
parents:
4754
diff
changeset
|
75 enum formattag { NO_PERM,MMX_PERM, MMX_SIMPLE_PERM, SCALE_PERM } format; |
b7c27288e509
platform-independent restructuring and code simplification
diego
parents:
4754
diff
changeset
|
76 }; |
b7c27288e509
platform-independent restructuring and code simplification
diego
parents:
4754
diff
changeset
|
77 |
b7c27288e509
platform-independent restructuring and code simplification
diego
parents:
4754
diff
changeset
|
78 #ifndef FAAN_POSTSCALE |
b7c27288e509
platform-independent restructuring and code simplification
diego
parents:
4754
diff
changeset
|
79 #define FAAN_SCALE SCALE_PERM |
b7c27288e509
platform-independent restructuring and code simplification
diego
parents:
4754
diff
changeset
|
80 #else |
b7c27288e509
platform-independent restructuring and code simplification
diego
parents:
4754
diff
changeset
|
81 #define FAAN_SCALE NO_PERM |
b7c27288e509
platform-independent restructuring and code simplification
diego
parents:
4754
diff
changeset
|
82 #endif |
b7c27288e509
platform-independent restructuring and code simplification
diego
parents:
4754
diff
changeset
|
83 |
b7c27288e509
platform-independent restructuring and code simplification
diego
parents:
4754
diff
changeset
|
84 #define DCT_ERROR(name,is_idct,func,ref,form) {name,is_idct,func,ref,form} |
b7c27288e509
platform-independent restructuring and code simplification
diego
parents:
4754
diff
changeset
|
85 |
b7c27288e509
platform-independent restructuring and code simplification
diego
parents:
4754
diff
changeset
|
86 |
b7c27288e509
platform-independent restructuring and code simplification
diego
parents:
4754
diff
changeset
|
87 struct algo algos[] = { |
b7c27288e509
platform-independent restructuring and code simplification
diego
parents:
4754
diff
changeset
|
88 DCT_ERROR( "REF-DBL", 0, fdct, fdct, NO_PERM), |
5107 | 89 DCT_ERROR("FAAN", 0, ff_faandct, fdct, FAAN_SCALE), |
4755
b7c27288e509
platform-independent restructuring and code simplification
diego
parents:
4754
diff
changeset
|
90 DCT_ERROR("IJG-AAN-INT", 0, fdct_ifast, fdct, SCALE_PERM), |
b7c27288e509
platform-independent restructuring and code simplification
diego
parents:
4754
diff
changeset
|
91 DCT_ERROR("IJG-LLM-INT", 0, ff_jpeg_fdct_islow, fdct, NO_PERM), |
b7c27288e509
platform-independent restructuring and code simplification
diego
parents:
4754
diff
changeset
|
92 DCT_ERROR("REF-DBL", 1, idct, idct, NO_PERM), |
b7c27288e509
platform-independent restructuring and code simplification
diego
parents:
4754
diff
changeset
|
93 DCT_ERROR("INT", 1, j_rev_dct, idct, MMX_PERM), |
6001 | 94 DCT_ERROR("SIMPLE-C", 1, ff_simple_idct, idct, NO_PERM), |
4755
b7c27288e509
platform-independent restructuring and code simplification
diego
parents:
4754
diff
changeset
|
95 |
5108 | 96 #ifdef HAVE_MMX |
4755
b7c27288e509
platform-independent restructuring and code simplification
diego
parents:
4754
diff
changeset
|
97 DCT_ERROR("MMX", 0, ff_fdct_mmx, fdct, NO_PERM), |
5110 | 98 #ifdef HAVE_MMX2 |
4755
b7c27288e509
platform-independent restructuring and code simplification
diego
parents:
4754
diff
changeset
|
99 DCT_ERROR("MMX2", 0, ff_fdct_mmx2, fdct, NO_PERM), |
5110 | 100 #endif |
4755
b7c27288e509
platform-independent restructuring and code simplification
diego
parents:
4754
diff
changeset
|
101 |
5109 | 102 #ifdef CONFIG_GPL |
4755
b7c27288e509
platform-independent restructuring and code simplification
diego
parents:
4754
diff
changeset
|
103 DCT_ERROR("LIBMPEG2-MMX", 1, ff_mmx_idct, idct, MMX_PERM), |
b7c27288e509
platform-independent restructuring and code simplification
diego
parents:
4754
diff
changeset
|
104 DCT_ERROR("LIBMPEG2-MMXEXT", 1, ff_mmxext_idct, idct, MMX_PERM), |
5109 | 105 #endif |
4755
b7c27288e509
platform-independent restructuring and code simplification
diego
parents:
4754
diff
changeset
|
106 DCT_ERROR("SIMPLE-MMX", 1, ff_simple_idct_mmx, idct, MMX_SIMPLE_PERM), |
b7c27288e509
platform-independent restructuring and code simplification
diego
parents:
4754
diff
changeset
|
107 DCT_ERROR("XVID-MMX", 1, ff_idct_xvid_mmx, idct, NO_PERM), |
b7c27288e509
platform-independent restructuring and code simplification
diego
parents:
4754
diff
changeset
|
108 DCT_ERROR("XVID-MMX2", 1, ff_idct_xvid_mmx2, idct, NO_PERM), |
b7c27288e509
platform-independent restructuring and code simplification
diego
parents:
4754
diff
changeset
|
109 #endif |
b7c27288e509
platform-independent restructuring and code simplification
diego
parents:
4754
diff
changeset
|
110 |
b7c27288e509
platform-independent restructuring and code simplification
diego
parents:
4754
diff
changeset
|
111 #ifdef HAVE_ALTIVEC |
b7c27288e509
platform-independent restructuring and code simplification
diego
parents:
4754
diff
changeset
|
112 DCT_ERROR("altivecfdct", 0, fdct_altivec, fdct, NO_PERM), |
b7c27288e509
platform-independent restructuring and code simplification
diego
parents:
4754
diff
changeset
|
113 #endif |
b7c27288e509
platform-independent restructuring and code simplification
diego
parents:
4754
diff
changeset
|
114 |
b7c27288e509
platform-independent restructuring and code simplification
diego
parents:
4754
diff
changeset
|
115 #ifdef ARCH_BFIN |
b7c27288e509
platform-independent restructuring and code simplification
diego
parents:
4754
diff
changeset
|
116 DCT_ERROR("BFINfdct", 0, ff_bfin_fdct, fdct, NO_PERM), |
b7c27288e509
platform-independent restructuring and code simplification
diego
parents:
4754
diff
changeset
|
117 DCT_ERROR("BFINidct", 1, ff_bfin_idct, idct, NO_PERM), |
b7c27288e509
platform-independent restructuring and code simplification
diego
parents:
4754
diff
changeset
|
118 #endif |
b7c27288e509
platform-independent restructuring and code simplification
diego
parents:
4754
diff
changeset
|
119 |
b7c27288e509
platform-independent restructuring and code simplification
diego
parents:
4754
diff
changeset
|
120 { 0 } |
b7c27288e509
platform-independent restructuring and code simplification
diego
parents:
4754
diff
changeset
|
121 }; |
b7c27288e509
platform-independent restructuring and code simplification
diego
parents:
4754
diff
changeset
|
122 |
0 | 123 #define AANSCALE_BITS 12 |
124 static 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 | |
4197 | 136 uint8_t cropTbl[256 + 2 * MAX_NEG_CROP]; |
633 | 137 |
1064 | 138 int64_t gettime(void) |
0 | 139 { |
140 struct timeval tv; | |
141 gettimeofday(&tv,NULL); | |
1064 | 142 return (int64_t)tv.tv_sec * 1000000 + tv.tv_usec; |
0 | 143 } |
144 | |
145 #define NB_ITS 20000 | |
146 #define NB_ITS_SPEED 50000 | |
147 | |
33 | 148 static short idct_mmx_perm[64]; |
149 | |
633 | 150 static short idct_simple_mmx_perm[64]={ |
2979 | 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, | |
633 | 159 }; |
160 | |
33 | 161 void idct_mmx_init(void) |
162 { | |
163 int i; | |
164 | |
165 /* the mmx/mmxext idct uses a reordered input, so we patch scan tables */ | |
166 for (i = 0; i < 64; i++) { | |
2979 | 167 idct_mmx_perm[i] = (i & 0x38) | ((i & 6) >> 1) | ((i & 1) << 2); |
168 // idct_simple_mmx_perm[i] = simple_block_permute_op(i); | |
33 | 169 } |
170 } | |
171 | |
172 static DCTELEM block[64] __attribute__ ((aligned (8))); | |
173 static DCTELEM block1[64] __attribute__ ((aligned (8))); | |
633 | 174 static DCTELEM block_org[64] __attribute__ ((aligned (8))); |
33 | 175 |
176 void dct_error(const char *name, int is_idct, | |
177 void (*fdct_func)(DCTELEM *block), | |
4755
b7c27288e509
platform-independent restructuring and code simplification
diego
parents:
4754
diff
changeset
|
178 void (*fdct_ref)(DCTELEM *block), int form, int test) |
0 | 179 { |
180 int it, i, scale; | |
181 int err_inf, v; | |
1064 | 182 int64_t err2, ti, ti1, it1; |
183 int64_t sysErr[64], sysErrMax=0; | |
633 | 184 int maxout=0; |
185 int blockSumErrMax=0, blockSumErr; | |
0 | 186 |
187 srandom(0); | |
188 | |
189 err_inf = 0; | |
190 err2 = 0; | |
633 | 191 for(i=0; i<64; i++) sysErr[i]=0; |
0 | 192 for(it=0;it<NB_ITS;it++) { |
633 | 193 for(i=0;i<64;i++) |
194 block1[i] = 0; | |
195 switch(test){ | |
2967 | 196 case 0: |
633 | 197 for(i=0;i<64;i++) |
198 block1[i] = (random() % 512) -256; | |
635 | 199 if (is_idct){ |
633 | 200 fdct(block1); |
635 | 201 |
202 for(i=0;i<64;i++) | |
203 block1[i]>>=3; | |
204 } | |
633 | 205 break; |
206 case 1:{ | |
207 int num= (random()%10)+1; | |
208 for(i=0;i<num;i++) | |
209 block1[random()%64] = (random() % 512) -256; | |
210 }break; | |
211 case 2: | |
212 block1[0]= (random()%4096)-2048; | |
213 block1[63]= (block1[0]&1)^1; | |
214 break; | |
215 } | |
33 | 216 |
633 | 217 #if 0 // simulate mismatch control |
218 { int sum=0; | |
219 for(i=0;i<64;i++) | |
220 sum+=block1[i]; | |
221 | |
2967 | 222 if((sum&1)==0) block1[63]^=1; |
633 | 223 } |
224 #endif | |
225 | |
226 for(i=0; i<64; i++) | |
227 block_org[i]= block1[i]; | |
33 | 228 |
4755
b7c27288e509
platform-independent restructuring and code simplification
diego
parents:
4754
diff
changeset
|
229 if (form == MMX_PERM) { |
633 | 230 for(i=0;i<64;i++) |
33 | 231 block[idct_mmx_perm[i]] = block1[i]; |
4755
b7c27288e509
platform-independent restructuring and code simplification
diego
parents:
4754
diff
changeset
|
232 } else if (form == MMX_SIMPLE_PERM) { |
633 | 233 for(i=0;i<64;i++) |
234 block[idct_simple_mmx_perm[i]] = block1[i]; | |
235 | |
2979 | 236 } else { |
633 | 237 for(i=0; i<64; i++) |
238 block[i]= block1[i]; | |
33 | 239 } |
633 | 240 #if 0 // simulate mismatch control for tested IDCT but not the ref |
241 { int sum=0; | |
242 for(i=0;i<64;i++) | |
243 sum+=block[i]; | |
244 | |
2967 | 245 if((sum&1)==0) block[63]^=1; |
633 | 246 } |
247 #endif | |
33 | 248 |
0 | 249 fdct_func(block); |
4752
d49f8b3e8c4a
Replace emms() with emms_c(), patch by Marc Hoffman, mmh pleasantst com.
diego
parents:
4197
diff
changeset
|
250 emms_c(); /* for ff_mmx_idct */ |
33 | 251 |
4755
b7c27288e509
platform-independent restructuring and code simplification
diego
parents:
4754
diff
changeset
|
252 if (form == SCALE_PERM) { |
0 | 253 for(i=0; i<64; i++) { |
635 | 254 scale = 8*(1 << (AANSCALE_BITS + 11)) / aanscales[i]; |
633 | 255 block[i] = (block[i] * scale /*+ (1<<(AANSCALE_BITS-1))*/) >> AANSCALE_BITS; |
256 } | |
257 } | |
258 | |
33 | 259 fdct_ref(block1); |
0 | 260 |
633 | 261 blockSumErr=0; |
0 | 262 for(i=0;i<64;i++) { |
263 v = abs(block[i] - block1[i]); | |
264 if (v > err_inf) | |
265 err_inf = v; | |
266 err2 += v * v; | |
2979 | 267 sysErr[i] += block[i] - block1[i]; |
268 blockSumErr += v; | |
269 if( abs(block[i])>maxout) maxout=abs(block[i]); | |
0 | 270 } |
633 | 271 if(blockSumErrMax < blockSumErr) blockSumErrMax= blockSumErr; |
272 #if 0 // print different matrix pairs | |
273 if(blockSumErr){ | |
274 printf("\n"); | |
275 for(i=0; i<64; i++){ | |
276 if((i&7)==0) printf("\n"); | |
277 printf("%4d ", block_org[i]); | |
278 } | |
279 for(i=0; i<64; i++){ | |
280 if((i&7)==0) printf("\n"); | |
281 printf("%4d ", block[i] - block1[i]); | |
282 } | |
283 } | |
284 #endif | |
0 | 285 } |
4001 | 286 for(i=0; i<64; i++) sysErrMax= MAX(sysErrMax, FFABS(sysErr[i])); |
2967 | 287 |
633 | 288 #if 1 // dump systematic errors |
289 for(i=0; i<64; i++){ | |
2979 | 290 if(i%8==0) printf("\n"); |
633 | 291 printf("%5d ", (int)sysErr[i]); |
292 } | |
293 printf("\n"); | |
294 #endif | |
2967 | 295 |
633 | 296 printf("%s %s: err_inf=%d err2=%0.8f syserr=%0.8f maxout=%d blockSumErr=%d\n", |
33 | 297 is_idct ? "IDCT" : "DCT", |
633 | 298 name, err_inf, (double)err2 / NB_ITS / 64.0, (double)sysErrMax / NB_ITS, maxout, blockSumErrMax); |
299 #if 1 //Speed test | |
0 | 300 /* speed test */ |
633 | 301 for(i=0;i<64;i++) |
302 block1[i] = 0; | |
303 switch(test){ | |
2967 | 304 case 0: |
633 | 305 for(i=0;i<64;i++) |
306 block1[i] = (random() % 512) -256; | |
635 | 307 if (is_idct){ |
633 | 308 fdct(block1); |
635 | 309 |
310 for(i=0;i<64;i++) | |
311 block1[i]>>=3; | |
312 } | |
633 | 313 break; |
314 case 1:{ | |
315 case 2: | |
316 block1[0] = (random() % 512) -256; | |
317 block1[1] = (random() % 512) -256; | |
318 block1[2] = (random() % 512) -256; | |
319 block1[3] = (random() % 512) -256; | |
320 }break; | |
321 } | |
0 | 322 |
4755
b7c27288e509
platform-independent restructuring and code simplification
diego
parents:
4754
diff
changeset
|
323 if (form == MMX_PERM) { |
633 | 324 for(i=0;i<64;i++) |
33 | 325 block[idct_mmx_perm[i]] = block1[i]; |
4755
b7c27288e509
platform-independent restructuring and code simplification
diego
parents:
4754
diff
changeset
|
326 } else if(form == MMX_SIMPLE_PERM) { |
633 | 327 for(i=0;i<64;i++) |
328 block[idct_simple_mmx_perm[i]] = block1[i]; | |
329 } else { | |
330 for(i=0; i<64; i++) | |
331 block[i]= block1[i]; | |
33 | 332 } |
333 | |
0 | 334 ti = gettime(); |
335 it1 = 0; | |
336 do { | |
337 for(it=0;it<NB_ITS_SPEED;it++) { | |
633 | 338 for(i=0; i<64; i++) |
339 block[i]= block1[i]; | |
340 // memcpy(block, block1, sizeof(DCTELEM) * 64); | |
5127 | 341 // do not memcpy especially not fastmemcpy because it does movntq !!! |
0 | 342 fdct_func(block); |
343 } | |
344 it1 += NB_ITS_SPEED; | |
345 ti1 = gettime() - ti; | |
346 } while (ti1 < 1000000); | |
4752
d49f8b3e8c4a
Replace emms() with emms_c(), patch by Marc Hoffman, mmh pleasantst com.
diego
parents:
4197
diff
changeset
|
347 emms_c(); |
0 | 348 |
633 | 349 printf("%s %s: %0.1f kdct/s\n", |
33 | 350 is_idct ? "IDCT" : "DCT", |
0 | 351 name, (double)it1 * 1000.0 / (double)ti1); |
633 | 352 #endif |
0 | 353 } |
354 | |
1064 | 355 static uint8_t img_dest[64] __attribute__ ((aligned (8))); |
356 static uint8_t img_dest1[64] __attribute__ ((aligned (8))); | |
720 | 357 |
1064 | 358 void idct248_ref(uint8_t *dest, int linesize, int16_t *block) |
720 | 359 { |
360 static int init; | |
361 static double c8[8][8]; | |
362 static double c4[4][4]; | |
363 double block1[64], block2[64], block3[64]; | |
364 double s, sum, v; | |
365 int i, j, k; | |
366 | |
367 if (!init) { | |
368 init = 1; | |
369 | |
370 for(i=0;i<8;i++) { | |
371 sum = 0; | |
372 for(j=0;j<8;j++) { | |
373 s = (i==0) ? sqrt(1.0/8.0) : sqrt(1.0/4.0); | |
374 c8[i][j] = s * cos(M_PI * i * (j + 0.5) / 8.0); | |
375 sum += c8[i][j] * c8[i][j]; | |
376 } | |
377 } | |
2967 | 378 |
720 | 379 for(i=0;i<4;i++) { |
380 sum = 0; | |
381 for(j=0;j<4;j++) { | |
382 s = (i==0) ? sqrt(1.0/4.0) : sqrt(1.0/2.0); | |
383 c4[i][j] = s * cos(M_PI * i * (j + 0.5) / 4.0); | |
384 sum += c4[i][j] * c4[i][j]; | |
385 } | |
386 } | |
387 } | |
388 | |
389 /* butterfly */ | |
722
ff90043f4a2d
in fact IDCT248 needs to be normalized as I suspected
bellard
parents:
720
diff
changeset
|
390 s = 0.5 * sqrt(2.0); |
720 | 391 for(i=0;i<4;i++) { |
392 for(j=0;j<8;j++) { | |
722
ff90043f4a2d
in fact IDCT248 needs to be normalized as I suspected
bellard
parents:
720
diff
changeset
|
393 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
|
394 block1[8*(2*i+1)+j] = (block[8*(2*i)+j] - block[8*(2*i+1)+j]) * s; |
720 | 395 } |
396 } | |
397 | |
398 /* idct8 on lines */ | |
399 for(i=0;i<8;i++) { | |
400 for(j=0;j<8;j++) { | |
401 sum = 0; | |
402 for(k=0;k<8;k++) | |
403 sum += c8[k][j] * block1[8*i+k]; | |
404 block2[8*i+j] = sum; | |
405 } | |
406 } | |
407 | |
408 /* idct4 */ | |
409 for(i=0;i<8;i++) { | |
410 for(j=0;j<4;j++) { | |
411 /* top */ | |
412 sum = 0; | |
413 for(k=0;k<4;k++) | |
414 sum += c4[k][j] * block2[8*(2*k)+i]; | |
415 block3[8*(2*j)+i] = sum; | |
416 | |
417 /* bottom */ | |
418 sum = 0; | |
419 for(k=0;k<4;k++) | |
420 sum += c4[k][j] * block2[8*(2*k+1)+i]; | |
421 block3[8*(2*j+1)+i] = sum; | |
422 } | |
423 } | |
424 | |
425 /* clamp and store the result */ | |
426 for(i=0;i<8;i++) { | |
427 for(j=0;j<8;j++) { | |
722
ff90043f4a2d
in fact IDCT248 needs to be normalized as I suspected
bellard
parents:
720
diff
changeset
|
428 v = block3[8*i+j]; |
720 | 429 if (v < 0) |
430 v = 0; | |
431 else if (v > 255) | |
432 v = 255; | |
433 dest[i * linesize + j] = (int)rint(v); | |
434 } | |
435 } | |
436 } | |
437 | |
2967 | 438 void idct248_error(const char *name, |
1064 | 439 void (*idct248_put)(uint8_t *dest, int line_size, int16_t *block)) |
720 | 440 { |
441 int it, i, it1, ti, ti1, err_max, v; | |
442 | |
443 srandom(0); | |
2967 | 444 |
720 | 445 /* just one test to see if code is correct (precision is less |
446 important here) */ | |
447 err_max = 0; | |
448 for(it=0;it<NB_ITS;it++) { | |
2967 | 449 |
722
ff90043f4a2d
in fact IDCT248 needs to be normalized as I suspected
bellard
parents:
720
diff
changeset
|
450 /* XXX: use forward transform to generate values */ |
720 | 451 for(i=0;i<64;i++) |
722
ff90043f4a2d
in fact IDCT248 needs to be normalized as I suspected
bellard
parents:
720
diff
changeset
|
452 block1[i] = (random() % 256) - 128; |
ff90043f4a2d
in fact IDCT248 needs to be normalized as I suspected
bellard
parents:
720
diff
changeset
|
453 block1[0] += 1024; |
ff90043f4a2d
in fact IDCT248 needs to be normalized as I suspected
bellard
parents:
720
diff
changeset
|
454 |
720 | 455 for(i=0; i<64; i++) |
456 block[i]= block1[i]; | |
457 idct248_ref(img_dest1, 8, block); | |
2967 | 458 |
722
ff90043f4a2d
in fact IDCT248 needs to be normalized as I suspected
bellard
parents:
720
diff
changeset
|
459 for(i=0; i<64; i++) |
ff90043f4a2d
in fact IDCT248 needs to be normalized as I suspected
bellard
parents:
720
diff
changeset
|
460 block[i]= block1[i]; |
ff90043f4a2d
in fact IDCT248 needs to be normalized as I suspected
bellard
parents:
720
diff
changeset
|
461 idct248_put(img_dest, 8, block); |
2967 | 462 |
722
ff90043f4a2d
in fact IDCT248 needs to be normalized as I suspected
bellard
parents:
720
diff
changeset
|
463 for(i=0;i<64;i++) { |
ff90043f4a2d
in fact IDCT248 needs to be normalized as I suspected
bellard
parents:
720
diff
changeset
|
464 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
|
465 if (v == 255) |
ff90043f4a2d
in fact IDCT248 needs to be normalized as I suspected
bellard
parents:
720
diff
changeset
|
466 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
|
467 if (v > err_max) |
ff90043f4a2d
in fact IDCT248 needs to be normalized as I suspected
bellard
parents:
720
diff
changeset
|
468 err_max = v; |
ff90043f4a2d
in fact IDCT248 needs to be normalized as I suspected
bellard
parents:
720
diff
changeset
|
469 } |
720 | 470 #if 0 |
471 printf("ref=\n"); | |
472 for(i=0;i<8;i++) { | |
473 int j; | |
474 for(j=0;j<8;j++) { | |
475 printf(" %3d", img_dest1[i*8+j]); | |
476 } | |
477 printf("\n"); | |
478 } | |
2967 | 479 |
720 | 480 printf("out=\n"); |
481 for(i=0;i<8;i++) { | |
482 int j; | |
483 for(j=0;j<8;j++) { | |
484 printf(" %3d", img_dest[i*8+j]); | |
485 } | |
486 printf("\n"); | |
487 } | |
488 #endif | |
489 } | |
490 printf("%s %s: err_inf=%d\n", | |
491 1 ? "IDCT248" : "DCT248", | |
492 name, err_max); | |
493 | |
494 ti = gettime(); | |
495 it1 = 0; | |
496 do { | |
497 for(it=0;it<NB_ITS_SPEED;it++) { | |
498 for(i=0; i<64; i++) | |
499 block[i]= block1[i]; | |
500 // memcpy(block, block1, sizeof(DCTELEM) * 64); | |
5127 | 501 // do not memcpy especially not fastmemcpy because it does movntq !!! |
720 | 502 idct248_put(img_dest, 8, block); |
503 } | |
504 it1 += NB_ITS_SPEED; | |
505 ti1 = gettime() - ti; | |
506 } while (ti1 < 1000000); | |
4752
d49f8b3e8c4a
Replace emms() with emms_c(), patch by Marc Hoffman, mmh pleasantst com.
diego
parents:
4197
diff
changeset
|
507 emms_c(); |
720 | 508 |
509 printf("%s %s: %0.1f kdct/s\n", | |
510 1 ? "IDCT248" : "DCT248", | |
511 name, (double)it1 * 1000.0 / (double)ti1); | |
512 } | |
513 | |
33 | 514 void help(void) |
515 { | |
633 | 516 printf("dct-test [-i] [<test-number>]\n" |
517 "test-number 0 -> test with random matrixes\n" | |
518 " 1 -> test with random sparse matrixes\n" | |
519 " 2 -> do 3. test from mpeg4 std\n" | |
720 | 520 "-i test IDCT implementations\n" |
521 "-4 test IDCT248 implementations\n"); | |
33 | 522 } |
523 | |
0 | 524 int main(int argc, char **argv) |
525 { | |
720 | 526 int test_idct = 0, test_248_dct = 0; |
633 | 527 int c,i; |
528 int test=1; | |
33 | 529 |
0 | 530 init_fdct(); |
33 | 531 idct_mmx_init(); |
0 | 532 |
4197 | 533 for(i=0;i<256;i++) cropTbl[i + MAX_NEG_CROP] = i; |
633 | 534 for(i=0;i<MAX_NEG_CROP;i++) { |
4197 | 535 cropTbl[i] = 0; |
536 cropTbl[i + MAX_NEG_CROP + 256] = 255; | |
633 | 537 } |
2967 | 538 |
33 | 539 for(;;) { |
720 | 540 c = getopt(argc, argv, "ih4"); |
33 | 541 if (c == -1) |
542 break; | |
543 switch(c) { | |
544 case 'i': | |
545 test_idct = 1; | |
546 break; | |
720 | 547 case '4': |
548 test_248_dct = 1; | |
549 break; | |
633 | 550 default : |
33 | 551 case 'h': |
552 help(); | |
4754 | 553 return 0; |
33 | 554 } |
555 } | |
2967 | 556 |
633 | 557 if(optind <argc) test= atoi(argv[optind]); |
2967 | 558 |
33 | 559 printf("ffmpeg DCT/IDCT test\n"); |
560 | |
720 | 561 if (test_248_dct) { |
6001 | 562 idct248_error("SIMPLE-C", ff_simple_idct248_put); |
33 | 563 } else { |
4755
b7c27288e509
platform-independent restructuring and code simplification
diego
parents:
4754
diff
changeset
|
564 for (i=0;algos[i].name;i++) |
b7c27288e509
platform-independent restructuring and code simplification
diego
parents:
4754
diff
changeset
|
565 if (algos[i].is_idct == test_idct) { |
b7c27288e509
platform-independent restructuring and code simplification
diego
parents:
4754
diff
changeset
|
566 dct_error (algos[i].name, algos[i].is_idct, algos[i].func, algos[i].ref, algos[i].format, test); |
720 | 567 } |
33 | 568 } |
0 | 569 return 0; |
570 } |