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

多媒体编程

开发平台:

Visual C++

  1. #include "postprocess_mmx.h"
  2. INLINE void deblock_vert_choose_p1p2(uint8_t *v, int stride, uint64_t *p1p2, int QP) {
  3. uint64_t *pmm1, *pmm2;
  4. uint64_t mm_b_qp;
  5. #ifdef PP_SELF_CHECK
  6. int i;
  7. #endif
  8. ((uint32_t *)&mm_b_qp)[0] = 
  9. ((uint32_t *)&mm_b_qp)[1] = 0x01010101 * QP; 
  10. pmm1 = (uint64_t *)(&(v[0*stride]));
  11. pmm2 = (uint64_t *)(&(v[8*stride]));
  12. __asm {
  13. push eax
  14. push ebx
  15. push ecx
  16. mov eax, pmm1
  17. mov ebx, pmm2
  18. mov ecx, p1p2
  19. /* p1 */
  20. pxor     mm7, mm7             /* mm7 = 0                       */
  21. movq     mm0, [eax]          /* mm0 = *pmm1 = v[l0]           */
  22. movq     mm2, mm0             /* mm2 = mm0 = v[l0]             */
  23. add      eax, stride         /* pmm1 += stride                */
  24. movq     mm1, [eax]          /* mm1 = *pmm1 = v[l1]           */
  25. movq     mm3, mm1             /* mm3 = mm1 = v[l1]             */
  26. psubusb  mm0, mm1             /* mm0 -= mm1                    */
  27. psubusb  mm1, mm2             /* mm1 -= mm2                    */
  28. por      mm0, mm1             /* mm0 |= mm1                    */
  29. psubusb  mm0, mm_b_qp         /* mm0 -= QP                     */
  30. /* now a zero byte in mm0 indicates use v0 else use v1              */
  31. pcmpeqb  mm0, mm7             /* zero bytes to ff others to 00 */
  32. movq     mm1, mm0             /* make a copy of mm0            */
  33. /* now ff byte in mm0 indicates use v0 else use v1                  */
  34. pandn    mm0, mm3             /* mask v1 into 00 bytes in mm0  */
  35. pand     mm1, mm2             /* mask v0 into ff bytes in mm0  */
  36. por      mm0, mm1             /* mm0 |= mm1                    */
  37. movq     mm1, mm0             /* make a copy of mm0            */
  38. /* Now we have our result, p1, in mm0.  Next, unpack.               */
  39. punpcklbw mm0, mm7            /* low bytes to mm0              */
  40. punpckhbw mm1, mm7            /* high bytes to mm1             */
  41. /* Store p1 in memory                                               */
  42. movq     [ecx], mm0           /* low words to p1p2[0]          */
  43. movq     8[ecx], mm1          /* high words to p1p2[1]         */
  44. /* p2 */
  45. movq     mm1, [ebx]          /* mm1 = *pmm2 = v[l8]           */
  46. movq     mm3, mm1             /* mm3 = mm1 = v[l8]             */
  47. add      ebx, stride         /* pmm2 += stride                */
  48. movq     mm0, [ebx]          /* mm0 = *pmm2 = v[l9]           */
  49. movq     mm2, mm0             /* mm2 = mm0 = v[l9]             */
  50. psubusb  mm0, mm1             /* mm0 -= mm1                    */
  51. psubusb  mm1, mm2             /* mm1 -= mm2                    */
  52. por      mm0, mm1             /* mm0 |= mm1                    */
  53. psubusb  mm0, mm_b_qp         /* mm0 -= QP                     */
  54. /* now a zero byte in mm0 indicates use v0 else use v1              */
  55. pcmpeqb  mm0, mm7             /* zero bytes to ff others to 00 */
  56. movq     mm1, mm0             /* make a copy of mm0            */
  57. /* now ff byte in mm0 indicates use v0 else use v1                  */
  58. pandn    mm0, mm3             /* mask v1 into 00 bytes in mm0  */
  59. pand     mm1, mm2             /* mask v0 into ff bytes in mm0  */
  60. por      mm0, mm1             /* mm0 |= mm1                    */
  61. movq     mm1, mm0             /* make a copy of mm0            */
  62. /* Now we have our result, p2, in mm0.  Next, unpack.               */
  63. punpcklbw mm0, mm7            /* low bytes to mm0              */
  64. punpckhbw mm1, mm7            /* high bytes to mm1             */
  65. /* Store p2 in memory                                               */
  66. movq     16[ecx], mm0         /* low words to p1p2[2]          */
  67. movq     24[ecx], mm1         /* high words to p1p2[3]         */
  68. pop ecx
  69. pop ebx
  70. pop eax
  71. };
  72. #ifdef PP_SELF_CHECK
  73. for (i=0; i<8; i++) {
  74. if ( ((ABS(v[9*stride+i] - v[8*stride+i]) - QP > 0) ? v[8*stride+i] : v[9*stride+i])
  75.      != ((uint16_t *)(&(p1p2[2])))[i] ) {
  76.  printf("ERROR: problem with P2n");
  77. }
  78. }
  79. for (i=0; i<8; i++) {
  80. if ( ((ABS(v[0*stride+i] - v[1*stride+i]) - QP > 0) ? v[1*stride+i] : v[0*stride+i])
  81.      != ((uint16_t *)(&(p1p2[0])))[i] ) {
  82.  printf("ERROR: problem with P1n");
  83. }
  84. }
  85. #endif
  86. }