deblock_vert_useDC.c
上传用户:tuheem
上传日期:2007-05-01
资源大小:21889k
文件大小:7k
源码类别:

多媒体编程

开发平台:

Visual C++

  1. #include "postprocess_mmx.h"
  2. INLINE  int deblock_vert_useDC(uint8_t *v, int stride) {
  3. const uint64_t mask   = 0xfefefefefefefefe;
  4. uint32_t mm_data1;
  5. uint64_t *pmm1;
  6. int eq_cnt, useDC;
  7. #ifdef PP_SELF_CHECK
  8. int useDC2, i, j;
  9. #endif
  10. #ifdef PP_SELF_CHECK
  11. eq_cnt = 0;
  12. for (j=1; j<8; j++) {
  13. for (i=0; i<8; i++) {
  14. if (ABS(v[j*stride+i] - v[(j+1)*stride+i]) <= 1) eq_cnt++;
  15. }
  16. }
  17. useDC2 = (eq_cnt > DEBLOCK_VERT_USEDC_THR); 
  18. #endif
  19. pmm1 = (uint64_t *)(&(v[stride]));
  20. __asm {
  21. push eax
  22. mov eax, pmm1
  23. movq mm6, mask               /*mm6 = 0xfefefefefefefefe       */
  24. pxor mm7, mm7                /*mm7 = 0x0000000000000000       */
  25. movq mm2, [eax]             /* mm2 = *p_data                 */
  26. pxor mm4, mm4                /*mm4 = 0x0000000000000000       */
  27. add   eax, stride          /* p_data += stride              */
  28. movq   mm3, mm2              /* mm3 = *p_data                 */
  29. };
  30. __asm {
  31. movq   mm2, [eax]          /* mm2 = *p_data                 */
  32. movq   mm0, mm3             /* mm0 = mm3                     */
  33. movq   mm3, mm2             /* mm3 = *p_data                 */
  34. movq   mm1, mm0             /* mm1 = mm0                     */
  35. psubusb mm0, mm2            /* mm0 -= mm2                    */
  36. add   eax, stride         /* p_data += stride              */
  37. psubusb mm2, mm1            /* mm2 -= mm1                    */
  38. por    mm0, mm2             /* mm0 |= mm2                    */
  39. pand   mm0, mm6             /* mm0 &= 0xfefefefefefefefe     */      
  40. pcmpeqb mm0, mm4            /* is mm0 == 0 ?                 */
  41. movq   mm2, [eax]          /* mm2 = *p_data                 */
  42. psubb  mm7, mm0             /* mm7 has running total of eqcnts */
  43. movq   mm5, mm3             /* mm5 = mm3                     */
  44. movq   mm3, mm2             /* mm3 = *p_data                 */
  45. movq   mm1, mm5             /* mm1 = mm5                     */
  46. psubusb mm5, mm2            /* mm5 -= mm2                    */
  47. psubusb mm2, mm1            /* mm2 -= mm1                    */
  48. por    mm5, mm2             /* mm5 |= mm2                    */
  49. add   eax, stride         /* p_data += stride              */
  50. pand   mm5, mm6             /* mm5 &= 0xfefefefefefefefe     */      
  51. pcmpeqb mm5, mm4            /* is mm0 == 0 ?                 */
  52. psubb  mm7, mm5             /* mm7 has running total of eqcnts */
  53. movq   mm2, [eax]          /* mm2 = *p_data                 */
  54. movq   mm0, mm3             /* mm0 = mm3                     */
  55. movq   mm3, mm2             /* mm3 = *p_data                 */
  56. movq   mm1, mm0             /* mm1 = mm0                     */
  57. psubusb mm0, mm2            /* mm0 -= mm2                    */
  58. add   eax, stride         /* p_data += stride              */
  59. psubusb mm2, mm1            /* mm2 -= mm1                    */
  60. por    mm0, mm2             /* mm0 |= mm2                    */
  61. pand   mm0, mm6             /* mm0 &= 0xfefefefefefefefe     */      
  62. pcmpeqb mm0, mm4            /* is mm0 == 0 ?                 */
  63. movq   mm2, [eax]          /* mm2 = *p_data                 */
  64. psubb  mm7, mm0             /* mm7 has running total of eqcnts */
  65. movq   mm5, mm3             /* mm5 = mm3                     */
  66. movq   mm3, mm2             /* mm3 = *p_data                 */
  67. movq   mm1, mm5             /* mm1 = mm5                     */
  68. psubusb mm5, mm2            /* mm5 -= mm2                    */
  69. psubusb mm2, mm1            /* mm2 -= mm1                    */
  70. por    mm5, mm2             /* mm5 |= mm2                    */
  71. add   eax, stride         /* p_data += stride              */
  72. pand   mm5, mm6             /* mm5 &= 0xfefefefefefefefe     */      
  73. pcmpeqb mm5, mm4            /* is mm0 == 0 ?                 */
  74. psubb  mm7, mm5             /* mm7 has running total of eqcnts */
  75. movq   mm2, [eax]          /* mm2 = *p_data                 */
  76. movq   mm0, mm3             /* mm0 = mm3                     */
  77. movq   mm3, mm2             /* mm3 = *p_data                 */
  78. movq   mm1, mm0             /* mm1 = mm0                     */
  79. psubusb mm0, mm2            /* mm0 -= mm2                    */
  80. add   eax, stride         /* p_data += stride              */
  81. psubusb mm2, mm1            /* mm2 -= mm1                    */
  82. por    mm0, mm2             /* mm0 |= mm2                    */
  83. pand   mm0, mm6             /* mm0 &= 0xfefefefefefefefe     */      
  84. pcmpeqb mm0, mm4            /* is mm0 == 0 ?                 */
  85. movq   mm2, [eax]          /* mm2 = *p_data                 */
  86. psubb  mm7, mm0             /* mm7 has running total of eqcnts */
  87. movq   mm5, mm3             /* mm5 = mm3                     */
  88. movq   mm3, mm2             /* mm3 = *p_data                 */
  89. movq   mm1, mm5             /* mm1 = mm5                     */
  90. psubusb mm5, mm2            /* mm5 -= mm2                    */
  91. psubusb mm2, mm1            /* mm2 -= mm1                    */
  92. por    mm5, mm2             /* mm5 |= mm2                    */
  93. add   eax, stride         /* p_data += stride              */
  94. pand   mm5, mm6             /* mm5 &= 0xfefefefefefefefe     */      
  95. pcmpeqb mm5, mm4            /* is mm0 == 0 ?                 */
  96. psubb  mm7, mm5             /* mm7 has running total of eqcnts */
  97. movq   mm2, [eax]          /* mm2 = *p_data                 */
  98. movq   mm0, mm3             /* mm0 = mm3                     */
  99. movq   mm3, mm2             /* mm3 = *p_data                 */
  100. movq   mm1, mm0             /* mm1 = mm0                     */
  101. psubusb mm0, mm2            /* mm0 -= mm2                    */
  102. add   eax, stride         /* p_data += stride              */
  103. psubusb mm2, mm1            /* mm2 -= mm1                    */
  104. por    mm0, mm2             /* mm0 |= mm2                    */
  105. pand   mm0, mm6             /* mm0 &= 0xfefefefefefefefe     */      
  106. pcmpeqb mm0, mm4            /* is mm0 == 0 ?                 */
  107. psubb  mm7, mm0             /* mm7 has running total of eqcnts */
  108. pop eax
  109.                                        
  110. };
  111. __asm {
  112. movq    mm1, mm7            /* mm1 = mm7             0 1w2 3 4 5 6 7r   */
  113. psrlq   mm7, 32             /* mm7 >>= 32            0 1 2 3 4 5 6 7m   */
  114. paddb   mm7, mm1            /* mm7 has running total of eqcnts */
  115. movq mm1, mm7               /* mm1 = mm7             0 1w2 3 4 5 6 7r   */
  116. psrlq   mm7, 16             /* mm7 >>= 16            0 1 2 3 4 5 6 7m   */
  117. paddb   mm1, mm7            /* mm7 has running total of eqcnts */
  118. movq mm7, mm1               /* mm1 = mm7             0 1w2 3 4 5 6 7r   */
  119. psrlq   mm7, 8              /* mm7 >>= 8             0 1 2 3 4 5 6 7m   */
  120. paddb   mm7, mm1            /* mm7 has running total of eqcnts */
  121. movd mm_data1, mm7          /* mm_data1 = mm7       */
  122. };
  123. eq_cnt = mm_data1 & 0xff;
  124. useDC = (eq_cnt  > DEBLOCK_VERT_USEDC_THR);
  125. #ifdef PP_SELF_CHECK
  126. if (useDC != useDC2) printf("ERROR: MMX version of useDC is incorrectn");
  127. #endif
  128. return useDC;
  129. }