00001
00002
00008 #include <stdlib.h>
00009 #include <stdio.h>
00010 #include <string.h>
00011 #include <sys/time.h>
00012 #include <unistd.h>
00013
00014 #include "dsputil.h"
00015
00016 #include "i386/mmx.h"
00017
00018 int pix_abs16x16_mmx(uint8_t *blk1, uint8_t *blk2, int lx);
00019 int pix_abs16x16_mmx1(uint8_t *blk1, uint8_t *blk2, int lx);
00020 int pix_abs16x16_x2_mmx(uint8_t *blk1, uint8_t *blk2, int lx);
00021 int pix_abs16x16_x2_mmx1(uint8_t *blk1, uint8_t *blk2, int lx);
00022 int pix_abs16x16_x2_c(uint8_t *blk1, uint8_t *blk2, int lx);
00023 int pix_abs16x16_y2_mmx(uint8_t *blk1, uint8_t *blk2, int lx);
00024 int pix_abs16x16_y2_mmx1(uint8_t *blk1, uint8_t *blk2, int lx);
00025 int pix_abs16x16_y2_c(uint8_t *blk1, uint8_t *blk2, int lx);
00026 int pix_abs16x16_xy2_mmx(uint8_t *blk1, uint8_t *blk2, int lx);
00027 int pix_abs16x16_xy2_mmx1(uint8_t *blk1, uint8_t *blk2, int lx);
00028 int pix_abs16x16_xy2_c(uint8_t *blk1, uint8_t *blk2, int lx);
00029
00030 typedef int motion_func(uint8_t *blk1, uint8_t *blk2, int lx);
00031
00032 #define WIDTH 64
00033 #define HEIGHT 64
00034
00035 uint8_t img1[WIDTH * HEIGHT];
00036 uint8_t img2[WIDTH * HEIGHT];
00037
00038 void fill_random(uint8_t *tab, int size)
00039 {
00040 int i;
00041 for(i=0;i<size;i++) {
00042 #if 1
00043 tab[i] = random() % 256;
00044 #else
00045 tab[i] = i;
00046 #endif
00047 }
00048 }
00049
00050 void help(void)
00051 {
00052 printf("motion-test [-h]\n"
00053 "test motion implementations\n");
00054 exit(1);
00055 }
00056
00057 int64_t gettime(void)
00058 {
00059 struct timeval tv;
00060 gettimeofday(&tv,NULL);
00061 return (int64_t)tv.tv_sec * 1000000 + tv.tv_usec;
00062 }
00063
00064 #define NB_ITS 500
00065
00066 int dummy;
00067
00068 void test_motion(const char *name,
00069 motion_func *test_func, motion_func *ref_func)
00070 {
00071 int x, y, d1, d2, it;
00072 uint8_t *ptr;
00073 int64_t ti;
00074 printf("testing '%s'\n", name);
00075
00076
00077 for(it=0;it<20;it++) {
00078
00079 fill_random(img1, WIDTH * HEIGHT);
00080 fill_random(img2, WIDTH * HEIGHT);
00081
00082 for(y=0;y<HEIGHT-17;y++) {
00083 for(x=0;x<WIDTH-17;x++) {
00084 ptr = img2 + y * WIDTH + x;
00085 d1 = test_func(img1, ptr, WIDTH);
00086 d2 = ref_func(img1, ptr, WIDTH);
00087 if (d1 != d2) {
00088 printf("error: mmx=%d c=%d\n", d1, d2);
00089 }
00090 }
00091 }
00092 }
00093 emms();
00094
00095
00096 ti = gettime();
00097 d1 = 0;
00098 for(it=0;it<NB_ITS;it++) {
00099 for(y=0;y<HEIGHT-17;y++) {
00100 for(x=0;x<WIDTH-17;x++) {
00101 ptr = img2 + y * WIDTH + x;
00102 d1 += test_func(img1, ptr, WIDTH);
00103 }
00104 }
00105 }
00106 emms();
00107 dummy = d1;
00108 ti = gettime() - ti;
00109
00110 printf(" %0.0f kop/s\n",
00111 (double)NB_ITS * (WIDTH - 16) * (HEIGHT - 16) /
00112 (double)(ti / 1000.0));
00113 }
00114
00115
00116 int main(int argc, char **argv)
00117 {
00118 int c;
00119
00120 for(;;) {
00121 c = getopt(argc, argv, "h");
00122 if (c == -1)
00123 break;
00124 switch(c) {
00125 case 'h':
00126 help();
00127 break;
00128 }
00129 }
00130
00131 printf("ffmpeg motion test\n");
00132
00133 test_motion("mmx", pix_abs16x16_mmx, pix_abs16x16_c);
00134 test_motion("mmx_x2", pix_abs16x16_x2_mmx, pix_abs16x16_x2_c);
00135 test_motion("mmx_y2", pix_abs16x16_y2_mmx, pix_abs16x16_y2_c);
00136 test_motion("mmx_xy2", pix_abs16x16_xy2_mmx, pix_abs16x16_xy2_c);
00137 return 0;
00138 }