interpolate8x8.h
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:2k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. #include "../utils/mem_transfer.h"
  2. typedef void (INTERPOLATE8X8)(uint8_t * const dst,
  3. const uint8_t * const src,
  4. const uint32_t stride,
  5. const uint32_t rounding);
  6. typedef INTERPOLATE8X8 * INTERPOLATE8X8_PTR;
  7. extern INTERPOLATE8X8_PTR interpolate8x8_halfpel_h;
  8. extern INTERPOLATE8X8_PTR interpolate8x8_halfpel_v;
  9. extern INTERPOLATE8X8_PTR interpolate8x8_halfpel_hv;
  10. INTERPOLATE8X8 interpolate8x8_halfpel_h_c;
  11. INTERPOLATE8X8 interpolate8x8_halfpel_v_c;
  12. INTERPOLATE8X8 interpolate8x8_halfpel_hv_c;
  13. INTERPOLATE8X8 interpolate8x8_halfpel_h_mmx;
  14. INTERPOLATE8X8 interpolate8x8_halfpel_v_mmx;
  15. INTERPOLATE8X8 interpolate8x8_halfpel_hv_mmx;
  16. INTERPOLATE8X8 interpolate8x8_halfpel_h_xmm;
  17. INTERPOLATE8X8 interpolate8x8_halfpel_v_xmm;
  18. INTERPOLATE8X8 interpolate8x8_halfpel_hv_xmm;
  19. INTERPOLATE8X8 interpolate8x8_halfpel_h_3dn;
  20. INTERPOLATE8X8 interpolate8x8_halfpel_v_3dn;
  21. INTERPOLATE8X8 interpolate8x8_halfpel_hv_3dn;
  22. static __inline void interpolate8x8_switch(uint8_t * const cur,
  23.      const uint8_t * const refn,
  24.      const uint32_t x, const uint32_t y,
  25.  const int32_t dx,  const int dy,
  26.  const uint32_t stride,
  27.  const uint32_t rounding)
  28. {
  29. int32_t ddx, ddy;
  30. switch ( ((dx&1)<<1) + (dy&1) )   // ((dx%2)?2:0)+((dy%2)?1:0)
  31.     {
  32.     case 0 :
  33. ddx = dx/2;
  34. ddy = dy/2;
  35. transfer8x8_copy(cur + y*stride + x, refn + (y+ddy)*stride + x + ddx, stride);
  36. break;
  37.     case 1 :
  38. ddx = dx/2;
  39. ddy = (dy-1)/2;
  40. interpolate8x8_halfpel_v(cur + y*stride + x, 
  41. refn + (y+ddy)*stride + x + ddx, stride, rounding);
  42. break;
  43.     case 2 :
  44. ddx = (dx-1)/2;
  45. ddy = dy/2;
  46. interpolate8x8_halfpel_h(cur + y*stride + x,
  47. refn + (y+ddy)*stride + x + ddx, stride, rounding);
  48. break;
  49.     default :
  50. ddx = (dx-1)/2;
  51. ddy = (dy-1)/2;
  52. interpolate8x8_halfpel_hv(cur + y*stride + x,
  53. refn + (y+ddy)*stride + x + ddx, stride, rounding);
  54. break;
  55.     }
  56. }