deblock_vert_DC_on.c
上传用户:hxb_1234
上传日期:2010-03-30
资源大小:8328k
文件大小:1k
源码类别:

VC书籍

开发平台:

Visual C++

  1. #include "postprocess_mmx.h"
  2. INLINE int deblock_vert_DC_on(uint8_t *v, int stride, int QP) {
  3. uint64_t QP_x_2;
  4. uint8_t *ptr1;
  5. uint8_t *ptr2;
  6. int DC_on;
  7. #ifdef PP_SELF_CHECK
  8. int i, DC_on2;
  9. #endif
  10. ptr1 = &(v[1*stride]);
  11. ptr2 = &(v[8*stride]);
  12. #ifdef PP_SELF_CHECK
  13. DC_on2 = 1;
  14. for (i=0; i<8; i++) {
  15. if (ABS(v[i+1*stride]-v[i+8*stride]) > 2 *QP) DC_on2 = 0;
  16. }
  17. #endif
  18. ((uint32_t *)(&QP_x_2))[0] =
  19. ((uint32_t *)(&QP_x_2))[1] = 0x02020202 * QP; 
  20. __asm {
  21. push eax
  22. push ebx
  23. mov eax, ptr1
  24. mov ebx, ptr2
  25. movq     mm0, [eax]               /* mm0 = v[l1]                   */
  26. movq     mm1, mm0                 /* mm1 = v[l1]                   */
  27. movq     mm2, [ebx]               /* mm2 = v[l8]                   */
  28. psubusb  mm0, mm2                 /* mm0 -= mm2                    */
  29. psubusb  mm2, mm1                 /* mm2 -= mm1                    */
  30. por      mm0, mm2                 /* mm0 |= mm2                    */
  31. psubusb  mm0, QP_x_2              /* mm0 -= 2 * QP                 */
  32. movq     mm1, mm0                 /* mm1 = mm0                     */
  33. psrlq    mm0, 32                  /* shift mm0 right 32 bits       */
  34. por      mm0, mm1                 /*                               */
  35. movd     DC_on, mm0             
  36. pop ebx
  37. pop eax
  38. };
  39. DC_on = !DC_on; 
  40. #ifdef PP_SELF_CHECK
  41. if (DC_on != DC_on2) {
  42. printf("ERROR: MMX version of DC_on is incorrectn");
  43. }
  44. #endif
  45. return DC_on;
  46. }