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

多媒体编程

开发平台:

Visual C++

  1. #include "postprocess_mmx.h"
  2. const static uint64_t mm64_0008 = 0x0008000800080008;
  3. const static uint64_t mm64_0101 = 0x0101010101010101;
  4. static uint64_t mm64_temp;
  5. const static uint64_t mm64_coefs[18] =  {
  6. 0x0001000200040006, /* p1 left */ 0x0000000000000001, /* v1 right */
  7. 0x0001000200020004, /* v1 left */ 0x0000000000010001, /* v2 right */
  8. 0x0002000200040002, /* v2 left */ 0x0000000100010002, /* v3 right */
  9. 0x0002000400020002, /* v3 left */ 0x0001000100020002, /* v4 right */
  10. 0x0004000200020001, /* v4 left */ 0x0001000200020004, /* v5 right */
  11. 0x0002000200010001, /* v5 left */ 0x0002000200040002, /* v6 right */
  12. 0x0002000100010000, /* v6 left */ 0x0002000400020002, /* v7 right */
  13. 0x0001000100000000, /* v7 left */ 0x0004000200020001, /* v8 right */
  14. 0x0001000000000000, /* v8 left */ 0x0006000400020001  /* p2 right */
  15. };
  16. static uint32_t mm32_p1p2;
  17. static uint8_t *pmm1;
  18. INLINE void deblock_horiz_lpf9(uint8_t *v, int stride, int QP) {
  19. int y, p1, p2;
  20. #ifdef PP_SELF_CHECK
  21. uint8_t selfcheck[9];
  22. int psum;
  23. uint8_t *vv; 
  24. int i;
  25. #endif
  26. for (y=0; y<4; y++) {
  27. p1 = (ABS(v[0+y*stride]-v[1+y*stride]) < QP ) ?  v[0+y*stride] : v[1+y*stride];
  28. p2 = (ABS(v[8+y*stride]-v[9+y*stride]) < QP ) ?  v[9+y*stride] : v[8+y*stride];
  29. mm32_p1p2 = 0x0101 * ((p2 << 16) + p1);
  30. #ifdef PP_SELF_CHECK
  31. vv = &(v[y*stride]);
  32. psum = p1 + p1 + p1 + vv[1] + vv[2] + vv[3] + vv[4] + 4;
  33. selfcheck[1] = (((psum + vv[1]) << 1) - (vv[4] - vv[5])) >> 4;
  34. psum += vv[5] - p1; 
  35. selfcheck[2] = (((psum + vv[2]) << 1) - (vv[5] - vv[6])) >> 4;
  36. psum += vv[6] - p1; 
  37. selfcheck[3] = (((psum + vv[3]) << 1) - (vv[6] - vv[7])) >> 4;
  38. psum += vv[7] - p1; 
  39. selfcheck[4] = (((psum + vv[4]) << 1) + p1 - vv[1] - (vv[7] - vv[8])) >> 4;
  40. psum += vv[8] - vv[1]; 
  41. selfcheck[5] = (((psum + vv[5]) << 1) + (vv[1] - vv[2]) - vv[8] + p2) >> 4;
  42. psum += p2 - vv[2]; 
  43. selfcheck[6] = (((psum + vv[6]) << 1) + (vv[2] - vv[3])) >> 4;
  44. psum += p2 - vv[3]; 
  45. selfcheck[7] = (((psum + vv[7]) << 1) + (vv[3] - vv[4])) >> 4;
  46. psum += p2 - vv[4]; 
  47. selfcheck[8] = (((psum + vv[8]) << 1) + (vv[4] - vv[5])) >> 4;
  48. #endif
  49. pmm1 = (&(v[y*stride-3]));  __asm {
  50. push eax
  51. push ebx
  52. mov eax, pmm1
  53. lea ebx, mm64_coefs
  54. #ifdef PREFETCH_ENABLE
  55. prefetcht0 32[ebx]                     
  56. #endif
  57. movd   mm0,   mm32_p1p2            
  58. punpcklbw mm0, mm0                 
  59. movq    mm2, qword ptr [eax]       
  60. pxor    mm7, mm7                   
  61. movq     mm6, mm64_0008            
  62. punpckhbw mm2, mm2                 
  63. movq     mm64_temp, mm0           
  64. punpcklbw mm0, mm7                 
  65. movq      mm5, mm6                 
  66. pmullw    mm0, [ebx]              
  67. movq      mm1, mm2                
  68. punpcklbw mm2, mm2                 
  69. punpckhbw mm1, mm1                
  70. #ifdef PREFETCH_ENABLE
  71. prefetcht0 32[ebx]                     
  72. #endif
  73. movq      mm3, mm2                
  74. punpcklbw mm2, mm7                
  75. punpckhbw mm3, mm7                
  76. paddw     mm6, mm0                
  77. movq      mm0, mm2                 
  78. pmullw    mm0, 8[ebx]             
  79. movq      mm4, mm3                 
  80. pmullw    mm2, 16[ebx]            
  81. pmullw    mm3, 32[ebx]            
  82. pmullw    mm4, 24[ebx]            
  83. paddw     mm5, mm0               
  84. paddw     mm6, mm2               
  85. movq      mm2, mm1                
  86. punpckhbw mm2, mm7                
  87. paddw     mm5, mm4               
  88. punpcklbw mm1, mm7               
  89. paddw     mm6, mm3                
  90. #ifdef PREFETCH_ENABLE
  91. prefetcht0 64[ebx]                   
  92. #endif
  93. movq      mm0, mm1                 
  94. pmullw    mm1, 48[ebx]            
  95. pmullw    mm0, 40[ebx]            
  96. movq      mm4, mm2               
  97. pmullw    mm2, 64[ebx]            
  98. paddw     mm6, mm1                
  99. pmullw    mm4, 56[ebx]            
  100. pxor      mm3, mm3               
  101. movq      mm1, 8[eax]             
  102. paddw     mm5, mm0                
  103. punpcklbw mm1, mm1                
  104. paddw     mm6, mm2                
  105. #ifdef PREFETCH_ENABLE
  106. prefetcht0 96[ebx]                   
  107. #endif
  108. movq      mm2, mm1                
  109. paddw     mm5, mm4               
  110. punpcklbw mm2, mm2               
  111. punpckhbw mm1, mm1                
  112. movq      mm3, mm2                
  113. punpcklbw mm2, mm7                
  114. punpckhbw mm3, mm7                
  115. movq      mm0, mm2                
  116. pmullw    mm0, 72[ebx]           
  117. movq      mm4, mm3                
  118. pmullw    mm2, 80[ebx]           
  119. pmullw    mm3, 96[ebx]            
  120. pmullw    mm4, 88[ebx]            
  121. paddw     mm5, mm0                
  122. paddw     mm6, mm2                
  123. movq      mm2, mm1                
  124. paddw     mm6, mm3                
  125. punpcklbw mm1, mm7                
  126. paddw     mm5, mm4                
  127. punpckhbw mm2, mm7                
  128. #ifdef PREFETCH_ENABLE
  129. prefetcht0 128[ebx]                  
  130. #endif
  131. movq      mm3, mm64_temp       
  132. movq      mm0, mm1                
  133. pmullw    mm0, 104[ebx]          
  134. movq      mm4, mm2                
  135. pmullw    mm1, 112[ebx]          
  136. punpckhbw mm3, mm7                
  137. pmullw    mm2, 128[ebx]         
  138. pmullw    mm4, 120[ebx]           
  139. paddw     mm5, mm0               
  140. pmullw    mm3, 136[ebx]           
  141. paddw     mm6, mm1               
  142. paddw     mm6, mm2                
  143. paddw     mm5, mm4                
  144. psrlw     mm6, 4                 
  145. paddw     mm5, mm3                
  146. psrlw     mm5, 4                 
  147. packuswb  mm6, mm5                
  148. movq      4[eax], mm6             
  149. pop ebx
  150. pop eax
  151. };
  152. #ifdef PP_SELF_CHECK
  153. for (i=1; i<=8; i++) {
  154. if (selfcheck[i] != v[i+y*stride]) {
  155. printf("ERROR: MMX version of horiz lpf9 is incorrect at %dn", i);
  156. }
  157. }
  158. #endif
  159. }
  160. }