Filter:   InfoImg
download motion_test.c
Language: C
Copyright: (c) 2001 Fabrice Bellard. */
LOC: 107
Project Info
FFMpeg
Server: MPlayerHQ
Type: cvs
...f\ffmpeg\ffmpeg\libavcodec\
   .cvsignore
   4xm.c
   8bps.c
   a52dec.c
   aasc.c
   ac3.h
   ac3dec.c
   ac3enc.c
   ac3tab.h
   adpcm.c
   adx.c
   alac.c
   allcodecs.c
   amr.c
   apiexample.c
   asv1.c
   avcodec.h
   beosthread.c
   bitstream.c
   bitstream.h
   bmp.c
   cabac.c
   cabac.h
   cinepak.c
   cljr.c
   cook.c
   cookdata.h
   cyuv.c
   dct-test.c
   dpcm.c
   dsputil.c
   dsputil.h
   dtsdec.c
   dv.c
   dvbsub.c
   dvbsubdec.c
   dvdata.h
   dvdsub.c
   dvdsubenc.c
   error_resilience.c
   eval.c
   faac.c
   faad.c
   faandct.c
   faandct.h
   fdctref.c
   fft-test.c
   fft.c
   ffv1.c
   flac.c
   flicvideo.c
   fraps.c
   g726.c
   golomb.c
   golomb.h
   h261.c
   h261data.h
   h263.c
   h263data.h
   h263dec.c
   h264.c
   h264data.h
   h264idct.c
   huffyuv.c
   idcinvideo.c
   imgconvert.c
   imgconvert_template.h
   imgresample.c
   indeo2.c
   indeo2data.h
   indeo3.c
   indeo3data.h
   interplayvideo.c
   jfdctfst.c
   jfdctint.c
   jpeg_ls.c
   jrevdct.c
   lcl.c
   libgsm.c
   loco.c
   mace.c
   mdct.c
   mdec.c
   mem.c
   mjpeg.c
   motion_est.c
   motion_est_template.c
   motion_test.c
   mp3lameaudio.c
   mpeg12.c
   mpeg12data.h
   mpeg4data.h
   mpegaudio.c
   mpegaudio.h
   mpegaudiodec.c
   mpegaudiodectab.h
   mpegaudiotab.h
   mpegvideo.c
   mpegvideo.h
   msmpeg4.c
   msmpeg4data.h
   msrle.c
   msvideo1.c
   oggtheora.c
   oggvorbis.c
   opt.c
   opt.h
   parser.c
   pcm.c
   png.c
   pnm.c
   pthread.c
   qdm2.c
   qdm2data.h
   qdrw.c
   qpeg.c
   qtrle.c
   ra144.c
   ra144.h
   ra288.c
   ra288.h
   rangecoder.c
   rangecoder.h
   ratecontrol.c
   raw.c
   resample.c
   resample2.c
   roqvideo.c
   rpza.c
   rv10.c
   shorten.c
   simple_idct.c
   simple_idct.h
   smc.c
   snow.c
   sonic.c
   sp5x.h
   svq1.c
   svq1_cb.h
   svq1_vlc.h
   svq3.c
   truemotion1.c
   truemotion1data.h
   truemotion2.c
   tscc.c
   ulti.c
   ulti_cb.h
   utils.c
   vc9.c
   vc9data.h
   vcr1.c
   vmdav.c
   vorbis.c
   vorbis.h
   vp3.c
   vp3data.h
   vp3dsp.c
   vqavideo.c
   w32thread.c
   wmadata.h
   wmadec.c
   wmv2.c
   wnv1.c
   ws-snd1.c
   x264.c
   xan.c
   xl.c
   xvidff.c
   xvmcvideo.c

/* motion test. (c) 2001 Fabrice Bellard. */

/**
 * @file motion_test.c
 * motion test.
 */

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <sys/time.h>
#include <unistd.h>

#include "dsputil.h"

#include "i386/mmx.h"

