Mercurial > libavcodec.hg
annotate motion_test.c @ 3990:746a60ba3177 libavcodec
enable CMOV_IS_FAST as its faster or equal speed on every cpu (duron, athlon, PM, P3) from which ive seen benchmarks, it might be slower on P4 but noone has posted benchmarks ...
author | michael |
---|---|
date | Wed, 11 Oct 2006 12:23:40 +0000 |
parents | ded320ef2a87 |
children | e82ceaa9c386 |
rev | line source |
---|---|
3699
c537a97eec66
Add official LGPL license headers to the files that were missing them.
diego
parents:
2967
diff
changeset
|
1 /* |
c537a97eec66
Add official LGPL license headers to the files that were missing them.
diego
parents:
2967
diff
changeset
|
2 * (c) 2001 Fabrice Bellard |
c537a97eec66
Add official LGPL license headers to the files that were missing them.
diego
parents:
2967
diff
changeset
|
3 * |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3699
diff
changeset
|
4 * This file is part of FFmpeg. |
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3699
diff
changeset
|
5 * |
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3699
diff
changeset
|
6 * 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:
2967
diff
changeset
|
7 * 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:
2967
diff
changeset
|
8 * 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
|
9 * 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:
2967
diff
changeset
|
10 * |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3699
diff
changeset
|
11 * 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:
2967
diff
changeset
|
12 * 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:
2967
diff
changeset
|
13 * 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:
2967
diff
changeset
|
14 * Lesser General Public License for more details. |
c537a97eec66
Add official LGPL license headers to the files that were missing them.
diego
parents:
2967
diff
changeset
|
15 * |
c537a97eec66
Add official LGPL license headers to the files that were missing them.
diego
parents:
2967
diff
changeset
|
16 * 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
|
17 * 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:
2967
diff
changeset
|
18 * 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:
2967
diff
changeset
|
19 */ |
1106 | 20 |
21 /** | |
22 * @file motion_test.c | |
23 * motion test. | |
24 */ | |
25 | |
75 | 26 #include <stdlib.h> |
27 #include <stdio.h> | |
28 #include <string.h> | |
29 #include <sys/time.h> | |
30 #include <unistd.h> | |
31 | |
32 #include "dsputil.h" | |
33 | |
34 #include "i386/mmx.h" | |
35 | |
3952
ff9b6ac5ca2e
Compilation fix, printf gets redefined to please_use_av_log.
diego
parents:
3947
diff
changeset
|
36 #undef printf |
ff9b6ac5ca2e
Compilation fix, printf gets redefined to please_use_av_log.
diego
parents:
3947
diff
changeset
|
37 |
1064 | 38 int pix_abs16x16_mmx(uint8_t *blk1, uint8_t *blk2, int lx); |
39 int pix_abs16x16_mmx1(uint8_t *blk1, uint8_t *blk2, int lx); | |
3953 | 40 int pix_abs16x16_c(uint8_t *blk1, uint8_t *blk2, int lx); |
1064 | 41 int pix_abs16x16_x2_mmx(uint8_t *blk1, uint8_t *blk2, int lx); |
42 int pix_abs16x16_x2_mmx1(uint8_t *blk1, uint8_t *blk2, int lx); | |
43 int pix_abs16x16_x2_c(uint8_t *blk1, uint8_t *blk2, int lx); | |
44 int pix_abs16x16_y2_mmx(uint8_t *blk1, uint8_t *blk2, int lx); | |
45 int pix_abs16x16_y2_mmx1(uint8_t *blk1, uint8_t *blk2, int lx); | |
46 int pix_abs16x16_y2_c(uint8_t *blk1, uint8_t *blk2, int lx); | |
47 int pix_abs16x16_xy2_mmx(uint8_t *blk1, uint8_t *blk2, int lx); | |
48 int pix_abs16x16_xy2_mmx1(uint8_t *blk1, uint8_t *blk2, int lx); | |
49 int pix_abs16x16_xy2_c(uint8_t *blk1, uint8_t *blk2, int lx); | |
75 | 50 |
1064 | 51 typedef int motion_func(uint8_t *blk1, uint8_t *blk2, int lx); |
75 | 52 |
53 #define WIDTH 64 | |
54 #define HEIGHT 64 | |
55 | |
1064 | 56 uint8_t img1[WIDTH * HEIGHT]; |
57 uint8_t img2[WIDTH * HEIGHT]; | |
75 | 58 |
1064 | 59 void fill_random(uint8_t *tab, int size) |
75 | 60 { |
61 int i; | |
62 for(i=0;i<size;i++) { | |
63 #if 1 | |
64 tab[i] = random() % 256; | |
65 #else | |
66 tab[i] = i; | |
67 #endif | |
68 } | |
69 } | |
70 | |
71 void help(void) | |
72 { | |
73 printf("motion-test [-h]\n" | |
74 "test motion implementations\n"); | |
75 exit(1); | |
76 } | |
77 | |
1064 | 78 int64_t gettime(void) |
75 | 79 { |
80 struct timeval tv; | |
81 gettimeofday(&tv,NULL); | |
1064 | 82 return (int64_t)tv.tv_sec * 1000000 + tv.tv_usec; |
75 | 83 } |
84 | |
85 #define NB_ITS 500 | |
86 | |
87 int dummy; | |
88 | |
89 void test_motion(const char *name, | |
90 motion_func *test_func, motion_func *ref_func) | |
91 { | |
92 int x, y, d1, d2, it; | |
1064 | 93 uint8_t *ptr; |
94 int64_t ti; | |
75 | 95 printf("testing '%s'\n", name); |
96 | |
97 /* test correctness */ | |
98 for(it=0;it<20;it++) { | |
99 | |
100 fill_random(img1, WIDTH * HEIGHT); | |
101 fill_random(img2, WIDTH * HEIGHT); | |
2967 | 102 |
75 | 103 for(y=0;y<HEIGHT-17;y++) { |
104 for(x=0;x<WIDTH-17;x++) { | |
2967 | 105 ptr = img2 + y * WIDTH + x; |
644 | 106 d1 = test_func(img1, ptr, WIDTH); |
107 d2 = ref_func(img1, ptr, WIDTH); | |
75 | 108 if (d1 != d2) { |
109 printf("error: mmx=%d c=%d\n", d1, d2); | |
110 } | |
111 } | |
112 } | |
113 } | |
114 emms(); | |
2967 | 115 |
75 | 116 /* speed test */ |
117 ti = gettime(); | |
118 d1 = 0; | |
119 for(it=0;it<NB_ITS;it++) { | |
120 for(y=0;y<HEIGHT-17;y++) { | |
121 for(x=0;x<WIDTH-17;x++) { | |
2967 | 122 ptr = img2 + y * WIDTH + x; |
644 | 123 d1 += test_func(img1, ptr, WIDTH); |
75 | 124 } |
125 } | |
126 } | |
127 emms(); | |
128 dummy = d1; /* avoid optimisation */ | |
129 ti = gettime() - ti; | |
2967 | 130 |
131 printf(" %0.0f kop/s\n", | |
132 (double)NB_ITS * (WIDTH - 16) * (HEIGHT - 16) / | |
75 | 133 (double)(ti / 1000.0)); |
134 } | |
135 | |
136 | |
137 int main(int argc, char **argv) | |
138 { | |
139 int c; | |
2967 | 140 |
75 | 141 for(;;) { |
142 c = getopt(argc, argv, "h"); | |
143 if (c == -1) | |
144 break; | |
145 switch(c) { | |
146 case 'h': | |
147 help(); | |
148 break; | |
149 } | |
150 } | |
2967 | 151 |
75 | 152 printf("ffmpeg motion test\n"); |
153 | |
154 test_motion("mmx", pix_abs16x16_mmx, pix_abs16x16_c); | |
155 test_motion("mmx_x2", pix_abs16x16_x2_mmx, pix_abs16x16_x2_c); | |
156 test_motion("mmx_y2", pix_abs16x16_y2_mmx, pix_abs16x16_y2_c); | |
157 test_motion("mmx_xy2", pix_abs16x16_xy2_mmx, pix_abs16x16_xy2_c); | |
158 return 0; | |
159 } |