home *** CD-ROM | disk | FTP | other *** search
/ Computer Shopper 275 / DPCS0111DVD.ISO / Toolkit / Audio-Visual / VirtualDub / Source / VirtualDub-1.9.10-src.7z / src / Meia / source / idct_mmx.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  2009-09-14  |  4.4 KB  |  161 lines

  1. #include <string.h>
  2. #include <math.h>
  3.  
  4. #include <vd2/system/vdtypes.h>
  5. #include <vd2/Meia/MPEGIDCT.h>
  6. #include "tables.h"
  7.  
  8. #ifdef _M_AMD64
  9. extern "C" void _mm_sfence();
  10. #endif
  11.  
  12. extern "C" void IDCT_mmx(signed short *dct_coeff, void *dst, long pitch, int intra_flag, int pos);
  13. extern "C" void IDCT_isse(signed short *dct_coeff, void *dst, long pitch, int intra_flag, int pos);
  14. extern "C" void IDCT_sse2(signed short *dct_coeff, void *dst, long pitch, int intra_flag, int pos);
  15.  
  16. using namespace nsVDMPEGTables;
  17.  
  18. //#define VERIFY_ROW_SHORTCUT
  19.  
  20. namespace nsVDMPEGIDCTMMX {
  21.  
  22. #ifndef _M_AMD64
  23.         static void mmx_idct_intra(unsigned char *dst, int pitch, short *tmp, int last_pos) {
  24.             IDCT_mmx(tmp, dst, pitch, 1, last_pos);
  25.         }
  26.  
  27.         static void mmx_idct_nonintra(unsigned char *dst, int pitch, short *tmp, int last_pos) {
  28.             IDCT_mmx(tmp, dst, pitch, 0, last_pos);
  29.         }
  30.  
  31.         static void mmx_idct_test(short *tmp, int last_pos) {
  32.             IDCT_mmx(tmp, NULL, 0, 2, last_pos);
  33.             __asm emms
  34.         }
  35.  
  36.         static void isse_idct_intra(unsigned char *dst, int pitch, short *tmp, int last_pos) {
  37.     #ifdef VERIFY_ROW_SHORTCUT
  38.             short test1[64], test2[64];
  39.             memcpy(test1, tmp, 128);
  40.             memcpy(test2, tmp, 128);
  41.             IDCT_isse(test1, 0, 0, 2, last_pos?last_pos:1);
  42.             IDCT_isse(test2, 0, 0, 2, 63);
  43.             VDASSERT(!memcmp(test1, test2, 128));
  44.     #endif
  45.             
  46.             IDCT_isse(tmp, dst, pitch, 1, last_pos);
  47.         }
  48.  
  49.         static void isse_idct_nonintra(unsigned char *dst, int pitch, short *tmp, int last_pos) {
  50.     #ifdef VERIFY_ROW_SHORTCUT
  51.             short test1[64], test2[64];
  52.             memcpy(test1, tmp, 128);
  53.             memcpy(test2, tmp, 128);
  54.             IDCT_isse(test1, 0, 0, 2, last_pos?last_pos:1);
  55.             IDCT_isse(test2, 0, 0, 2, 63);
  56.             VDASSERT(!memcmp(test1, test2, 128));
  57.     #endif
  58.  
  59.             IDCT_isse(tmp, dst, pitch, 0, last_pos);
  60.         }
  61.  
  62.         static void isse_idct_test(short *tmp, int last_pos) {
  63.             IDCT_isse(tmp, NULL, 0, 2, last_pos);
  64.             __asm emms
  65.             __asm sfence
  66.         }
  67. #endif
  68.  
  69.     static void sse2_idct_intra(unsigned char *dst, int pitch, short *tmp, int last_pos) {
  70. #ifdef VERIFY_ROW_SHORTCUT
  71.         short test1[64], test2[64];
  72.         memcpy(test1, tmp, 128);
  73.         memcpy(test2, tmp, 128);
  74.         IDCT_sse2(test1, 0, 0, 2, last_pos?last_pos:1);
  75.         IDCT_sse2(test2, 0, 0, 2, 63);
  76.         VDASSERT(!memcmp(test1, test2, 128));
  77. #endif
  78.         
  79.         IDCT_sse2(tmp, dst, pitch, 1, last_pos);
  80.     }
  81.  
  82.     static void sse2_idct_nonintra(unsigned char *dst, int pitch, short *tmp, int last_pos) {
  83. #ifdef VERIFY_ROW_SHORTCUT
  84.         short test1[64], test2[64];
  85.         memcpy(test1, tmp, 128);
  86.         memcpy(test2, tmp, 128);
  87.         IDCT_sse2(test1, 0, 0, 2, last_pos?last_pos:1);
  88.         IDCT_sse2(test2, 0, 0, 2, 63);
  89.         VDASSERT(!memcmp(test1, test2, 128));
  90. #endif
  91.  
  92.         IDCT_sse2(tmp, dst, pitch, 0, last_pos);
  93.     }
  94.  
  95.     static void sse2_idct_test(short *tmp, int last_pos) {
  96.         __declspec(align(16)) short tmp2[64];
  97.  
  98.         memcpy(tmp2, tmp, 64*2);
  99.         IDCT_sse2(tmp2, NULL, 0, 2, last_pos);
  100.         memcpy(tmp, tmp2, 64*2);
  101.  
  102. #ifdef _M_AMD64
  103.         _mm_sfence();
  104. #else
  105.         __asm emms
  106.         __asm sfence
  107. #endif
  108.     }
  109.  
  110.     ///////////////////////////////////////////////////////////////////////
  111.  
  112.     static const int zigzag_reordered[64]={
  113.          0,  2,  8, 16, 10,  4,  6, 12,
  114.         18, 24, 32, 26, 20, 14,  1,  3,
  115.          9, 22, 28, 34, 40, 48, 42, 36,
  116.         30, 17, 11,  5,  7, 13, 19, 25,
  117.         38, 44, 50, 56, 58, 52, 46, 33,
  118.         27, 21, 15, 23, 29, 35, 41, 54,
  119.         60, 62, 49, 43, 37, 31, 39, 45,
  120.         51, 57, 59, 53, 47, 55, 61, 63,
  121.     };
  122.  
  123.     static const int zigzag_sse2[64]={
  124.          0,  4,  8, 16, 12,  1,  5,  9,
  125.         20, 24, 32, 28, 17, 13,  2,  6,
  126.         10, 21, 25, 36, 40, 48, 44, 33,
  127.         29, 18, 14,  3,  7, 11, 22, 26,
  128.         37, 41, 52, 56, 60, 49, 45, 34,
  129.         30, 19, 15, 23, 27, 38, 42, 53,
  130.         57, 61, 50, 46, 35, 31, 39, 43,
  131.         54, 58, 62, 51, 47, 55, 59, 63,
  132.     };
  133.  
  134. };
  135.  
  136. #ifndef _M_AMD64
  137. const struct VDMPEGIDCTSet g_VDMPEGIDCT_mmx = {
  138.     (tVDMPEGIDCT)nsVDMPEGIDCTMMX::mmx_idct_intra,
  139.     (tVDMPEGIDCT)nsVDMPEGIDCTMMX::mmx_idct_nonintra,
  140.     (tVDMPEGIDCTTest)nsVDMPEGIDCTMMX::mmx_idct_test,
  141.     NULL,
  142.     nsVDMPEGIDCTMMX::zigzag_reordered,
  143. };
  144.  
  145. const struct VDMPEGIDCTSet g_VDMPEGIDCT_isse = {
  146.     (tVDMPEGIDCT)nsVDMPEGIDCTMMX::isse_idct_intra,
  147.     (tVDMPEGIDCT)nsVDMPEGIDCTMMX::isse_idct_nonintra,
  148.     (tVDMPEGIDCTTest)nsVDMPEGIDCTMMX::isse_idct_test,
  149.     NULL,
  150.     nsVDMPEGIDCTMMX::zigzag_reordered,
  151. };
  152. #endif
  153.  
  154. const struct VDMPEGIDCTSet g_VDMPEGIDCT_sse2 = {
  155.     (tVDMPEGIDCT)nsVDMPEGIDCTMMX::sse2_idct_intra,
  156.     (tVDMPEGIDCT)nsVDMPEGIDCTMMX::sse2_idct_nonintra,
  157.     (tVDMPEGIDCTTest)nsVDMPEGIDCTMMX::sse2_idct_test,
  158.     NULL,
  159.     nsVDMPEGIDCTMMX::zigzag_sse2,
  160. };
  161.