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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
1e39f273ecd6 per file doxy
michaelni
parents: 1064
diff changeset
20
1e39f273ecd6 per file doxy
michaelni
parents: 1064
diff changeset
21 /**
1e39f273ecd6 per file doxy
michaelni
parents: 1064
diff changeset
22 * @file motion_test.c
1e39f273ecd6 per file doxy
michaelni
parents: 1064
diff changeset
23 * motion test.
1e39f273ecd6 per file doxy
michaelni
parents: 1064
diff changeset
24 */
1e39f273ecd6 per file doxy
michaelni
parents: 1064
diff changeset
25
75
bb7d6fe159ad motion test
glantau
parents:
diff changeset
26 #include <stdlib.h>
bb7d6fe159ad motion test
glantau
parents:
diff changeset
27 #include <stdio.h>
bb7d6fe159ad motion test
glantau
parents:
diff changeset
28 #include <string.h>
bb7d6fe159ad motion test
glantau
parents:
diff changeset
29 #include <sys/time.h>
bb7d6fe159ad motion test
glantau
parents:
diff changeset
30 #include <unistd.h>
bb7d6fe159ad motion test
glantau
parents:
diff changeset
31
bb7d6fe159ad motion test
glantau
parents:
diff changeset
32 #include "dsputil.h"
bb7d6fe159ad motion test
glantau
parents:
diff changeset
33
bb7d6fe159ad motion test
glantau
parents:
diff changeset
34 #include "i386/mmx.h"
bb7d6fe159ad motion test
glantau
parents:
diff changeset
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
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 980
diff changeset
38 int pix_abs16x16_mmx(uint8_t *blk1, uint8_t *blk2, int lx);
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 980
diff changeset
39 int pix_abs16x16_mmx1(uint8_t *blk1, uint8_t *blk2, int lx);
3953
ded320ef2a87 Compilation fix: pix_abs16x16_c was undeclared.
diego
parents: 3952
diff changeset
40 int pix_abs16x16_c(uint8_t *blk1, uint8_t *blk2, int lx);
1064
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 980
diff changeset
41 int pix_abs16x16_x2_mmx(uint8_t *blk1, uint8_t *blk2, int lx);
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 980
diff changeset
42 int pix_abs16x16_x2_mmx1(uint8_t *blk1, uint8_t *blk2, int lx);
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 980
diff changeset
43 int pix_abs16x16_x2_c(uint8_t *blk1, uint8_t *blk2, int lx);
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 980
diff changeset
44 int pix_abs16x16_y2_mmx(uint8_t *blk1, uint8_t *blk2, int lx);
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 980
diff changeset
45 int pix_abs16x16_y2_mmx1(uint8_t *blk1, uint8_t *blk2, int lx);
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 980
diff changeset
46 int pix_abs16x16_y2_c(uint8_t *blk1, uint8_t *blk2, int lx);
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 980
diff changeset
47 int pix_abs16x16_xy2_mmx(uint8_t *blk1, uint8_t *blk2, int lx);
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 980
diff changeset
48 int pix_abs16x16_xy2_mmx1(uint8_t *blk1, uint8_t *blk2, int lx);
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 980
diff changeset
49 int pix_abs16x16_xy2_c(uint8_t *blk1, uint8_t *blk2, int lx);
75
bb7d6fe159ad motion test
glantau
parents:
diff changeset
50
1064
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 980
diff changeset
51 typedef int motion_func(uint8_t *blk1, uint8_t *blk2, int lx);
75
bb7d6fe159ad motion test
glantau
parents:
diff changeset
52
bb7d6fe159ad motion test
glantau
parents:
diff changeset
53 #define WIDTH 64
bb7d6fe159ad motion test
glantau
parents:
diff changeset
54 #define HEIGHT 64
bb7d6fe159ad motion test
glantau
parents:
diff changeset
55
1064
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 980
diff changeset
56 uint8_t img1[WIDTH * HEIGHT];
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 980
diff changeset
57 uint8_t img2[WIDTH * HEIGHT];
75
bb7d6fe159ad motion test
glantau
parents:
diff changeset
58
1064
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 980
diff changeset
59 void fill_random(uint8_t *tab, int size)
75
bb7d6fe159ad motion test
glantau
parents:
diff changeset
60 {
bb7d6fe159ad motion test
glantau
parents:
diff changeset
61 int i;
bb7d6fe159ad motion test
glantau
parents:
diff changeset
62 for(i=0;i<size;i++) {
bb7d6fe159ad motion test
glantau
parents:
diff changeset
63 #if 1
bb7d6fe159ad motion test
glantau
parents:
diff changeset
64 tab[i] = random() % 256;
bb7d6fe159ad motion test
glantau
parents:
diff changeset
65 #else
bb7d6fe159ad motion test
glantau
parents:
diff changeset
66 tab[i] = i;
bb7d6fe159ad motion test
glantau
parents:
diff changeset
67 #endif
bb7d6fe159ad motion test
glantau
parents:
diff changeset
68 }
bb7d6fe159ad motion test
glantau
parents:
diff changeset
69 }
bb7d6fe159ad motion test
glantau
parents:
diff changeset
70
bb7d6fe159ad motion test
glantau
parents:
diff changeset
71 void help(void)
bb7d6fe159ad motion test
glantau
parents:
diff changeset
72 {
bb7d6fe159ad motion test
glantau
parents:
diff changeset
73 printf("motion-test [-h]\n"
bb7d6fe159ad motion test
glantau
parents:
diff changeset
74 "test motion implementations\n");
bb7d6fe159ad motion test
glantau
parents:
diff changeset
75 exit(1);
bb7d6fe159ad motion test
glantau
parents:
diff changeset
76 }
bb7d6fe159ad motion test
glantau
parents:
diff changeset
77
1064
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 980
diff changeset
78 int64_t gettime(void)
75
bb7d6fe159ad motion test
glantau
parents:
diff changeset
79 {
bb7d6fe159ad motion test
glantau
parents:
diff changeset
80 struct timeval tv;
bb7d6fe159ad motion test
glantau
parents:
diff changeset
81 gettimeofday(&tv,NULL);
1064
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 980
diff changeset
82 return (int64_t)tv.tv_sec * 1000000 + tv.tv_usec;
75
bb7d6fe159ad motion test
glantau
parents:
diff changeset
83 }
bb7d6fe159ad motion test
glantau
parents:
diff changeset
84
bb7d6fe159ad motion test
glantau
parents:
diff changeset
85 #define NB_ITS 500
bb7d6fe159ad motion test
glantau
parents:
diff changeset
86
bb7d6fe159ad motion test
glantau
parents:
diff changeset
87 int dummy;
bb7d6fe159ad motion test
glantau
parents:
diff changeset
88
bb7d6fe159ad motion test
glantau
parents:
diff changeset
89 void test_motion(const char *name,
bb7d6fe159ad motion test
glantau
parents:
diff changeset
90 motion_func *test_func, motion_func *ref_func)
bb7d6fe159ad motion test
glantau
parents:
diff changeset
91 {
bb7d6fe159ad motion test
glantau
parents:
diff changeset
92 int x, y, d1, d2, it;
1064
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 980
diff changeset
93 uint8_t *ptr;
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 980
diff changeset
94 int64_t ti;
75
bb7d6fe159ad motion test
glantau
parents:
diff changeset
95 printf("testing '%s'\n", name);
bb7d6fe159ad motion test
glantau
parents:
diff changeset
96
bb7d6fe159ad motion test
glantau
parents:
diff changeset
97 /* test correctness */
bb7d6fe159ad motion test
glantau
parents:
diff changeset
98 for(it=0;it<20;it++) {
bb7d6fe159ad motion test
glantau
parents:
diff changeset
99
bb7d6fe159ad motion test
glantau
parents:
diff changeset
100 fill_random(img1, WIDTH * HEIGHT);
bb7d6fe159ad motion test
glantau
parents:
diff changeset
101 fill_random(img2, WIDTH * HEIGHT);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 1106
diff changeset
102
75
bb7d6fe159ad motion test
glantau
parents:
diff changeset
103 for(y=0;y<HEIGHT-17;y++) {
bb7d6fe159ad motion test
glantau
parents:
diff changeset
104 for(x=0;x<WIDTH-17;x++) {
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 1106
diff changeset
105 ptr = img2 + y * WIDTH + x;
644
641708b5c33c fixing tests
michaelni
parents: 429
diff changeset
106 d1 = test_func(img1, ptr, WIDTH);
641708b5c33c fixing tests
michaelni
parents: 429
diff changeset
107 d2 = ref_func(img1, ptr, WIDTH);
75
bb7d6fe159ad motion test
glantau
parents:
diff changeset
108 if (d1 != d2) {
bb7d6fe159ad motion test
glantau
parents:
diff changeset
109 printf("error: mmx=%d c=%d\n", d1, d2);
bb7d6fe159ad motion test
glantau
parents:
diff changeset
110 }
bb7d6fe159ad motion test
glantau
parents:
diff changeset
111 }
bb7d6fe159ad motion test
glantau
parents:
diff changeset
112 }
bb7d6fe159ad motion test
glantau
parents:
diff changeset
113 }
bb7d6fe159ad motion test
glantau
parents:
diff changeset
114 emms();
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 1106
diff changeset
115
75
bb7d6fe159ad motion test
glantau
parents:
diff changeset
116 /* speed test */
bb7d6fe159ad motion test
glantau
parents:
diff changeset
117 ti = gettime();
bb7d6fe159ad motion test
glantau
parents:
diff changeset
118 d1 = 0;
bb7d6fe159ad motion test
glantau
parents:
diff changeset
119 for(it=0;it<NB_ITS;it++) {
bb7d6fe159ad motion test
glantau
parents:
diff changeset
120 for(y=0;y<HEIGHT-17;y++) {
bb7d6fe159ad motion test
glantau
parents:
diff changeset
121 for(x=0;x<WIDTH-17;x++) {
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 1106
diff changeset
122 ptr = img2 + y * WIDTH + x;
644
641708b5c33c fixing tests
michaelni
parents: 429
diff changeset
123 d1 += test_func(img1, ptr, WIDTH);
75
bb7d6fe159ad motion test
glantau
parents:
diff changeset
124 }
bb7d6fe159ad motion test
glantau
parents:
diff changeset
125 }
bb7d6fe159ad motion test
glantau
parents:
diff changeset
126 }
bb7d6fe159ad motion test
glantau
parents:
diff changeset
127 emms();
bb7d6fe159ad motion test
glantau
parents:
diff changeset
128 dummy = d1; /* avoid optimisation */
bb7d6fe159ad motion test
glantau
parents:
diff changeset
129 ti = gettime() - ti;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 1106
diff changeset
130
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 1106
diff changeset
131 printf(" %0.0f kop/s\n",
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 1106
diff changeset
132 (double)NB_ITS * (WIDTH - 16) * (HEIGHT - 16) /
75
bb7d6fe159ad motion test
glantau
parents:
diff changeset
133 (double)(ti / 1000.0));
bb7d6fe159ad motion test
glantau
parents:
diff changeset
134 }
bb7d6fe159ad motion test
glantau
parents:
diff changeset
135
bb7d6fe159ad motion test
glantau
parents:
diff changeset
136
bb7d6fe159ad motion test
glantau
parents:
diff changeset
137 int main(int argc, char **argv)
bb7d6fe159ad motion test
glantau
parents:
diff changeset
138 {
bb7d6fe159ad motion test
glantau
parents:
diff changeset
139 int c;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 1106
diff changeset
140
75
bb7d6fe159ad motion test
glantau
parents:
diff changeset
141 for(;;) {
bb7d6fe159ad motion test
glantau
parents:
diff changeset
142 c = getopt(argc, argv, "h");
bb7d6fe159ad motion test
glantau
parents:
diff changeset
143 if (c == -1)
bb7d6fe159ad motion test
glantau
parents:
diff changeset
144 break;
bb7d6fe159ad motion test
glantau
parents:
diff changeset
145 switch(c) {
bb7d6fe159ad motion test
glantau
parents:
diff changeset
146 case 'h':
bb7d6fe159ad motion test
glantau
parents:
diff changeset
147 help();
bb7d6fe159ad motion test
glantau
parents:
diff changeset
148 break;
bb7d6fe159ad motion test
glantau
parents:
diff changeset
149 }
bb7d6fe159ad motion test
glantau
parents:
diff changeset
150 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 1106
diff changeset
151
75
bb7d6fe159ad motion test
glantau
parents:
diff changeset
152 printf("ffmpeg motion test\n");
bb7d6fe159ad motion test
glantau
parents:
diff changeset
153
bb7d6fe159ad motion test
glantau
parents:
diff changeset
154 test_motion("mmx", pix_abs16x16_mmx, pix_abs16x16_c);
bb7d6fe159ad motion test
glantau
parents:
diff changeset
155 test_motion("mmx_x2", pix_abs16x16_x2_mmx, pix_abs16x16_x2_c);
bb7d6fe159ad motion test
glantau
parents:
diff changeset
156 test_motion("mmx_y2", pix_abs16x16_y2_mmx, pix_abs16x16_y2_c);
bb7d6fe159ad motion test
glantau
parents:
diff changeset
157 test_motion("mmx_xy2", pix_abs16x16_xy2_mmx, pix_abs16x16_xy2_c);
bb7d6fe159ad motion test
glantau
parents:
diff changeset
158 return 0;
bb7d6fe159ad motion test
glantau
parents:
diff changeset
159 }