[cvs] / xvidcore / src / xvid.c Repository:
ViewVC logotype

Diff of /xvidcore/src/xvid.c

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

revision 1.33.2.19, Mon Dec 30 10:49:17 2002 UTC revision 1.33.2.21, Fri Jan 3 16:25:14 2003 UTC
# Line 41  Line 41 
41   *   *
42   ****************************************************************************/   ****************************************************************************/
43    
44    #include <stdio.h>
45    #include <stdlib.h>
46    #include <string.h>
47    #include <time.h>
48    
49  #include "xvid.h"  #include "xvid.h"
50  #include "decoder.h"  #include "decoder.h"
51  #include "encoder.h"  #include "encoder.h"
# Line 621  Line 626 
626          return 0;          return 0;
627  }  }
628    
629    int diff16(const int16_t * blockA, const int16_t * blockB, int size)
630    {
631            int i, diff = 0;
632            for (i = 0; i < size; i++)
633                    diff += ABS(blockA[i]-blockB[i]);
634            return diff;
635    }
636    
637    
638    #define XVID_TEST_RANDOM        0x00000001      /* random input data */
639    #define XVID_TEST_VERBOSE       0x00000002      /* verbose error output */
640    
641    
642  int test_h263_intra(quanth263_intraFunc * funcA, quanth263_intraFunc * funcB,  #define TEST_FORWARD    0x00000001      /* intra */
643                                                  const char * nameA, const char * nameB,  #define TEST_FDCT  (TEST_FORWARD)
644                                                  int min, int max)  #define TEST_IDCT  (0)
645    
646    int test_transform(void * funcA, void * funcB, const char * nameB,
647                                       int test, int flags)
648  {  {
649          int q,i;          int i;
650          int64_t timeSTART;          int64_t timeSTART;
651          int64_t timeA = 0;          int64_t timeA = 0;
652          int64_t timeB = 0;          int64_t timeB = 0;
         DECLARE_ALIGNED_MATRIX(arrayX, 1, 64, int16_t, CACHE_LINE);  
653          DECLARE_ALIGNED_MATRIX(arrayA, 1, 64, int16_t, CACHE_LINE);          DECLARE_ALIGNED_MATRIX(arrayA, 1, 64, int16_t, CACHE_LINE);
654          DECLARE_ALIGNED_MATRIX(arrayB, 1, 64, int16_t, CACHE_LINE);          DECLARE_ALIGNED_MATRIX(arrayB, 1, 64, int16_t, CACHE_LINE);
655            int min, max;
656            int count = 0;
657    
658          for (q = 1; q <= 31; q++)       /* quantizer */          int tmp;
659            int min_error = 0x10000*64;
660            int max_error = 0;
661    
662    
663            if ((test & TEST_FORWARD))      /* forward */
664          {          {
665                  for (i = min; i < max; i++)     /* input coeff */                  min = -256;
666                    max = 255;
667            }else{          /* inverse */
668                    min = -2048;
669                    max = 2047;
670            }
671    
672            for (i = 0; i < 64*64; i++)
673                  {                  {
674                          fill16(arrayX, 64, i);                  if ((flags & XVID_TEST_RANDOM))
675                    {
676                            random16(arrayA, 64, min, max);
677                    }else{
678                            fill16(arrayA, 64, i);
679                    }
680                    memcpy(arrayB, arrayA, 64*sizeof(int16_t));
681    
682                    if ((test & TEST_FORWARD))
683                    {
684                          timeSTART = read_counter();                          timeSTART = read_counter();
685                          funcA(arrayA, arrayX, q, q);                          ((fdctFunc*)funcA)(arrayA);
686                          timeA += read_counter() - timeSTART;                          timeA += read_counter() - timeSTART;
687    
688                          timeSTART = read_counter();                          timeSTART = read_counter();
689                          funcB(arrayB, arrayX, q, q);                          ((fdctFunc*)funcB)(arrayB);
690                          timeB += read_counter() - timeSTART;                          timeB += read_counter() - timeSTART;
   
                         if (compare16(arrayA, arrayB, 64))  
                         {  
                                 printf("%s/%s error: q=%i, i=%i\n", nameA?nameA:"?", nameB?nameB:"?", q, i);  
                                 return 0;  
691                          }                          }
692                    else
693                    {
694                            timeSTART = read_counter();
695                            ((idctFunc*)funcA)(arrayA);
696                            timeA += read_counter() - timeSTART;
697    
698                            timeSTART = read_counter();
699                            ((idctFunc*)funcB)(arrayB);
700                            timeB += read_counter() - timeSTART;
701                  }                  }
702    
703                    tmp = diff16(arrayA, arrayB, 64) / 64;
704                    if (tmp > max_error)
705                            max_error = tmp;
706                    if (tmp < min_error)
707                            min_error = tmp;
708    
709                    count++;
710          }          }
711    
712          if (nameA) printf("%s:\t%I64i\n", nameA, timeA);          /* print the "average difference" of best/worst transforms */
713          if (nameB) printf("%s:\t%I64i\n", nameB, timeB);          printf("%s:\t%i\t(min_error:%i, max_error:%i)\n", nameB, (int)(timeB / count), min_error, max_error);
714    
715          return 0;          return 0;
716  }  }
717    
718  int test_h263_inter(quanth263_interFunc * funcA, quanth263_interFunc * funcB,  
719                                                  const char * nameA, const char * nameB,  #define TEST_QUANT      0x00000001      /* forward quantization */
720                                                  int min, int max)  #define TEST_INTRA      0x00000002      /* intra */
721    #define TEST_QUANT_INTRA        (TEST_QUANT|TEST_INTRA)
722    #define TEST_QUANT_INTER        (TEST_QUANT)
723    #define TEST_DEQUANT_INTRA      (TEST_INTRA)
724    #define TEST_DEQUANT_INTER      (0)
725    
726    int test_quant(void * funcA, void * funcB, const char * nameB,
727                               int test, int flags)
728  {  {
729          int q,i;          int q,i;
730          int64_t timeSTART;          int64_t timeSTART;
731          int64_t timeA = 0;          int64_t timeA = 0;
732          int64_t timeB = 0;          int64_t timeB = 0;
733            int retA, retB;
734          DECLARE_ALIGNED_MATRIX(arrayX, 1, 64, int16_t, CACHE_LINE);          DECLARE_ALIGNED_MATRIX(arrayX, 1, 64, int16_t, CACHE_LINE);
735          DECLARE_ALIGNED_MATRIX(arrayA, 1, 64, int16_t, CACHE_LINE);          DECLARE_ALIGNED_MATRIX(arrayA, 1, 64, int16_t, CACHE_LINE);
736          DECLARE_ALIGNED_MATRIX(arrayB, 1, 64, int16_t, CACHE_LINE);          DECLARE_ALIGNED_MATRIX(arrayB, 1, 64, int16_t, CACHE_LINE);
737            int min, max;
738            int count = 0;
739            int errors = 0;
740    
741            if ((test & TEST_QUANT))        /* quant */
742            {
743                    min = -2048;
744                    max = 2047;
745            }else{          /* dequant */
746                    min = -256;
747                    max = 255;
748            }
749    
750          for (q = 1; q <= 31; q++)       /* quantizer */          for (q = 1; q <= 31; q++)       /* quantizer */
751          {          {
752                  for (i = min; i < max; i++)     /* input coeff */                  for (i = min; i < max; i++)     /* input coeff */
753                  {                  {
754                            if ((flags & XVID_TEST_RANDOM))
755                            {
756                                    random16(arrayX, 64, min, max);
757                            }else{
758                          fill16(arrayX, 64, i);                          fill16(arrayX, 64, i);
759                            }
760    
761                            if ((test & TEST_INTRA))        /* intra */
762                            {
763                                    timeSTART = read_counter();
764                                    ((quanth263_intraFunc*)funcA)(arrayA, arrayX, q, q);
765                                    timeA += read_counter() - timeSTART;
766    
767                          timeSTART = read_counter();                          timeSTART = read_counter();
768                          funcA(arrayA, arrayX, q);                                  ((quanth263_intraFunc*)funcB)(arrayB, arrayX, q, q);
769                                    timeB += read_counter() - timeSTART;
770                            }
771                            else    /* inter */
772                            {
773                                    timeSTART = read_counter();
774                                    retA = ((quanth263_interFunc*)funcA)(arrayA, arrayX, q);
775                          timeA += read_counter() - timeSTART;                          timeA += read_counter() - timeSTART;
776    
777                          timeSTART = read_counter();                          timeSTART = read_counter();
778                          funcB(arrayB, arrayX, q);                                  retB = ((quanth263_interFunc*)funcB)(arrayB, arrayX, q);
779                          timeB += read_counter() - timeSTART;                          timeB += read_counter() - timeSTART;
780                            }
781    
782                          if (compare16(arrayA, arrayB, 64))                          /* compare return value from quant_inter, and compare (de)quantiz'd arrays */
783                            if ( ((test&TEST_QUANT) && !(test&TEST_INTRA) && retA != retB ) ||
784                                    compare16(arrayA, arrayB, 64))
785                          {                          {
786                                  printf("%s/%s error: q=%i, i=%i\n", nameA?nameA:"?", nameB?nameB:"?", q, i);                                  errors++;
787                                  return 0;                                  if ((flags & XVID_TEST_VERBOSE))
788                                            printf("%s error: q=%i, i=%i\n", nameB, q, i);
789                          }                          }
790    
791                            count++;
792                  }                  }
793          }          }
794    
795          if (nameA) printf("%s:\t%I64i\n", nameA, timeA);          printf("%s:\t%i", nameB, (int)(timeB / count));
796          if (nameB) printf("%s:\t%I64i\n", nameB, timeB);          if (errors>0)
797                    printf("\t(%i errors out of %i)", errors, count);
798            printf("\n");
799    
800          return 0;          return 0;
801  }  }
802    
803    
804    
805  int xvid_init_test()  int xvid_init_test(int flags)
806  {  {
807          int cpu_flags;          int cpu_flags;
808    
809            srand(time(0));
810    
811          printf("xvid_init_test\n");          printf("xvid_init_test\n");
812    
813  #if defined(ARCH_X86)  #if defined(ARCH_X86)
814          cpu_flags = check_cpu_features();          cpu_flags = check_cpu_features();
815            idct_int32_init();
816          emms_mmx();          emms_mmx();
817    
818          printf("--- quant intra ---\n");          printf("--- fdct ---\n");
819                    test_transform(fdct_int32, fdct_int32, "c", TEST_FDCT, flags);
820            if (cpu_flags & XVID_CPU_MMX)
821                    test_transform(fdct_int32, fdct_mmx, "mmx", TEST_FDCT, flags);
822            if (cpu_flags & XVID_CPU_SSE2)
823                    test_transform(fdct_int32, fdct_sse2, "sse2", TEST_FDCT, flags);
824    
825            printf("\n--- idct ---\n");
826                    test_transform(idct_int32, idct_int32, "c", TEST_IDCT, flags);
827          if (cpu_flags & XVID_CPU_MMX)          if (cpu_flags & XVID_CPU_MMX)
828                  test_h263_intra(quant_intra_c, quant_intra_mmx, "c", "mmx", -2048, 2047);                  test_transform(idct_int32, idct_mmx, "mmx", TEST_IDCT, flags);
829            if (cpu_flags & XVID_CPU_MMXEXT)
830                    test_transform(idct_int32, idct_xmm, "xmm", TEST_IDCT, flags);
831          if (cpu_flags & XVID_CPU_3DNOWEXT)          if (cpu_flags & XVID_CPU_3DNOWEXT)
832                  test_h263_intra(quant_intra_c, quant_intra_3dne, NULL, "3dne", -2048, 2047);                  test_transform(idct_int32, idct_3dne, "3dne", TEST_IDCT, flags);
833          if (cpu_flags & XVID_CPU_SSE2)          if (cpu_flags & XVID_CPU_SSE2)
834                  test_h263_intra(quant_intra_c, quant_intra_sse2, NULL, "sse2", -2048, 2047);                  test_transform(idct_int32, idct_sse2, "sse2", TEST_IDCT, flags);
835    
836            printf("\n--- quant intra ---\n");
837                    test_quant(quant_intra_c, quant_intra_c, "c", TEST_QUANT_INTRA, flags);
838            if (cpu_flags & XVID_CPU_MMX)
839                    test_quant(quant_intra_c, quant_intra_mmx, "mmx", TEST_QUANT_INTRA, flags);
840            if (cpu_flags & XVID_CPU_3DNOWEXT)
841                    test_quant(quant_intra_c, quant_intra_3dne, "3dne", TEST_QUANT_INTRA, flags);
842            if (cpu_flags & XVID_CPU_SSE2)
843                    test_quant(quant_intra_c, quant_intra_sse2, "sse2", TEST_QUANT_INTRA, flags);
844    
845          printf("\n--- quant inter ---\n");          printf("\n--- quant inter ---\n");
846                    test_quant(quant_inter_c, quant_inter_c, "c", TEST_QUANT_INTER, flags);
847          if (cpu_flags & XVID_CPU_MMX)          if (cpu_flags & XVID_CPU_MMX)
848                  test_h263_inter(quant_inter_c, quant_inter_mmx, "c", "mmx", -2048, 2047);                  test_quant(quant_inter_c, quant_inter_mmx, "mmx", TEST_QUANT_INTER, flags);
849          if (cpu_flags & XVID_CPU_3DNOWEXT)          if (cpu_flags & XVID_CPU_3DNOWEXT)
850                  test_h263_inter(quant_inter_c, quant_inter_3dne, NULL, "3dne", -2048, 2047);                  test_quant(quant_inter_c, quant_inter_3dne, "3dne", TEST_QUANT_INTER, flags);
851          if (cpu_flags & XVID_CPU_SSE2)          if (cpu_flags & XVID_CPU_SSE2)
852                  test_h263_inter(quant_inter_c, quant_inter_sse2, NULL, "sse2", -2048, 2047);                  test_quant(quant_inter_c, quant_inter_sse2, "sse2", TEST_QUANT_INTER, flags);
853    
854          printf("\n--- dequan intra ---\n");          printf("\n--- dequant intra ---\n");
855                    test_quant(dequant_intra_c, dequant_intra_c, "c", TEST_DEQUANT_INTRA, flags);
856          if (cpu_flags & XVID_CPU_MMX)          if (cpu_flags & XVID_CPU_MMX)
857                  test_h263_intra(dequant_intra_c, dequant_intra_mmx, "c", "mmx", -256, 255);                  test_quant(dequant_intra_c, dequant_intra_mmx, "mmx", TEST_DEQUANT_INTRA, flags);
858          if (cpu_flags & XVID_CPU_MMXEXT)          if (cpu_flags & XVID_CPU_MMXEXT)
859                  test_h263_intra(dequant_intra_c, dequant_intra_xmm, NULL, "xmm", -256, 255);                  test_quant(dequant_intra_c, dequant_intra_xmm, "xmm", TEST_DEQUANT_INTRA, flags);
860          if (cpu_flags & XVID_CPU_3DNOWEXT)          if (cpu_flags & XVID_CPU_3DNOWEXT)
861                  test_h263_intra(dequant_intra_c, dequant_intra_3dne, NULL, "3dne", -256, 255);                  test_quant(dequant_intra_c, dequant_intra_3dne, "3dne", TEST_DEQUANT_INTRA, flags);
862          if (cpu_flags & XVID_CPU_SSE2)          if (cpu_flags & XVID_CPU_SSE2)
863                  test_h263_intra(dequant_intra_c, dequant_intra_sse2, NULL, "sse2", -256, 255);                  test_quant(dequant_intra_c, dequant_intra_sse2, "sse2", TEST_DEQUANT_INTRA, flags);
864    
865          printf("\n--- dequant inter ---\n");          printf("\n--- dequant inter ---\n");
866                    test_quant(dequant_inter_c, dequant_inter_c, "c", TEST_DEQUANT_INTER, flags);
867          if (cpu_flags & XVID_CPU_MMX)          if (cpu_flags & XVID_CPU_MMX)
868                  test_h263_inter((quanth263_interFunc*)dequant_inter_c,                  test_quant(dequant_inter_c, dequant_inter_mmx, "mmx", TEST_DEQUANT_INTER, flags);
                                                 (quanth263_interFunc*)dequant_inter_mmx, "c", "mmx", -256, 255);  
   
869          if (cpu_flags & XVID_CPU_MMXEXT)          if (cpu_flags & XVID_CPU_MMXEXT)
870                  test_h263_inter((quanth263_interFunc*)dequant_inter_c,                  test_quant(dequant_inter_c, dequant_inter_xmm, "xmm", TEST_DEQUANT_INTER, flags);
                                                 (quanth263_interFunc*)dequant_inter_xmm, NULL, "xmm", -256, 255);  
871          if (cpu_flags & XVID_CPU_3DNOWEXT)          if (cpu_flags & XVID_CPU_3DNOWEXT)
872                  test_h263_inter((quanth263_interFunc*)dequant_inter_c,                  test_quant(dequant_inter_c, dequant_inter_3dne, "3dne", TEST_DEQUANT_INTER, flags);
                                                 (quanth263_interFunc*)dequant_inter_3dne, NULL, "3dne", -256, 255);  
873          if (cpu_flags & XVID_CPU_SSE2)          if (cpu_flags & XVID_CPU_SSE2)
874                  test_h263_inter((quanth263_interFunc*)dequant_inter_c,                  test_quant(dequant_inter_c, dequant_inter_sse2, "sse2", TEST_DEQUANT_INTER, flags);
                                                 (quanth263_interFunc*)dequant_inter_sse2, NULL, "sse2", -256, 255);  
875    
876          printf("\n--- quant4_intra ---\n");          printf("\n--- quant4_intra ---\n");
877                    test_quant(quant4_intra_c, quant4_intra_c, "c", TEST_QUANT_INTRA, flags);
878          if (cpu_flags & XVID_CPU_MMX)          if (cpu_flags & XVID_CPU_MMX)
879                  test_h263_intra((quanth263_intraFunc*)quant4_intra_c,                  test_quant(quant4_intra_c, quant4_intra_mmx, "mmx", TEST_QUANT_INTRA, flags);
                                                 (quanth263_intraFunc*)quant4_intra_mmx, "c", "mmx", -2048, 2047);  
880          if (cpu_flags & XVID_CPU_MMXEXT)          if (cpu_flags & XVID_CPU_MMXEXT)
881                  test_h263_intra((quanth263_intraFunc*)quant4_intra_c,                  test_quant(quant4_intra_c, quant4_intra_xmm, "xmm", TEST_QUANT_INTRA, flags);
                                                 (quanth263_intraFunc*)quant4_intra_xmm, NULL, "xmm", -2048, 2047);  
882    
883          printf("\n--- quant4_inter ---\n");          printf("\n--- quant4_inter ---\n");
884                    test_quant(quant4_inter_c, quant4_inter_c, "c", TEST_QUANT_INTER, flags);
885          if (cpu_flags & XVID_CPU_MMX)          if (cpu_flags & XVID_CPU_MMX)
886                  test_h263_inter((quanth263_interFunc*)quant4_inter_c,                  test_quant(quant4_inter_c, quant4_inter_mmx, "mmx", TEST_QUANT_INTER, flags);
                                                 (quanth263_interFunc*)quant4_inter_mmx, "c", "mmx", -2048, 2047);  
887          if (cpu_flags & XVID_CPU_MMXEXT)          if (cpu_flags & XVID_CPU_MMXEXT)
888                  test_h263_inter((quanth263_interFunc*)quant4_inter_c,                  test_quant(quant4_inter_c, quant4_inter_xmm, "xmm", TEST_QUANT_INTER, flags);
                                                 (quanth263_interFunc*)quant4_inter_xmm, NULL, "xmm", -2048, 2047);  
   
889    
890          printf("\n--- dequant4_intra ---\n");          printf("\n--- dequant4_intra ---\n");
891                    test_quant(dequant4_intra_c, dequant4_intra_c, "c", TEST_DEQUANT_INTRA, flags);
892          if (cpu_flags & XVID_CPU_MMX)          if (cpu_flags & XVID_CPU_MMX)
893                  test_h263_intra((quanth263_intraFunc*)dequant4_intra_c,                  test_quant(dequant4_intra_c, dequant4_intra_mmx, "mmx", TEST_DEQUANT_INTRA, flags);
                                                 (quanth263_intraFunc*)dequant4_intra_mmx, "c", "mmx", -256, 255);  
894          if (cpu_flags & XVID_CPU_3DNOWEXT)          if (cpu_flags & XVID_CPU_3DNOWEXT)
895                  test_h263_intra((quanth263_intraFunc*)dequant4_intra_c,                  test_quant(dequant4_intra_c, dequant4_intra_3dne, "3dne", TEST_DEQUANT_INTRA, flags);
                                                 (quanth263_intraFunc*)dequant4_intra_3dne, NULL, "sse2", -256, 255);  
896    
897          printf("\n--- dequant4_inter ---\n");          printf("\n--- dequant4_inter ---\n");
898                    test_quant(dequant4_inter_c, dequant4_inter_c, "c", TEST_DEQUANT_INTER, flags);
899          if (cpu_flags & XVID_CPU_MMX)          if (cpu_flags & XVID_CPU_MMX)
900                  test_h263_inter((quanth263_interFunc*)dequant4_inter_c,                  test_quant(dequant4_inter_c, dequant4_inter_mmx, "mmx", TEST_DEQUANT_INTER, flags);
                                                 (quanth263_interFunc*)dequant4_inter_mmx, "c", "mmx", -256, 255);  
901          if (cpu_flags & XVID_CPU_3DNOWEXT)          if (cpu_flags & XVID_CPU_3DNOWEXT)
902                  test_h263_inter((quanth263_interFunc*)dequant4_inter_c,                  test_quant(dequant4_inter_c, dequant4_inter_3dne, "3dne", TEST_DEQUANT_INTER, flags);
                                                 (quanth263_interFunc*)dequant4_inter_3dne, NULL, "sse2", -256, 255);  
903    
904          emms_mmx();          emms_mmx();
905    
# Line 813  Line 924 
924                          return xvid_init_convert((XVID_INIT_CONVERTINFO*)param1);                          return xvid_init_convert((XVID_INIT_CONVERTINFO*)param1);
925    
926                  case XVID_INIT_TEST :                  case XVID_INIT_TEST :
927                          return xvid_init_test();                          return xvid_init_test((int)param1);
928    
929                  default :                  default :
930                          return XVID_ERR_FAIL;                          return XVID_ERR_FAIL;

Legend:
Removed from v.1.33.2.19  
changed lines
  Added in v.1.33.2.21

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