--- xvid_bench.c 2005/06/15 06:07:28 1.22 +++ xvid_bench.c 2006/12/21 23:27:35 1.35 @@ -19,7 +19,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * - * $Id: xvid_bench.c,v 1.22 2005/06/15 06:07:28 Skal Exp $ + * $Id: xvid_bench.c,v 1.35 2006/12/21 23:27:35 Isibaar Exp $ * ****************************************************************************/ @@ -58,6 +58,7 @@ #include "utils/timer.h" #include "quant/quant_matrix.c" #include "bitstream/cbp.h" +#include "bitstream/bitstream.h" #include @@ -518,10 +519,50 @@ (iCrc!=8107)?"| ERROR": "" ); #endif + /* New functions for field prediction by CK 1.10.2005 */ +#pragma NEW8X4 + TEST_MB(interpolate8x4_halfpel_h, 0); + printf("%s - interpfield-h -round0 %.3f usec crc32=0x%08x %s\n", + cpu->name, t, iCrc, + (iCrc!=0x9538d6df)?"| ERROR": "" ); + + TEST_MB(interpolate8x4_halfpel_h, 1); + printf("%s - round1 %.3f usec crc32=0x%08x %s\n", + cpu->name, t, iCrc, + (iCrc!=0xde5f1db4)?"| ERROR": "" ); + + + TEST_MB(interpolate8x4_halfpel_v, 0); + printf("%s - interpfield- v-round0 %.3f usec crc32=0x%08x %s\n", + cpu->name, t, iCrc, + (iCrc!=0xea5a69ef)?"| ERROR": "" ); + + TEST_MB(interpolate8x4_halfpel_v, 1); + printf("%s - round1 %.3f usec crc32=0x%08x %s\n", + cpu->name, t, iCrc, + (iCrc!=0x4f10ec0f)?"| ERROR": "" ); + + + TEST_MB(interpolate8x4_halfpel_hv, 0); + printf("%s - interpfield-hv-round0 %.3f usec crc32=0x%08x %s\n", + cpu->name, t, iCrc, + (iCrc!=0xf97ee367)?"| ERROR": "" ); + + TEST_MB(interpolate8x4_halfpel_hv, 1); + printf("%s - round1 %.3f usec crc32=0x%08x %s\n", + cpu->name, t, iCrc, + (iCrc!=0xb6a9f581)?"| ERROR": "" ); +/* End of 8x4 functions */ + printf( " --- \n" ); } } +#undef ENTER +#undef LEAVE +#undef TEST_MB +#undef TEST_MB2 + /********************************************************************* * test transfer *********************************************************************/ @@ -625,6 +666,14 @@ cpu->name, t, s, (s!=0xee7ccbb4)?"| ERROR": ""); + /* New functions for field prediction by CK 1.10.2005 */ +#pragma NEW8X4 + TEST_TRANSFER(transfer8x4_copy, Dst8, Src8); + printf("%s - 8to4 %.3f usec crc32=0x%08x %s\n", + cpu->name, t, s, + (s!=0xbb9c3db5)?"| ERROR": ""); +/* End of new functions */ + TEST_TRANSFER(transfer8x8_copy, Dst8, Src8); printf("%s - 8to8 %.3f usec crc32=0x%08x %s\n", cpu->name, t, s, @@ -905,10 +954,10 @@ * test non-zero AC counting *********************************************************************/ -#define TEST_CBP(FUNC, SRC) \ +#define TEST_CBP(FUNC, SRC, NB) \ t = gettime_usec(); \ emms(); \ -for(tst=0; tst3*64); Src4[i] = (i==(3*64+2) || i==(5*64+9)); + Src5[i] = ieee_rand(0,1) ? -1 : 1; /* +/- test */ } for(cpu = cpu_list; cpu->name!=0; ++cpu) @@ -941,20 +992,53 @@ if (!init_cpu(cpu)) continue; - TEST_CBP(calc_cbp, Src1); + TEST_CBP(calc_cbp, Src1, nb_tests); printf("%s - calc_cbp#1 %.3f usec cbp=0x%02x %s\n", cpu->name, t, cbp, (cbp!=0x15)?"| ERROR": ""); - TEST_CBP(calc_cbp, Src2); + TEST_CBP(calc_cbp, Src2, nb_tests); printf("%s - calc_cbp#2 %.3f usec cbp=0x%02x %s\n", cpu->name, t, cbp, (cbp!=0x38)?"| ERROR": ""); - TEST_CBP(calc_cbp, Src3); + TEST_CBP(calc_cbp, Src3, nb_tests); printf("%s - calc_cbp#3 %.3f usec cbp=0x%02x %s\n", cpu->name, t, cbp, (cbp!=0x0f)?"| ERROR": "" ); - TEST_CBP(calc_cbp, Src4); + TEST_CBP(calc_cbp, Src4, nb_tests); printf("%s - calc_cbp#4 %.3f usec cbp=0x%02x %s\n", cpu->name, t, cbp, (cbp!=0x05)?"| ERROR": "" ); + TEST_CBP(calc_cbp, Src5, nb_tests); + printf("%s - calc_cbp#4 %.3f usec cbp=0x%02x %s\n", + cpu->name, t, cbp, (cbp!=0x3f)?"| ERROR": "" ); printf( " --- \n" ); } + + for(cpu = cpu_list; cpu->name!=0; ++cpu) /* bench suggested by Carlo (carlo dot bramix at libero dot it) */ + { + double t; + int tst, cbp, err; + + if (!init_cpu(cpu)) + continue; + + err = 0; + for(n=0; n<6; ++n) + { + for(m=0; m<64; ++m) + { + for(i=0; i<6*64; ++i) + Src1[i] = (i== (m + n*64)); + + TEST_CBP(calc_cbp, Src1, 1); + if (cbp!= (((m!=0)<<(5-n)))) + { + printf( "%s - calc_cbp#5: ERROR at pos %d / %d!\n", cpu->name, n, m); + err = 1; + break; + } + } + } + if (!err) + printf( " %s - calc_cbp#5 : OK\n", cpu->name ); + + } } /********************************************************************* @@ -1417,8 +1501,8 @@ xframe.bitstream = buf + pos; xframe.length = buf_size - pos; xframe.output.plane[0] = (uint8_t*)(((size_t)yuv_out + 15) & ~15); - xframe.output.plane[1] = xframe.output.plane[0] + bps*height; - xframe.output.plane[2] = xframe.output.plane[1] + bps/2; + xframe.output.plane[1] = (uint8_t*)xframe.output.plane[0] + bps*height; + xframe.output.plane[2] = (uint8_t*)xframe.output.plane[1] + bps/2; xframe.output.stride[0] = bps; xframe.output.stride[1] = bps; xframe.output.stride[2] = bps; @@ -1436,10 +1520,10 @@ nb++; for(y=0; y=0; v--) { + if ( (v>>2) != v/4) + nb_err++; + } + for(v=-1000; v!=-1; v++) { + if ( (v>>2) != (v/4)-!!(v%4)) + nb_err++; + } + if (nb_err!=0) { + printf( "ERROR! please post your platform/compiler specs to xvid-devel@xvid.org !\n" ); + } +} + +/********************************************************************* + * test SSIM functions + *********************************************************************/ + +typedef int (*lumfunc)(uint8_t* ptr, int stride); +typedef void (*csfunc)(uint8_t* ptro, uint8_t* ptrc, int stride, int lumo, int lumc, int* pdevo, int* pdevc, int* pcorr); + +extern int lum_8x8_c(uint8_t* ptr, int stride); +extern int lum_8x8_mmx(uint8_t* ptr, int stride); +extern int lum_2x8_c(uint8_t* ptr, int stride); +extern void consim_c(uint8_t* ptro, uint8_t* ptrc, int stride, int lumo, int lumc, int* pdevo, int* pdevc, int* pcorr); +extern void consim_mmx(uint8_t* ptro, uint8_t* ptrc, int stride, int lumo, int lumc, int* pdevo, int* pdevc, int* pcorr); +extern void consim_sse2(uint8_t* ptro, uint8_t* ptrc, int stride, int lumo, int lumc, int* pdevo, int* pdevc, int* pcorr); + +void test_SSIM() +{ + const int nb_tests = 3000*speed_ref; + int tst; + CPU *cpu; + int i; + int devs[3]; + long lumo, lumc; + DECLARE_ALIGNED_MATRIX(Ref1, 16, 16, uint8_t, 16); + DECLARE_ALIGNED_MATRIX(Ref2, 16, 16, uint8_t, 16); + lumfunc lum8x8; + lumfunc lum2x8; + csfunc csim; + + ieee_reseed(1); + printf( "\n ====== test SSIM ======\n" ); + for(i=0; i<16*16;++i) { + long v1, v2; + v1 = ieee_rand(-256, 511); + v2 = ieee_rand(-256, 511); + Ref1[i] = (v1<0) ? 0 : (v1>255) ? 255 : v1; + Ref2[i] = (v2<0) ? 0 : (v2>255) ? 255 : v2; + } + lumc = ieee_rand(0, 255); + lumo = ieee_rand(0, 255); + + for(cpu = cpu_list; cpu->name!=0; ++cpu) + { + double t; + int m; + if (!init_cpu(cpu)) + continue; + lum8x8 = lum_8x8_c; + lum2x8 = lum_2x8_c; + csim = consim_c; +#ifdef ARCH_IS_IA32 + if (cpu->cpu & XVID_CPU_MMX){ + lum8x8 = lum_8x8_mmx; + csim = consim_mmx; + } + if (cpu->cpu & XVID_CPU_MMX){ + csim = consim_sse2; + } +#endif + t = gettime_usec(); + emms(); + for(tst=0; tstname, t, m, + (m!=8230)?"| ERROR": "" ); + + t = gettime_usec(); + emms(); + for(tst=0; tstname, t, m, + (m!=681)?"| ERROR": "" ); + + t = gettime_usec(); + emms(); + for(tst=0; tstname, t, devs[0], devs[1], devs[2], + (devs[0]!=0x1bdf0f || devs[1]!=0x137258 || devs[2]!=0xcdb13)?"| ERROR": "" ); + printf( " --- \n" ); + } +} + +/********************************************************************* + * test bitstream functions + *********************************************************************/ + +#define BIT_BUF_SIZE 2000 + +static void test_bits() +{ + const int nb_tests = 50*speed_ref; + int tst; + uint32_t Crc; + uint8_t Buf[BIT_BUF_SIZE]; + uint32_t Extracted[BIT_BUF_SIZE*8]; /* worst case: bits read 1 by 1 */ + int Lens[BIT_BUF_SIZE*8]; + double t1; + + + printf( "\n === test bitstream ===\n" ); + ieee_reseed(1); + Crc = 0; + + t1 = gettime_usec(); + for(tst=0; tst0; m++) { + const int b = ieee_rand(1,32); + Lens[m] = b; + l2 -= b; + if (l2<0) break; + Extracted[m] = BitstreamShowBits(&bs, b); + BitstreamSkip(&bs, b); +// printf( "<= %d: %d 0x%x\n", m, b, Extracted[m]); + } + + BitstreamReset(&bs); + for(m2=0; m2 %d: %d 0x%x %c\n", m2, b, v, " *"[Crc]); + } + } + t1 = (gettime_usec() - t1) / nb_tests; + printf(" test_bits %.3f usec %s\n", t1, (Crc!=0)?"| ERROR": "" ); +} + +/********************************************************************* * main *********************************************************************/ @@ -1758,7 +2170,7 @@ int c, what = 0; int width, height; uint32_t chksum = 0; - const char * test_bitstream = 0; + const char * test_bitstream = 0; cpu_mask = 0; // default => will use autodectect for(c=1; c