You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

176 lines
6.0KB

  1. /*
  2. * Copyright (c) 2000, 2001 Fabrice Bellard
  3. * Copyright (c) 2002-2004 Michael Niedermayer <michaelni@gmx.at>
  4. *
  5. * This file is part of Libav.
  6. *
  7. * Libav is free software; you can redistribute it and/or
  8. * modify it under the terms of the GNU Lesser General Public
  9. * License as published by the Free Software Foundation; either
  10. * version 2.1 of the License, or (at your option) any later version.
  11. *
  12. * Libav is distributed in the hope that it will be useful,
  13. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  15. * Lesser General Public License for more details.
  16. *
  17. * You should have received a copy of the GNU Lesser General Public
  18. * License along with Libav; if not, write to the Free Software
  19. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  20. */
  21. #include <assert.h>
  22. #include <stddef.h>
  23. #include "bit_depth_template.c"
  24. #define H264_CHROMA_MC(OPNAME, OP)\
  25. static void FUNCC(OPNAME ## h264_chroma_mc2)(uint8_t *_dst /*align 8*/, uint8_t *_src /*align 1*/, ptrdiff_t stride, int h, int x, int y)\
  26. {\
  27. pixel *dst = (pixel*)_dst;\
  28. pixel *src = (pixel*)_src;\
  29. const int A=(8-x)*(8-y);\
  30. const int B=( x)*(8-y);\
  31. const int C=(8-x)*( y);\
  32. const int D=( x)*( y);\
  33. int i;\
  34. stride /= sizeof(pixel);\
  35. \
  36. assert(x<8 && y<8 && x>=0 && y>=0);\
  37. \
  38. if(D){\
  39. for(i=0; i<h; i++){\
  40. OP(dst[0], (A*src[0] + B*src[1] + C*src[stride+0] + D*src[stride+1]));\
  41. OP(dst[1], (A*src[1] + B*src[2] + C*src[stride+1] + D*src[stride+2]));\
  42. dst+= stride;\
  43. src+= stride;\
  44. }\
  45. } else if (B + C) {\
  46. const int E= B+C;\
  47. const ptrdiff_t step = C ? stride : 1;\
  48. for(i=0; i<h; i++){\
  49. OP(dst[0], (A*src[0] + E*src[step+0]));\
  50. OP(dst[1], (A*src[1] + E*src[step+1]));\
  51. dst+= stride;\
  52. src+= stride;\
  53. }\
  54. } else {\
  55. for ( i = 0; i < h; i++){\
  56. OP(dst[0], A * src[0]);\
  57. OP(dst[1], A * src[1]);\
  58. dst += stride;\
  59. src += stride;\
  60. }\
  61. }\
  62. }\
  63. \
  64. static void FUNCC(OPNAME ## h264_chroma_mc4)(uint8_t *_dst /*align 8*/, uint8_t *_src /*align 1*/, ptrdiff_t stride, int h, int x, int y)\
  65. {\
  66. pixel *dst = (pixel*)_dst;\
  67. pixel *src = (pixel*)_src;\
  68. const int A=(8-x)*(8-y);\
  69. const int B=( x)*(8-y);\
  70. const int C=(8-x)*( y);\
  71. const int D=( x)*( y);\
  72. int i;\
  73. stride /= sizeof(pixel);\
  74. \
  75. assert(x<8 && y<8 && x>=0 && y>=0);\
  76. \
  77. if(D){\
  78. for(i=0; i<h; i++){\
  79. OP(dst[0], (A*src[0] + B*src[1] + C*src[stride+0] + D*src[stride+1]));\
  80. OP(dst[1], (A*src[1] + B*src[2] + C*src[stride+1] + D*src[stride+2]));\
  81. OP(dst[2], (A*src[2] + B*src[3] + C*src[stride+2] + D*src[stride+3]));\
  82. OP(dst[3], (A*src[3] + B*src[4] + C*src[stride+3] + D*src[stride+4]));\
  83. dst+= stride;\
  84. src+= stride;\
  85. }\
  86. } else if (B + C) {\
  87. const int E= B+C;\
  88. const ptrdiff_t step = C ? stride : 1;\
  89. for(i=0; i<h; i++){\
  90. OP(dst[0], (A*src[0] + E*src[step+0]));\
  91. OP(dst[1], (A*src[1] + E*src[step+1]));\
  92. OP(dst[2], (A*src[2] + E*src[step+2]));\
  93. OP(dst[3], (A*src[3] + E*src[step+3]));\
  94. dst+= stride;\
  95. src+= stride;\
  96. }\
  97. } else {\
  98. for ( i = 0; i < h; i++){\
  99. OP(dst[0], A * src[0]);\
  100. OP(dst[1], A * src[1]);\
  101. OP(dst[2], A * src[2]);\
  102. OP(dst[3], A * src[3]);\
  103. dst += stride;\
  104. src += stride;\
  105. }\
  106. }\
  107. }\
  108. \
  109. static void FUNCC(OPNAME ## h264_chroma_mc8)(uint8_t *_dst /*align 8*/, uint8_t *_src /*align 1*/, ptrdiff_t stride, int h, int x, int y)\
  110. {\
  111. pixel *dst = (pixel*)_dst;\
  112. pixel *src = (pixel*)_src;\
  113. const int A=(8-x)*(8-y);\
  114. const int B=( x)*(8-y);\
  115. const int C=(8-x)*( y);\
  116. const int D=( x)*( y);\
  117. int i;\
  118. stride /= sizeof(pixel);\
  119. \
  120. assert(x<8 && y<8 && x>=0 && y>=0);\
  121. \
  122. if(D){\
  123. for(i=0; i<h; i++){\
  124. OP(dst[0], (A*src[0] + B*src[1] + C*src[stride+0] + D*src[stride+1]));\
  125. OP(dst[1], (A*src[1] + B*src[2] + C*src[stride+1] + D*src[stride+2]));\
  126. OP(dst[2], (A*src[2] + B*src[3] + C*src[stride+2] + D*src[stride+3]));\
  127. OP(dst[3], (A*src[3] + B*src[4] + C*src[stride+3] + D*src[stride+4]));\
  128. OP(dst[4], (A*src[4] + B*src[5] + C*src[stride+4] + D*src[stride+5]));\
  129. OP(dst[5], (A*src[5] + B*src[6] + C*src[stride+5] + D*src[stride+6]));\
  130. OP(dst[6], (A*src[6] + B*src[7] + C*src[stride+6] + D*src[stride+7]));\
  131. OP(dst[7], (A*src[7] + B*src[8] + C*src[stride+7] + D*src[stride+8]));\
  132. dst+= stride;\
  133. src+= stride;\
  134. }\
  135. } else if (B + C) {\
  136. const int E= B+C;\
  137. const ptrdiff_t step = C ? stride : 1;\
  138. for(i=0; i<h; i++){\
  139. OP(dst[0], (A*src[0] + E*src[step+0]));\
  140. OP(dst[1], (A*src[1] + E*src[step+1]));\
  141. OP(dst[2], (A*src[2] + E*src[step+2]));\
  142. OP(dst[3], (A*src[3] + E*src[step+3]));\
  143. OP(dst[4], (A*src[4] + E*src[step+4]));\
  144. OP(dst[5], (A*src[5] + E*src[step+5]));\
  145. OP(dst[6], (A*src[6] + E*src[step+6]));\
  146. OP(dst[7], (A*src[7] + E*src[step+7]));\
  147. dst+= stride;\
  148. src+= stride;\
  149. }\
  150. } else {\
  151. for ( i = 0; i < h; i++){\
  152. OP(dst[0], A * src[0]);\
  153. OP(dst[1], A * src[1]);\
  154. OP(dst[2], A * src[2]);\
  155. OP(dst[3], A * src[3]);\
  156. OP(dst[4], A * src[4]);\
  157. OP(dst[5], A * src[5]);\
  158. OP(dst[6], A * src[6]);\
  159. OP(dst[7], A * src[7]);\
  160. dst += stride;\
  161. src += stride;\
  162. }\
  163. }\
  164. }
  165. #define op_avg(a, b) a = (((a)+(((b) + 32)>>6)+1)>>1)
  166. #define op_put(a, b) a = (((b) + 32)>>6)
  167. H264_CHROMA_MC(put_ , op_put)
  168. H264_CHROMA_MC(avg_ , op_avg)
  169. #undef op_avg
  170. #undef op_put