int pix_abs16x16_mmx(uint8_t *blk1, uint8_t *blk2, int lx);
int pix_abs16x16_mmx1(uint8_t *blk1, uint8_t *blk2, int lx);
int pix_abs16x16_x2_mmx(uint8_t *blk1, uint8_t *blk2, int lx);
int pix_abs16x16_x2_mmx1(uint8_t *blk1, uint8_t *blk2, int lx);
int pix_abs16x16_x2_c(uint8_t *blk1, uint8_t *blk2, int lx);
int pix_abs16x16_y2_mmx(uint8_t *blk1, uint8_t *blk2, int lx);
int pix_abs16x16_y2_mmx1(uint8_t *blk1, uint8_t *blk2, int lx);
int pix_abs16x16_y2_c(uint8_t *blk1, uint8_t *blk2, int lx);
int pix_abs16x16_xy2_mmx(uint8_t *blk1, uint8_t *blk2, int lx);
int pix_abs16x16_xy2_mmx1(uint8_t *blk1, uint8_t *blk2, int lx);
int pix_abs16x16_xy2_c(uint8_t *blk1, uint8_t *blk2, int lx);

typedef int motion_func(uint8_t *blk1, uint8_t *blk2, int lx);

#define WIDTH 64
#define HEIGHT 64

uint8_t img1[WIDTH * HEIGHT];
uint8_t img2[WIDTH * HEIGHT];

void fill_random(uint8_t *tab, int size)
{
    int i;
    for(i=0;i<size;i++) {
#if 1
        tab[i] = random() % 256;
#else
        tab[i] = i;
#endif
    }
}

void help(void)
{
    printf("motion-test [-h]\n"
           "test motion implementations\n");
    exit(1);
}

int64_t gettime(void)
{
    struct timeval tv;
    gettimeofday(&tv,NULL);
    return (int64_t)tv.tv_sec * 1000000 + tv.tv_usec;
}

#define NB_ITS 500

int dummy;

void test_motion(const char *name,
                 motion_func *test_func, motion_func *ref_func)
{
    int x, y, d1, d2, it;
    uint8_t *ptr;
    int64_t ti;
    printf("testing '%s'\n", name);

    /* test correctness */
    for(it=0;it<20;it++) {

        fill_random(img1, WIDTH * HEIGHT);
        fill_random(img2, WIDTH * HEIGHT);

        for(y=0;y<HEIGHT-17;y++) {
            for(x=0;x<WIDTH-17;x++) {
                ptr = img2 + y * WIDTH + x;
                d1 = test_func(img1, ptr, WIDTH);
                d2 = ref_func(img1, ptr, WIDTH);
                if (d1 != d2) {
                    printf("error: mmx=%d c=%d\n", d1, d2);
                }
            }
        }
    }
    emms();

    /* speed test */
    ti = gettime();
    d1 = 0;
    for(it=0;it<NB_ITS;it++) {
        for(y=0;y<HEIGHT-17;y++) {
            for(x=0;x<WIDTH-17;x++) {
                ptr = img2 + y * WIDTH + x;
                d1 += test_func(img1, ptr, WIDTH);
            }
        }
    }
    emms();
    dummy = d1; /* avoid optimisation */
    ti = gettime() - ti;

    printf("  %0.0f kop/s\n",
           (double)NB_ITS * (WIDTH - 16) * (HEIGHT - 16) /
           (double)(ti / 1000.0));
}


int main(int argc, char **argv)
{
    int c;

    for(;;) {
        c = getopt(argc, argv, "h");
        if (c == -1)
            break;
        switch(c) {
        case 'h':
            help();
            break;
        }
    }

    printf("ffmpeg motion test\n");

    test_motion("mmx", pix_abs16x16_mmx, pix_abs16x16_c);
    test_motion("mmx_x2", pix_abs16x16_x2_mmx, pix_abs16x16_x2_c);
    test_motion("mmx_y2", pix_abs16x16_y2_mmx, pix_abs16x16_y2_c);
    test_motion("mmx_xy2", pix_abs16x16_xy2_mmx, pix_abs16x16_xy2_c);
    return 0;
}