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

多媒体编程

开发平台:

Visual C++

  1. #include "postprocess_mmx.h"
  2. INLINE void deblock_vert_default_filter(uint8_t *v, int stride, int QP) {
  3. uint64_t *pmm1;
  4. const uint64_t mm_0020 = 0x0020002000200020;
  5. uint64_t mm_8_x_QP;
  6. int i;
  7. #ifdef PP_SELF_CHECK
  8. int l1 = 1 * stride;
  9. int l2 = 2 * stride;
  10. int l3 = 3 * stride;
  11. int l4 = 4 * stride;
  12. int l5 = 5 * stride;
  13. int l6 = 6 * stride;
  14. int l7 = 7 * stride;
  15. int l8 = 8 * stride;
  16. int x, y, a3_0_SC, a3_1_SC, a3_2_SC, d_SC, q_SC;
  17. uint8_t selfcheck[8][2];
  18. #endif
  19. #ifdef PP_SELF_CHECK
  20. for (x=0; x<8; x++) {
  21. a3_0_SC = 2*v[l3+x] - 5*v[l4+x] + 5*v[l5+x] - 2*v[l6+x];
  22. a3_1_SC = 2*v[l1+x] - 5*v[l2+x] + 5*v[l3+x] - 2*v[l4+x];
  23. a3_2_SC = 2*v[l5+x] - 5*v[l6+x] + 5*v[l7+x] - 2*v[l8+x];
  24. q_SC    = (v[l4+x] - v[l5+x]) / 2;
  25. if (ABS(a3_0_SC) < 8*QP) {
  26. d_SC = ABS(a3_0_SC) - MIN(ABS(a3_1_SC), ABS(a3_2_SC));
  27. if (d_SC < 0) d_SC=0;
  28. d_SC = (5*d_SC + 32) >> 6; 
  29. d_SC *= SIGN(-a3_0_SC);
  30. if (q_SC > 0) {
  31. d_SC = d_SC<0    ? 0    : d_SC;
  32. d_SC = d_SC>q_SC ? q_SC : d_SC;
  33. } else {
  34. d_SC = d_SC>0    ? 0    : d_SC;
  35. d_SC = d_SC<q_SC ? q_SC : d_SC;
  36. }
  37. } else {
  38. d_SC = 0;
  39. }
  40. selfcheck[x][0] = v[l4+x] - d_SC;
  41. selfcheck[x][1] = v[l5+x] + d_SC;
  42. }
  43. #endif
  44. ((uint32_t *)&mm_8_x_QP)[0] = 
  45.  ((uint32_t *)&mm_8_x_QP)[1] = 0x00080008 * QP; 
  46. for (i=0; i<2; i++) { 
  47. pmm1 = (uint64_t *)(&(v[4*i]));
  48. __asm {
  49. push ecx
  50. mov ecx, pmm1
  51. pxor      mm7, mm7               /* mm7 = 0000000000000000    0 1 2 3 4 5 6 7w   */
  52. add      ecx, stride           /* %0 += stride              0 1 2 3 4 5 6 7    */ 
  53. movd      mm0, [ecx]            /* mm0 = v1v1v1v1v1v1v1v1    0w1 2 3 4 5 6 7    */
  54. punpcklbw mm0, mm7               /* mm0 = __v1__v1__v1__v1 L  0m1 2 3 4 5 6 7r   */
  55. add      ecx, stride           /* ecx += stride              0 1 2 3 4 5 6 7    */ 
  56. movd      mm1, [ecx]            /* mm1 = v2v2v2v2v2v2v2v2    0 1w2 3 4 5 6 7    */
  57. add      ecx, stride           /* ecx += stride              0 1 2 3 4 5 6 7    */ 
  58. punpcklbw mm1, mm7               /* mm1 = __v2__v2__v2__v2 L  0 1m2 3 4 5 6 7r   */
  59. movd      mm2, [ecx]            /* mm2 = v3v3v3v3v3v3v3v3    0 1 2w3 4 5 6 7    */
  60. add      ecx, stride           /* ecx += stride              0 1 2 3 4 5 6 7    */ 
  61. punpcklbw mm2, mm7               /* mm2 = __v3__v3__v3__v3 L  0 1 2m3 4 5 6 7r   */
  62. movd      mm3, [ecx]            /* mm3 = v4v4v4v4v4v4v4v4    0 1 2 3w4 5 6 7    */
  63. punpcklbw mm3, mm7               /* mm3 = __v4__v4__v4__v4 L  0 1 2 3m4 5 6 7r   */
  64. psubw     mm1, mm2               /* mm1 = v2 - v3          L  0 1m2r3 4 5 6 7    */
  65. movq      mm4, mm1               /* mm4 = v2 - v3          L  0 1r2 3 4w5 6 7    */
  66. psllw     mm1, 2                 /* mm1 = 4 * (v2 - v3)    L  0 1m2 3 4 5 6 7    */
  67. paddw     mm1, mm4               /* mm1 = 5 * (v2 - v3)    L  0 1m2 3 4r5 6 7    */
  68. psubw     mm0, mm3               /* mm0 = v1 - v4          L  0m1 2 3r4 5 6 7    */
  69. psllw     mm0, 1                 /* mm0 = 2 * (v1 - v4)    L  0m1 2 3 4 5 6 7    */
  70. psubw     mm0, mm1               /* mm0 = a3_1             L  0m1r2 3 4 5 6 7    */
  71. pxor      mm1, mm1               /* mm1 = 0000000000000000    0 1w2 3 4 5 6 7    */
  72. pcmpgtw   mm1, mm0               /* is 0 > a3_1 ?          L  0r1m2 3 4 5 6 7    */
  73. add      ecx, stride           /* ecx += stride              0 1 2 3 4 5 6 7    */ 
  74. pxor      mm0, mm1               /* mm0 = ABS(a3_1) step 1 L  0m1r2 3 4 5 6 7    */
  75. psubw     mm0, mm1               /* mm0 = ABS(a3_1) step 2 L  0m1r2 3 4 5 6 7    */
  76. movd      mm1, [ecx]            /* mm1 = v5v5v5v5v5v5v5v5    0 1w2 3 4 5 6 7    */
  77. punpcklbw mm1, mm7               /* mm1 = __v5__v5__v5__v5 L  0 1m2 3 4 5 6 7r   */
  78. add      ecx, stride           /* ecx += stride              0 1 2 3 4 5 6 7    */ 
  79. psubw     mm3, mm1               /* mm3 = v4 - v5          L  0 1r2 3m4 5 6 7    */
  80. movd      mm4, [ecx]            /* mm4 = v6v6v6v6v6v6v6v6    0 1 2 3 4w5 6 7    */
  81. punpcklbw mm4, mm7               /* mm4 = __v6__v6__v6__v6 L  0 1 2 3 4m5 6 7r   */
  82. add      ecx, stride           /* ecx += stride              0 1 2 3 4 5 6 7    */ 
  83. movd      mm5, [ecx]            /* mm5 = v7v7v7v7v7v7v7v7    0 1 2 3 4 5w6 7    */
  84. psubw     mm2, mm4               /* mm2 = v3 - v6          L  0 1 2m3 4r5 6 7    */
  85. punpcklbw mm5, mm7               /* mm5 = __v7__v7__v7__v7 L  0 1 2 3 4 5m6 7r   */
  86. add      ecx, stride           /* ecx += stride              0 1 2 3 4 5 6 7    */ 
  87. psubw     mm5, mm4               /* mm5 = v7 - v6          L  0 1 2 3 4r5m6 7    */
  88. movq      mm4, mm5               /* mm4 = v7 - v6          L  0 1 2 3 4w5r6 7    */
  89. psllw     mm4, 2                 /* mm4 = 4 * (v7 - v6)    L  0 1 2 3 4 5m6 7    */
  90. paddw     mm5, mm4               /* mm5 = 5 * (v7 - v6)    L  0 1 2 3 4r5m6 7    */
  91. movd      mm4, [ecx]            /* mm4 = v8v8v8v8v8v8v8v8    0 1 2 3 4w5 6 7    */
  92. punpcklbw mm4, mm7               /* mm4 = __v8__v8__v8__v8 L  0 1 2 3 4m5 6 7r   */
  93. psubw     mm1, mm4               /* mm1 = v5 - v8          L  0 1m2 3 4r5 6 7    */
  94. pxor      mm4, mm4               /* mm4 = 0000000000000000    0 1 2 3 4w5 6 7    */
  95. psllw     mm1, 1                 /* mm1 = 2 * (v5 - v8)    L  0 1m2 3 4 5 6 7    */
  96. paddw     mm1, mm5               /* mm1 = a3_2             L  0 1m2 3 4 5r6 7    */
  97. pcmpgtw   mm4, mm1               /* is 0 > a3_2 ?          L  0 1r2 3 4m5 6 7    */
  98. pxor      mm1, mm4               /* mm1 = ABS(a3_2) step 1 L  0 1m2 3 4r5 6 7    */
  99. psubw     mm1, mm4               /* mm1 = ABS(a3_2) step 2 L  0 1m2 3 4r5 6 7    */
  100. /* at this point, mm0 = ABS(a3_1), mm1 = ABS(a3_2), mm2 = v3 - v6, mm3 = v4 - v5 */
  101. movq      mm4, mm1               /* mm4 = ABS(a3_2)        L  0 1r2 3 4w5 6 7    */
  102. pcmpgtw   mm1, mm0               /* is ABS(a3_2) > ABS(a3_1)  0r1m2 3 4 5 6 7    */
  103. pand      mm0, mm1               /* min() step 1           L  0m1r2 3 4 5 6 7    */
  104. pandn     mm1, mm4               /* min() step 2           L  0 1m2 3 4r5 6 7    */
  105. por       mm0, mm1               /* min() step 3           L  0m1r2 3 4 5 6 7    */
  106. /* at this point, mm0 = MIN( ABS(a3_1), ABS(a3_2), mm2 = v3 - v6, mm3 = v4 - v5 */
  107. movq      mm1, mm3               /* mm1 = v4 - v5          L  0 1w2 3r4 5 6 7    */
  108. psllw     mm3, 2                 /* mm3 = 4 * (v4 - v5)    L  0 1 2 3m4 5 6 7    */
  109. paddw     mm3, mm1               /* mm3 = 5 * (v4 - v5)    L  0 1r2 3m4 5 6 7    */
  110. psllw     mm2, 1                 /* mm2 = 2 * (v3 - v6)    L  0 1 2m3 4 5 6 7    */
  111. psubw     mm2, mm3               /* mm2 = a3_0             L  0 1 2m3r4 5 6 7    */
  112. /* at this point, mm0 = MIN( ABS(a3_1), ABS(a3_2), mm1 = v4 - v5, mm2 = a3_0 */
  113. movq      mm4, mm2               /* mm4 = a3_0             L  0 1 2r3 4w5 6 7    */
  114. pxor      mm3, mm3               /* mm3 = 0000000000000000    0 1 2 3w4 5 6 7    */
  115. pcmpgtw   mm3, mm2               /* is 0 > a3_0 ?          L  0 1 2r3m4 5 6 7    */
  116. movq      mm2, mm_8_x_QP         /* mm4 = 8*QP                0 1 2w3 4 5 6 7    */
  117. pxor      mm4, mm3               /* mm4 = ABS(a3_0) step 1 L  0 1 2 3r4m5 6 7    */
  118. psubw     mm4, mm3               /* mm4 = ABS(a3_0) step 2 L  0 1 2 3r4m5 6 7    */
  119. /* compare a3_0 against 8*QP */
  120. pcmpgtw   mm2, mm4               /* is 8*QP > ABS(d) ?     L  0 1 2m3 4r5 6 7    */
  121. pand      mm2, mm4               /* if no, d = 0           L  0 1 2m3 4r5 6 7    */
  122. movq      mm4, mm2               /* mm2 = a3_0             L  0 1 2r3 4w5 6 7    */
  123. /* at this point, mm0 = MIN( ABS(a3_1), ABS(a3_2), mm1 = v4 - v5, mm2 = a3_0 , mm3 = SGN(a3_0), mm4 = ABS(a3_0) */
  124. psubusw   mm4, mm0               /* mm0 = (A3_0 - a3_0)    L  0r1 2 3 4m5 6 7    */
  125. movq      mm0, mm4               /* mm0=ABS(d)             L  0w1 2 3 4r5 6 7    */
  126. psllw     mm0, 2                 /* mm0 = 4 * (A3_0-a3_0)  L  0m1 2 3 4 5 6 7    */
  127. paddw     mm0, mm4               /* mm0 = 5 * (A3_0-a3_0)  L  0m1 2 3 4r5 6 7    */
  128. paddw     mm0, mm_0020           /* mm0 += 32              L  0m1 2 3 4 5 6 7    */
  129. psraw     mm0, 6                 /* mm0 >>= 6              L  0m1 2 3 4 5 6 7    */
  130. /* at this point, mm0 = ABS(d), mm1 = v4 - v5, mm3 = SGN(a3_0) */
  131. pxor      mm2, mm2               /* mm2 = 0000000000000000    0 1 2w3 4 5 6 7    */
  132. pcmpgtw   mm2, mm1               /* is 0 > (v4 - v5) ?     L  0 1r2m3 4 5 6 7    */
  133. pxor      mm1, mm2               /* mm1 = ABS(mm1) step 1  L  0 1m2r3 4 5 6 7    */
  134. psubw     mm1, mm2               /* mm1 = ABS(mm1) step 2  L  0 1m2r3 4 5 6 7    */
  135. psraw     mm1, 1                 /* mm1 >>= 2              L  0 1m2 3 4 5 6 7    */
  136. /* OK at this point, mm0 = ABS(d), mm1 = ABS(q), mm2 = SGN(q), mm3 = SGN(-d) */
  137. movq      mm4, mm2               /* mm4 = SGN(q)           L  0 1 2r3 4w5 6 7    */
  138. pxor      mm4, mm3               /* mm4 = SGN(q) ^ SGN(-d) L  0 1 2 3r4m5 6 7    */
  139. movq      mm5, mm0               /* mm5 = ABS(d)           L  0r1 2 3 4 5w6 7    */
  140. pcmpgtw   mm5, mm1               /* is ABS(d) > ABS(q) ?   L  0 1r2 3 4 5m6 7    */
  141. pand      mm1, mm5               /* min() step 1           L  0m1 2 3 4 5r6 7    */
  142. pandn     mm5, mm0               /* min() step 2           L  0 1r2 3 4 5m6 7    */
  143. por       mm1, mm5               /* min() step 3           L  0m1 2 3 4 5r6 7    */
  144. pand      mm1, mm4               /* if signs differ, set 0 L  0m1 2 3 4r5 6 7    */
  145. pxor      mm1, mm2               /* Apply sign step 1      L  0m1 2r3 4 5 6 7    */
  146. psubw     mm1, mm2               /* Apply sign step 2      L  0m1 2r3 4 5 6 7    */
  147. pop ecx
  148. };
  149. if (i==0) {
  150. __asm {
  151. movq mm6, mm1
  152. };
  153. }
  154. }
  155. pmm1 = (uint64_t *)(&(v[4*stride])); 
  156. __asm {
  157. push ecx
  158. mov ecx, pmm1
  159. packsswb  mm6, mm1             
  160. movq      mm0, [ecx]                
  161. psubb     mm0, mm6               
  162. movq      [ecx], mm0                
  163. add       ecx, stride                    
  164. paddb     mm6, [ecx]                
  165. movq      [ecx], mm6                
  166. pop ecx
  167. };
  168. #ifdef PP_SELF_CHECK
  169. /* do selfcheck */
  170. for (x=0; x<8; x++) {
  171. for (y=0; y<2; y++) {
  172. if (selfcheck[x][y] != v[l4+x+y*stride]) {
  173. printf("ERROR: problem with vertical default filter in col %d, row %dn", x, y);
  174. printf("%d should be %dn", v[l4+x+y*stride], selfcheck[x][y]);
  175. }
  176. }
  177. }
  178. #endif
  179. }