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

多媒体编程

开发平台:

Visual C++

  1. #include "postprocess_mmx.h"
  2. #ifdef PP_COMPONENTS_INLINE
  3.  #ifndef INLINE
  4.  #define INLINE static __inline
  5.  #endif
  6.  #include "deblock_vert_DC_on.c"
  7.  #include "deblock_vert_choose_p1p2.c"
  8.  #include "deblock_vert_copy_and_unpack.c"
  9.  #include "deblock_vert_default_filter.c"
  10.  #include "deblock_vert_lpf9.c"
  11.  #include "deblock_vert_useDC.c"
  12. #endif
  13. void deblock_vert( uint8_t *image, int width, int stride, QP_STORE_T *QP_store, int QP_stride, int chromaFlag) {
  14. uint64_t v_local[20];
  15. uint64_t p1p2[4];
  16. int Bx, x, y;
  17. int QP, QPx16;
  18. uint8_t *v;
  19. int useDC, DC_on;
  20. #ifdef PREFETCH_AHEAD_V
  21. void *prefetch_addr;
  22. #endif
  23. y = 0;
  24. for (Bx=0; Bx<width; Bx+=8) {
  25. QP = chromaFlag ? QP_store[y/8*QP_stride+Bx/8]
  26.                 : QP_store[y/16*QP_stride+Bx/16];
  27. QPx16 = 16 * QP;
  28. v = &(image[y*stride + Bx]) - 5*stride;
  29. #ifdef PREFETCH_AHEAD_V
  30. prefetch_addr = v + PREFETCH_AHEAD_V;
  31. __asm {
  32. push eax
  33. push ebx
  34. mov eax, prefetch_addr
  35. mov ebx, stride
  36. add      eax , ebx        /* prefetch_addr+= stride */
  37. prefetcht0 [eax]           
  38. add      eax , ebx        /* prefetch_addr+= stride */
  39. prefetcht0 [eax]           
  40. add      eax , ebx        /* prefetch_addr+= stride */
  41. prefetcht0 [eax]           
  42. add      eax , ebx        /* prefetch_addr+= stride */
  43. prefetcht0 [eax]           
  44. add      eax , ebx        /* prefetch_addr+= stride */
  45. prefetcht0 [eax]           
  46. add      eax , ebx        /* prefetch_addr+= stride */
  47. prefetcht0 [eax]           
  48. add      eax , ebx        /* prefetch_addr+= stride */
  49. prefetcht0 [eax]           
  50. add      eax , ebx        /* prefetch_addr+= stride */
  51. prefetcht0 [eax]           
  52. pop ebx
  53. pop eax
  54. };
  55. #endif
  56. useDC = deblock_vert_useDC(v, stride);
  57. if (useDC) {
  58.   DC_on = deblock_vert_DC_on(v, stride, QP);
  59. if (DC_on) { 
  60. v = &(image[y*stride + Bx])- 5*stride;
  61. deblock_vert_copy_and_unpack(stride, &(v[stride]), &(v_local[2]), 8);
  62. deblock_vert_choose_p1p2(v, stride, p1p2, QP);
  63. deblock_vert_lpf9(v_local, p1p2, v, stride); 
  64. #ifdef SHOWDECISIONS_V
  65. if (!chromaFlag) {
  66. v[4*stride  ] = 
  67. v[4*stride+1] = 
  68. v[4*stride+2] = 
  69. v[4*stride+3] = 
  70. v[4*stride+4] = 
  71. v[4*stride+5] = 
  72. v[4*stride+6] = 
  73. v[4*stride+7] = 255;
  74. }  
  75. #endif
  76. }
  77. }
  78. if (!useDC) { 
  79. x = Bx;
  80. v = &(image[y*stride + x])- 5*stride;
  81. deblock_vert_default_filter(v, stride, QP);
  82. #ifdef SHOWDECISIONS_V
  83. if (!chromaFlag) {
  84. v[4*stride  ] = 
  85. v[4*stride+1] = 
  86. v[4*stride+2] = 
  87. v[4*stride+3] = 
  88. v[4*stride+4] = 
  89. v[4*stride+5] = 
  90. v[4*stride+6] = 
  91. v[4*stride+7] = 0;
  92. }  
  93. #endif
  94. }
  95. __asm { 
  96. emms
  97. };
  98. }