[svn] / trunk / xvidcore / examples / xvid_bench.c Repository:
ViewVC logotype

Diff of /trunk/xvidcore/examples/xvid_bench.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1613, Mon Apr 18 08:31:42 2005 UTC revision 1614, Tue May 17 15:40:11 2005 UTC
# Line 19  Line 19 
19   *  along with this program; if not, write to the Free Software   *  along with this program; if not, write to the Free Software
20   *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA   *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
21   *   *
22   * $Id: xvid_bench.c,v 1.16 2005-04-18 08:31:42 Skal Exp $   * $Id: xvid_bench.c,v 1.17 2005-05-17 15:40:11 Skal Exp $
23   *   *
24   ****************************************************************************/   ****************************************************************************/
25    
# Line 65  Line 65 
65  #define M_PI            3.14159265358979323846  #define M_PI            3.14159265358979323846
66  #endif  #endif
67    
68  const int speed_ref = 100;  /* on slow machines, decrease this value */  int speed_ref = 100;  /* on slow machines, decrease this value */
69    int verbose = 0;
70    unsigned int cpu_mask;
71    
72  /*********************************************************************  /*********************************************************************
73   * misc   * misc
# Line 257  Line 259 
259  };  };
260    
261  uint32_t  uint32_t
262  calc_crc(uint8_t *mem, int len, uint32_t initial)  calc_crc(uint8_t *mem, int len, uint32_t crc)
263  {  {
   
         register unsigned int crc;  
   
         crc = initial;  
   
264          while( len >= 8) {          while( len >= 8) {
265                  DO8(mem, crc);                  DO8(mem, crc);
266                  len -= 8;                  len -= 8;
# Line 274  Line 271 
271                  len--;                  len--;
272          }          }
273    
274          return(crc);          return crc;
   
275  }  }
276    
277  /*********************************************************************  /*********************************************************************
# Line 1318  Line 1314 
1314   * measure raw decoding speed   * measure raw decoding speed
1315   *********************************************************************/   *********************************************************************/
1316    
1317  void test_dec(const char *name, int width, int height, int with_chksum)  void test_dec(const char *name, int width, int height, int ref_chksum)
1318  {  {
1319          FILE *f = 0;          FILE *f = 0;
1320          void *dechandle = 0;          void *dechandle = 0;
# Line 1329  Line 1325 
1325          double t = 0.;          double t = 0.;
1326          int nb = 0;          int nb = 0;
1327          uint8_t *buf = 0;          uint8_t *buf = 0;
1328          uint8_t *rgb_out = 0;          uint8_t *yuv_out = 0;
1329          int buf_size, pos;          int buf_size, pos;
1330          uint32_t chksum = 0;          uint32_t chksum = 0;
1331            int bps = (width+31) & ~31;
1332    
1333          memset(&xinit, 0, sizeof(xinit));          memset(&xinit, 0, sizeof(xinit));
1334          xinit.cpu_flags = XVID_CPU_MMX | XVID_CPU_FORCE;          xinit.cpu_flags = cpu_mask;
1335          xinit.version = XVID_VERSION;          xinit.version = XVID_VERSION;
1336          xvid_global(NULL, 0, &xinit, NULL);          xvid_global(NULL, 0, &xinit, NULL);
1337    
# Line 1344  Line 1341 
1341          xparam.version = XVID_VERSION;          xparam.version = XVID_VERSION;
1342          xerr = xvid_decore(NULL, XVID_DEC_CREATE, &xparam, NULL);          xerr = xvid_decore(NULL, XVID_DEC_CREATE, &xparam, NULL);
1343          if (xerr==XVID_ERR_FAIL) {          if (xerr==XVID_ERR_FAIL) {
1344                  printf("can't init decoder (err=%d)\n", xerr);                  printf("ERROR: can't init decoder (err=%d)\n", xerr);
1345                  return;                  return;
1346          }          }
1347          dechandle = xparam.handle;          dechandle = xparam.handle;
# Line 1352  Line 1349 
1349    
1350          f = fopen(name, "rb");          f = fopen(name, "rb");
1351          if (f==0) {          if (f==0) {
1352                  printf( "can't open file '%s'\n", name);                  printf( "ERROR: can't open file '%s'\n", name);
1353                  return;                  return;
1354          }          }
1355          fseek(f, 0, SEEK_END);          fseek(f, 0, SEEK_END);
1356          buf_size = ftell(f);          buf_size = ftell(f);
1357          fseek(f, 0, SEEK_SET);          fseek(f, 0, SEEK_SET);
1358          if (buf_size<=0) {          if (buf_size<=0) {
1359                  printf("error while stating file\n");                  printf("ERROR: error while stating file\n");
1360                  goto End;                  goto End;
1361          }          }
         else printf( "Input size: %d\n", buf_size);  
1362    
1363          buf = malloc(buf_size); /* should be enuf' */          buf = malloc(buf_size);
1364          rgb_out = calloc(4, width*height);  /* <-room for _RGB24 */          yuv_out = calloc(1, bps*height*3/2 + 15);
1365          if (buf==0 || rgb_out==0) {          if (buf==0 || yuv_out==0) {
1366                  printf( "malloc failed!\n" );                  printf( "ERROR: malloc failed!\n" );
1367                  goto End;                  goto End;
1368          }          }
1369    
1370          if (fread(buf, buf_size, 1, f)!=1) {          if (fread(buf, buf_size, 1, f)!=1) {
1371                  printf( "file-read failed\n" );                  printf( "ERROR: file-read failed\n" );
1372                  goto End;                  goto End;
1373          }          }
1374    
# Line 1380  Line 1376 
1376          pos = 0;          pos = 0;
1377          t = -gettime_usec();          t = -gettime_usec();
1378          while(1) {          while(1) {
1379              int y;
1380    
1381                  memset(&xframe, 0, sizeof(xframe));                  memset(&xframe, 0, sizeof(xframe));
1382                  xframe.version = XVID_VERSION;                  xframe.version = XVID_VERSION;
1383                  xframe.bitstream = buf + pos;                  xframe.bitstream = buf + pos;
1384                  xframe.length = buf_size - pos;                  xframe.length = buf_size - pos;
1385                  xframe.output.plane[0] = rgb_out;                  xframe.output.plane[0] = (uint8_t*)(((size_t)yuv_out + 15) & ~15);
1386                  xframe.output.stride[0] = width;                  xframe.output.plane[1] = xframe.output.plane[0] + bps*height;
1387                  xframe.output.csp = XVID_CSP_BGR;                  xframe.output.plane[2] = xframe.output.plane[1] + bps/2;
1388                    xframe.output.stride[0] = bps;
1389                    xframe.output.stride[1] = bps;
1390                    xframe.output.stride[2] = bps;
1391                    xframe.output.csp = XVID_CSP_I420;
1392                  xerr = xvid_decore(dechandle, XVID_DEC_DECODE, &xframe, 0);                  xerr = xvid_decore(dechandle, XVID_DEC_DECODE, &xframe, 0);
1393                    if (xerr<0) {
1394                            printf("ERROR: decoding failed for frame #%d (err=%d)!\n", nb, xerr);
1395                            break;
1396                    }
1397                    else if (xerr==0)
1398                      break;
1399        else if (verbose>0) printf("#%d %d\n", nb, xerr );
1400    
1401                    pos += xerr;
1402                  nb++;                  nb++;
1403                  pos += xframe.length;  
1404                  if (with_chksum) {      for(y=0; y<height/2; ++y) {
1405                          int k = width*height;                    chksum = calc_crc(xframe.output.plane[0] + (2*y+0)*bps, width, chksum);
1406                          uint32_t *ptr = (uint32_t *)rgb_out;                          chksum = calc_crc(xframe.output.plane[0] + (2*y+1)*bps, width, chksum);
1407                          while(k-->0) chksum += *ptr++;                          chksum = calc_crc(xframe.output.plane[1] + y*bps, width/2, chksum);
1408                            chksum = calc_crc(xframe.output.plane[2] + y*bps, width/2, chksum);
1409                  }                  }
1410                  if (pos==buf_size)                  if (pos==buf_size)
1411                          break;                          break;
                 if (xerr==XVID_ERR_FAIL) {  
                         printf("decoding failed for frame #%d (err=%d)!\n", nb, xerr);  
                         break;  
                 }  
1412          }          }
1413          t += gettime_usec();          t += gettime_usec();
1414            if (ref_chksum==0) {
1415          if (t>0.)          if (t>0.)
1416                  printf( "%d frames decoded in %.3f s -> %.1f FPS\n", nb, t*1.e-6f, (float)(nb*1.e6f/t) );                    printf( "%d frames decoded in %.3f s -> %.1f FPS   Checksum:0x%.8x\n", nb, t*1.e-6f, (float)(nb*1.e6f/t), chksum );
1417          if (with_chksum)    }
1418                  printf("checksum: 0x%.8x\n", chksum);    else {
1419                    printf("FPS:%.1f Checksum: 0x%.8x Expected:0x%.8x | %s\n",
1420                      t>0. ? (float)(nb*1.e6f/t) : 0.f, chksum, ref_chksum, (chksum==ref_chksum) ? "OK" : "ERROR");
1421      }
1422    
1423   End:   End:
1424          if (rgb_out!=0) free(rgb_out);          if (yuv_out!=0) free(yuv_out);
1425          if (buf!=0) free(buf);          if (buf!=0) free(buf);
1426          if (dechandle!=0) {          if (dechandle!=0) {
1427                  xerr= xvid_decore(dechandle, XVID_DEC_DESTROY, NULL, NULL);                  xerr= xvid_decore(dechandle, XVID_DEC_DESTROY, NULL, NULL);
1428                  if (xerr==XVID_ERR_FAIL)                  if (xerr==XVID_ERR_FAIL)
1429                          printf("destroy-decoder failed (err=%d)!\n", xerr);                          printf("ERROR: destroy-decoder failed (err=%d)!\n", xerr);
1430          }          }
1431          if (f!=0) fclose(f);          if (f!=0) fclose(f);
1432  }  }
# Line 1581  Line 1593 
1593   * main   * main
1594   *********************************************************************/   *********************************************************************/
1595    
1596  int main(int argc, char *argv[])  static void arg_missing(const char *opt)
1597    {
1598      printf( "missing argument after option '%s'\n", opt);
1599      exit(-1);
1600    }
1601    
1602    int main(int argc, const char *argv[])
1603    {
1604            int c, what = 0;
1605            int width, height;
1606            uint32_t chksum = 0;
1607      const char * test_bitstream = 0;
1608    
1609            cpu_mask = 0;  // default => will use autodectect
1610            for(c=1; c<argc; ++c)
1611  {  {
1612          int what = 0;            if (!strcmp(argv[c], "-v")) verbose++;
1613          if (argc>1) what = atoi(argv[1]);            else if (!strcmp(argv[c], "-c"))      cpu_mask = 0 /* PLAIN_C */ | XVID_CPU_FORCE;
1614              else if (!strcmp(argv[c], "-mmx"))    cpu_mask = XVID_CPU_MMX    | XVID_CPU_FORCE;
1615              else if (!strcmp(argv[c], "-mmxext")) cpu_mask = XVID_CPU_MMXEXT | XVID_CPU_MMX | XVID_CPU_FORCE;
1616              else if (!strcmp(argv[c], "-sse2"))   cpu_mask = XVID_CPU_SSE2   | XVID_CPU_MMX | XVID_CPU_FORCE;
1617              else if (!strcmp(argv[c], "-3dnow"))  cpu_mask = XVID_CPU_3DNOW  | XVID_CPU_FORCE;
1618              else if (!strcmp(argv[c], "-3dnowe")) cpu_mask = XVID_CPU_3DNOW  | XVID_CPU_3DNOWEXT | XVID_CPU_FORCE;
1619              else if (!strcmp(argv[c], "-altivec")) cpu_mask = XVID_CPU_ALTIVEC | XVID_CPU_FORCE;
1620              else if (!strcmp(argv[c], "-spd")) {
1621          if (++c==argc) arg_missing( argv[argc-1] );
1622          speed_ref = atoi(argv[c]);
1623        }
1624              else if (argv[c][0]!='-') {
1625                what = atoi(argv[c]);
1626                if (what==9) {
1627                  if (c+4>argc) {
1628                    printf("usage: %s %d bitstream width height (checksum)\n", argv[0], what);
1629                    exit(-1);
1630            }
1631            test_bitstream = argv[++c];
1632                  width  = atoi(argv[++c]);
1633                  height = atoi(argv[++c]);
1634                  if (c+1<argc && argv[c+1][0]!='-') {
1635                    if (sscanf(argv[c+1], "0x%x", &chksum)!=1) {
1636                      printf( "can't read checksum value.\n" );
1637                      exit(-1);
1638              }
1639              else c++;
1640            }
1641    //        printf( "[%s] %dx%d (0x%.8x)\n", test_bitstream, width, height, chksum);
1642          }
1643        }
1644        else {
1645          printf( "unrecognized option '%s'\n", argv[c]);
1646          exit(-1);
1647        }
1648      }
1649    
1650    
1651          if (what==0 || what==1) test_dct();          if (what==0 || what==1) test_dct();
1652          if (what==0 || what==2) test_mb();          if (what==0 || what==2) test_mb();
1653          if (what==0 || what==3) test_sad();          if (what==0 || what==3) test_sad();
# Line 1603  Line 1666 
1666          }          }
1667          if (what==8) test_dct_saturation(-256, 255);          if (what==8) test_dct_saturation(-256, 255);
1668    
1669          if (what==9) {          if (test_bitstream)
1670                  int width, height;            test_dec(test_bitstream, width, height, chksum);
                 if (argc<5) {  
                         printf("usage: %s %d [bitstream] [width] [height]\n", argv[0], what);  
                         return 1;  
                 }  
                 width = atoi(argv[3]);  
                 height = atoi(argv[4]);  
                 test_dec(argv[2], width, height, (argc>5));  
         }  
   
1671          if (what==-1) {          if (what==-1) {
1672                  test_dct_precision_diffs();                  test_dct_precision_diffs();
1673                  test_bugs1();                  test_bugs1();

Legend:
Removed from v.1613  
changed lines
  Added in v.1614

No admin address has been configured
ViewVC Help
Powered by ViewVC 1.0.4