comparison motion-test.c @ 5121:71d080656056 libavcodec

Adapt to API changes, fix compilation. patch by Ronald S. Bultje, rbultje ronald.bitfreak net
author diego
date Sun, 10 Jun 2007 13:54:11 +0000
parents dd5796283029
children e9f8a337c5ce
comparison
equal deleted inserted replaced
5120:ae7f2c01811f 5121:71d080656056
34 #include "i386/mmx.h" 34 #include "i386/mmx.h"
35 35
36 #undef exit 36 #undef exit
37 #undef printf 37 #undef printf
38 38
39 int pix_abs16x16_mmx(uint8_t *blk1, uint8_t *blk2, int lx);
40 int pix_abs16x16_mmx1(uint8_t *blk1, uint8_t *blk2, int lx);
41 int pix_abs16x16_c(uint8_t *blk1, uint8_t *blk2, int lx);
42 int pix_abs16x16_x2_mmx(uint8_t *blk1, uint8_t *blk2, int lx);
43 int pix_abs16x16_x2_mmx1(uint8_t *blk1, uint8_t *blk2, int lx);
44 int pix_abs16x16_x2_c(uint8_t *blk1, uint8_t *blk2, int lx);
45 int pix_abs16x16_y2_mmx(uint8_t *blk1, uint8_t *blk2, int lx);
46 int pix_abs16x16_y2_mmx1(uint8_t *blk1, uint8_t *blk2, int lx);
47 int pix_abs16x16_y2_c(uint8_t *blk1, uint8_t *blk2, int lx);
48 int pix_abs16x16_xy2_mmx(uint8_t *blk1, uint8_t *blk2, int lx);
49 int pix_abs16x16_xy2_mmx1(uint8_t *blk1, uint8_t *blk2, int lx);
50 int pix_abs16x16_xy2_c(uint8_t *blk1, uint8_t *blk2, int lx);
51
52 typedef int motion_func(uint8_t *blk1, uint8_t *blk2, int lx);
53
54 #define WIDTH 64 39 #define WIDTH 64
55 #define HEIGHT 64 40 #define HEIGHT 64
56 41
57 uint8_t img1[WIDTH * HEIGHT]; 42 uint8_t img1[WIDTH * HEIGHT];
58 uint8_t img2[WIDTH * HEIGHT]; 43 uint8_t img2[WIDTH * HEIGHT];
86 #define NB_ITS 500 71 #define NB_ITS 500
87 72
88 int dummy; 73 int dummy;
89 74
90 void test_motion(const char *name, 75 void test_motion(const char *name,
91 motion_func *test_func, motion_func *ref_func) 76 me_cmp_func test_func, me_cmp_func ref_func)
92 { 77 {
93 int x, y, d1, d2, it; 78 int x, y, d1, d2, it;
94 uint8_t *ptr; 79 uint8_t *ptr;
95 int64_t ti; 80 int64_t ti;
96 printf("testing '%s'\n", name); 81 printf("testing '%s'\n", name);
102 fill_random(img2, WIDTH * HEIGHT); 87 fill_random(img2, WIDTH * HEIGHT);
103 88
104 for(y=0;y<HEIGHT-17;y++) { 89 for(y=0;y<HEIGHT-17;y++) {
105 for(x=0;x<WIDTH-17;x++) { 90 for(x=0;x<WIDTH-17;x++) {
106 ptr = img2 + y * WIDTH + x; 91 ptr = img2 + y * WIDTH + x;
107 d1 = test_func(img1, ptr, WIDTH); 92 d1 = test_func(NULL, img1, ptr, WIDTH, 1);
108 d2 = ref_func(img1, ptr, WIDTH); 93 d2 = ref_func(NULL, img1, ptr, WIDTH, 1);
109 if (d1 != d2) { 94 if (d1 != d2) {
110 printf("error: mmx=%d c=%d\n", d1, d2); 95 printf("error: mmx=%d c=%d\n", d1, d2);
111 } 96 }
112 } 97 }
113 } 98 }
119 d1 = 0; 104 d1 = 0;
120 for(it=0;it<NB_ITS;it++) { 105 for(it=0;it<NB_ITS;it++) {
121 for(y=0;y<HEIGHT-17;y++) { 106 for(y=0;y<HEIGHT-17;y++) {
122 for(x=0;x<WIDTH-17;x++) { 107 for(x=0;x<WIDTH-17;x++) {
123 ptr = img2 + y * WIDTH + x; 108 ptr = img2 + y * WIDTH + x;
124 d1 += test_func(img1, ptr, WIDTH); 109 d1 += test_func(NULL, img1, ptr, WIDTH, 1);
125 } 110 }
126 } 111 }
127 } 112 }
128 emms_c(); 113 emms_c();
129 dummy = d1; /* avoid optimisation */ 114 dummy = d1; /* avoid optimisation */
135 } 120 }
136 121
137 122
138 int main(int argc, char **argv) 123 int main(int argc, char **argv)
139 { 124 {
125 AVCodecContext *ctx;
140 int c; 126 int c;
127 DSPContext cctx, mmxctx;
128 int flags[2] = { FF_MM_MMX, FF_MM_MMXEXT };
141 129
142 for(;;) { 130 for(;;) {
143 c = getopt(argc, argv, "h"); 131 c = getopt(argc, argv, "h");
144 if (c == -1) 132 if (c == -1)
145 break; 133 break;
150 } 138 }
151 } 139 }
152 140
153 printf("ffmpeg motion test\n"); 141 printf("ffmpeg motion test\n");
154 142
155 test_motion("mmx", pix_abs16x16_mmx, pix_abs16x16_c); 143 ctx = avcodec_alloc_context();
156 test_motion("mmx_x2", pix_abs16x16_x2_mmx, pix_abs16x16_x2_c); 144 ctx->dsp_mask = FF_MM_FORCE;
157 test_motion("mmx_y2", pix_abs16x16_y2_mmx, pix_abs16x16_y2_c); 145 dsputil_init(&cctx, ctx);
158 test_motion("mmx_xy2", pix_abs16x16_xy2_mmx, pix_abs16x16_xy2_c); 146 for (c = 0; c < 2; c++) {
147 int x;
148 ctx->dsp_mask = FF_MM_FORCE | flags[c];
149 dsputil_init(&mmxctx, ctx);
150
151 for (x = 0; x < 2; x++) {
152 printf("%s for %dx%d pixels\n", c ? "mmx2" : "mmx",
153 x ? 8 : 16, x ? 8 : 16);
154 test_motion("mmx", mmxctx.pix_abs[x][0], cctx.pix_abs[x][0]);
155 test_motion("mmx_x2", mmxctx.pix_abs[x][1], cctx.pix_abs[x][1]);
156 test_motion("mmx_y2", mmxctx.pix_abs[x][2], cctx.pix_abs[x][2]);
157 test_motion("mmx_xy2", mmxctx.pix_abs[x][3], cctx.pix_abs[x][3]);
158 }
159 }
160 av_free(ctx);
161
159 return 0; 162 return 0;
160 } 163 }