hevcdsp_init_neon.c 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320
  1. /*
  2. * Copyright (c) 2014 Seppo Tomperi <seppo.tomperi@vtt.fi>
  3. *
  4. * This file is part of FFmpeg.
  5. *
  6. * FFmpeg is free software; you can redistribute it and/or
  7. * modify it under the terms of the GNU Lesser General Public
  8. * License as published by the Free Software Foundation; either
  9. * version 2.1 of the License, or (at your option) any later version.
  10. *
  11. * FFmpeg is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  14. * Lesser General Public License for more details.
  15. *
  16. * You should have received a copy of the GNU Lesser General Public
  17. * License along with FFmpeg; if not, write to the Free Software
  18. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  19. */
  20. #include "libavutil/attributes.h"
  21. #include "libavutil/arm/cpu.h"
  22. #include "libavcodec/hevcdsp.h"
  23. #include "libavcodec/avcodec.h"
  24. #include "hevcdsp_arm.h"
  25. void ff_hevc_sao_band_filter_neon_8_wrapper(uint8_t *_dst, uint8_t *_src,
  26. ptrdiff_t stride_dst, ptrdiff_t stride_src,
  27. int16_t *sao_offset_val, int sao_left_class,
  28. int width, int height);
  29. void ff_hevc_sao_edge_filter_neon_8_wrapper(uint8_t *_dst, uint8_t *_src, ptrdiff_t stride_dst, int16_t *sao_offset_val,
  30. int eo, int width, int height);
  31. void ff_hevc_v_loop_filter_luma_neon(uint8_t *_pix, ptrdiff_t _stride, int _beta, int *_tc, uint8_t *_no_p, uint8_t *_no_q);
  32. void ff_hevc_h_loop_filter_luma_neon(uint8_t *_pix, ptrdiff_t _stride, int _beta, int *_tc, uint8_t *_no_p, uint8_t *_no_q);
  33. void ff_hevc_v_loop_filter_chroma_neon(uint8_t *_pix, ptrdiff_t _stride, int *_tc, uint8_t *_no_p, uint8_t *_no_q);
  34. void ff_hevc_h_loop_filter_chroma_neon(uint8_t *_pix, ptrdiff_t _stride, int *_tc, uint8_t *_no_p, uint8_t *_no_q);
  35. void ff_hevc_add_residual_4x4_8_neon(uint8_t *_dst, int16_t *coeffs,
  36. ptrdiff_t stride);
  37. void ff_hevc_add_residual_4x4_10_neon(uint8_t *_dst, int16_t *coeffs,
  38. ptrdiff_t stride);
  39. void ff_hevc_add_residual_8x8_8_neon(uint8_t *_dst, int16_t *coeffs,
  40. ptrdiff_t stride);
  41. void ff_hevc_add_residual_8x8_10_neon(uint8_t *_dst, int16_t *coeffs,
  42. ptrdiff_t stride);
  43. void ff_hevc_add_residual_16x16_8_neon(uint8_t *_dst, int16_t *coeffs,
  44. ptrdiff_t stride);
  45. void ff_hevc_add_residual_16x16_10_neon(uint8_t *_dst, int16_t *coeffs,
  46. ptrdiff_t stride);
  47. void ff_hevc_add_residual_32x32_8_neon(uint8_t *_dst, int16_t *coeffs,
  48. ptrdiff_t stride);
  49. void ff_hevc_add_residual_32x32_10_neon(uint8_t *_dst, int16_t *coeffs,
  50. ptrdiff_t stride);
  51. void ff_hevc_idct_4x4_dc_8_neon(int16_t *coeffs);
  52. void ff_hevc_idct_8x8_dc_8_neon(int16_t *coeffs);
  53. void ff_hevc_idct_16x16_dc_8_neon(int16_t *coeffs);
  54. void ff_hevc_idct_32x32_dc_8_neon(int16_t *coeffs);
  55. void ff_hevc_idct_4x4_dc_10_neon(int16_t *coeffs);
  56. void ff_hevc_idct_8x8_dc_10_neon(int16_t *coeffs);
  57. void ff_hevc_idct_16x16_dc_10_neon(int16_t *coeffs);
  58. void ff_hevc_idct_32x32_dc_10_neon(int16_t *coeffs);
  59. void ff_hevc_idct_4x4_8_neon(int16_t *coeffs, int col_limit);
  60. void ff_hevc_idct_8x8_8_neon(int16_t *coeffs, int col_limit);
  61. void ff_hevc_idct_16x16_8_neon(int16_t *coeffs, int col_limit);
  62. void ff_hevc_idct_32x32_8_neon(int16_t *coeffs, int col_limit);
  63. void ff_hevc_idct_4x4_10_neon(int16_t *coeffs, int col_limit);
  64. void ff_hevc_idct_8x8_10_neon(int16_t *coeffs, int col_limit);
  65. void ff_hevc_idct_16x16_10_neon(int16_t *coeffs, int col_limit);
  66. void ff_hevc_idct_32x32_10_neon(int16_t *coeffs, int col_limit);
  67. void ff_hevc_transform_luma_4x4_neon_8(int16_t *coeffs);
  68. #define PUT_PIXELS(name) \
  69. void name(int16_t *dst, uint8_t *src, \
  70. ptrdiff_t srcstride, int height, \
  71. intptr_t mx, intptr_t my, int width)
  72. PUT_PIXELS(ff_hevc_put_pixels_w2_neon_8);
  73. PUT_PIXELS(ff_hevc_put_pixels_w4_neon_8);
  74. PUT_PIXELS(ff_hevc_put_pixels_w6_neon_8);
  75. PUT_PIXELS(ff_hevc_put_pixels_w8_neon_8);
  76. PUT_PIXELS(ff_hevc_put_pixels_w12_neon_8);
  77. PUT_PIXELS(ff_hevc_put_pixels_w16_neon_8);
  78. PUT_PIXELS(ff_hevc_put_pixels_w24_neon_8);
  79. PUT_PIXELS(ff_hevc_put_pixels_w32_neon_8);
  80. PUT_PIXELS(ff_hevc_put_pixels_w48_neon_8);
  81. PUT_PIXELS(ff_hevc_put_pixels_w64_neon_8);
  82. #undef PUT_PIXELS
  83. static void (*put_hevc_qpel_neon[4][4])(int16_t *dst, ptrdiff_t dststride, uint8_t *src, ptrdiff_t srcstride,
  84. int height, int width);
  85. static void (*put_hevc_qpel_uw_neon[4][4])(uint8_t *dst, ptrdiff_t dststride, uint8_t *_src, ptrdiff_t _srcstride,
  86. int width, int height, int16_t* src2, ptrdiff_t src2stride);
  87. void ff_hevc_put_qpel_neon_wrapper(int16_t *dst, uint8_t *src, ptrdiff_t srcstride,
  88. int height, intptr_t mx, intptr_t my, int width);
  89. void ff_hevc_put_qpel_uni_neon_wrapper(uint8_t *dst, ptrdiff_t dststride, uint8_t *src, ptrdiff_t srcstride,
  90. int height, intptr_t mx, intptr_t my, int width);
  91. void ff_hevc_put_qpel_bi_neon_wrapper(uint8_t *dst, ptrdiff_t dststride, uint8_t *src, ptrdiff_t srcstride,
  92. int16_t *src2,
  93. int height, intptr_t mx, intptr_t my, int width);
  94. #define QPEL_FUNC(name) \
  95. void name(int16_t *dst, ptrdiff_t dststride, uint8_t *src, ptrdiff_t srcstride, \
  96. int height, int width)
  97. QPEL_FUNC(ff_hevc_put_qpel_v1_neon_8);
  98. QPEL_FUNC(ff_hevc_put_qpel_v2_neon_8);
  99. QPEL_FUNC(ff_hevc_put_qpel_v3_neon_8);
  100. QPEL_FUNC(ff_hevc_put_qpel_h1_neon_8);
  101. QPEL_FUNC(ff_hevc_put_qpel_h2_neon_8);
  102. QPEL_FUNC(ff_hevc_put_qpel_h3_neon_8);
  103. QPEL_FUNC(ff_hevc_put_qpel_h1v1_neon_8);
  104. QPEL_FUNC(ff_hevc_put_qpel_h1v2_neon_8);
  105. QPEL_FUNC(ff_hevc_put_qpel_h1v3_neon_8);
  106. QPEL_FUNC(ff_hevc_put_qpel_h2v1_neon_8);
  107. QPEL_FUNC(ff_hevc_put_qpel_h2v2_neon_8);
  108. QPEL_FUNC(ff_hevc_put_qpel_h2v3_neon_8);
  109. QPEL_FUNC(ff_hevc_put_qpel_h3v1_neon_8);
  110. QPEL_FUNC(ff_hevc_put_qpel_h3v2_neon_8);
  111. QPEL_FUNC(ff_hevc_put_qpel_h3v3_neon_8);
  112. #undef QPEL_FUNC
  113. #define QPEL_FUNC_UW_PIX(name) \
  114. void name(uint8_t *dst, ptrdiff_t dststride, uint8_t *_src, ptrdiff_t _srcstride, \
  115. int height, intptr_t mx, intptr_t my, int width);
  116. QPEL_FUNC_UW_PIX(ff_hevc_put_qpel_uw_pixels_w4_neon_8);
  117. QPEL_FUNC_UW_PIX(ff_hevc_put_qpel_uw_pixels_w8_neon_8);
  118. QPEL_FUNC_UW_PIX(ff_hevc_put_qpel_uw_pixels_w16_neon_8);
  119. QPEL_FUNC_UW_PIX(ff_hevc_put_qpel_uw_pixels_w24_neon_8);
  120. QPEL_FUNC_UW_PIX(ff_hevc_put_qpel_uw_pixels_w32_neon_8);
  121. QPEL_FUNC_UW_PIX(ff_hevc_put_qpel_uw_pixels_w48_neon_8);
  122. QPEL_FUNC_UW_PIX(ff_hevc_put_qpel_uw_pixels_w64_neon_8);
  123. #undef QPEL_FUNC_UW_PIX
  124. #define QPEL_FUNC_UW(name) \
  125. void name(uint8_t *dst, ptrdiff_t dststride, uint8_t *_src, ptrdiff_t _srcstride, \
  126. int width, int height, int16_t* src2, ptrdiff_t src2stride);
  127. QPEL_FUNC_UW(ff_hevc_put_qpel_uw_pixels_neon_8);
  128. QPEL_FUNC_UW(ff_hevc_put_qpel_uw_v1_neon_8);
  129. QPEL_FUNC_UW(ff_hevc_put_qpel_uw_v2_neon_8);
  130. QPEL_FUNC_UW(ff_hevc_put_qpel_uw_v3_neon_8);
  131. QPEL_FUNC_UW(ff_hevc_put_qpel_uw_h1_neon_8);
  132. QPEL_FUNC_UW(ff_hevc_put_qpel_uw_h2_neon_8);
  133. QPEL_FUNC_UW(ff_hevc_put_qpel_uw_h3_neon_8);
  134. QPEL_FUNC_UW(ff_hevc_put_qpel_uw_h1v1_neon_8);
  135. QPEL_FUNC_UW(ff_hevc_put_qpel_uw_h1v2_neon_8);
  136. QPEL_FUNC_UW(ff_hevc_put_qpel_uw_h1v3_neon_8);
  137. QPEL_FUNC_UW(ff_hevc_put_qpel_uw_h2v1_neon_8);
  138. QPEL_FUNC_UW(ff_hevc_put_qpel_uw_h2v2_neon_8);
  139. QPEL_FUNC_UW(ff_hevc_put_qpel_uw_h2v3_neon_8);
  140. QPEL_FUNC_UW(ff_hevc_put_qpel_uw_h3v1_neon_8);
  141. QPEL_FUNC_UW(ff_hevc_put_qpel_uw_h3v2_neon_8);
  142. QPEL_FUNC_UW(ff_hevc_put_qpel_uw_h3v3_neon_8);
  143. #undef QPEL_FUNC_UW
  144. void ff_hevc_sao_band_filter_neon_8(uint8_t *dst, uint8_t *src, ptrdiff_t stride_dst, ptrdiff_t stride_src, int width, int height, int16_t *offset_table);
  145. void ff_hevc_sao_band_filter_neon_8_wrapper(uint8_t *_dst, uint8_t *_src,
  146. ptrdiff_t stride_dst, ptrdiff_t stride_src,
  147. int16_t *sao_offset_val, int sao_left_class,
  148. int width, int height) {
  149. uint8_t *dst = _dst;
  150. uint8_t *src = _src;
  151. int16_t offset_table[32] = {0};
  152. int k;
  153. for (k = 0; k < 4; k++) {
  154. offset_table[(k + sao_left_class) & 31] = sao_offset_val[k + 1];
  155. }
  156. ff_hevc_sao_band_filter_neon_8(dst, src, stride_dst, stride_src, width, height, offset_table);
  157. }
  158. void ff_hevc_sao_edge_filter_neon_8(uint8_t *dst, uint8_t *src, ptrdiff_t stride_dst, ptrdiff_t stride_src, int width, int height,
  159. int a_stride, int b_stride, int16_t *sao_offset_val, uint8_t *edge_idx);
  160. void ff_hevc_sao_edge_filter_neon_8_wrapper(uint8_t *_dst, uint8_t *_src, ptrdiff_t stride_dst, int16_t *sao_offset_val,
  161. int eo, int width, int height) {
  162. static uint8_t edge_idx[] = { 1, 2, 0, 3, 4 };
  163. static const int8_t pos[4][2][2] = {
  164. { { -1, 0 }, { 1, 0 } }, // horizontal
  165. { { 0, -1 }, { 0, 1 } }, // vertical
  166. { { -1, -1 }, { 1, 1 } }, // 45 degree
  167. { { 1, -1 }, { -1, 1 } }, // 135 degree
  168. };
  169. uint8_t *dst = _dst;
  170. uint8_t *src = _src;
  171. int a_stride, b_stride;
  172. ptrdiff_t stride_src = (2*MAX_PB_SIZE + AV_INPUT_BUFFER_PADDING_SIZE);
  173. a_stride = pos[eo][0][0] + pos[eo][0][1] * stride_src;
  174. b_stride = pos[eo][1][0] + pos[eo][1][1] * stride_src;
  175. ff_hevc_sao_edge_filter_neon_8(dst, src, stride_dst, stride_src, width, height, a_stride, b_stride, sao_offset_val, edge_idx);
  176. }
  177. void ff_hevc_put_qpel_neon_wrapper(int16_t *dst, uint8_t *src, ptrdiff_t srcstride,
  178. int height, intptr_t mx, intptr_t my, int width) {
  179. put_hevc_qpel_neon[my][mx](dst, MAX_PB_SIZE, src, srcstride, height, width);
  180. }
  181. void ff_hevc_put_qpel_uni_neon_wrapper(uint8_t *dst, ptrdiff_t dststride, uint8_t *src, ptrdiff_t srcstride,
  182. int height, intptr_t mx, intptr_t my, int width) {
  183. put_hevc_qpel_uw_neon[my][mx](dst, dststride, src, srcstride, width, height, NULL, 0);
  184. }
  185. void ff_hevc_put_qpel_bi_neon_wrapper(uint8_t *dst, ptrdiff_t dststride, uint8_t *src, ptrdiff_t srcstride,
  186. int16_t *src2,
  187. int height, intptr_t mx, intptr_t my, int width) {
  188. put_hevc_qpel_uw_neon[my][mx](dst, dststride, src, srcstride, width, height, src2, MAX_PB_SIZE);
  189. }
  190. av_cold void ff_hevc_dsp_init_neon(HEVCDSPContext *c, const int bit_depth)
  191. {
  192. if (bit_depth == 8) {
  193. int x;
  194. c->hevc_v_loop_filter_luma = ff_hevc_v_loop_filter_luma_neon;
  195. c->hevc_h_loop_filter_luma = ff_hevc_h_loop_filter_luma_neon;
  196. c->hevc_v_loop_filter_chroma = ff_hevc_v_loop_filter_chroma_neon;
  197. c->hevc_h_loop_filter_chroma = ff_hevc_h_loop_filter_chroma_neon;
  198. c->sao_band_filter[0] = ff_hevc_sao_band_filter_neon_8_wrapper;
  199. c->sao_band_filter[1] = ff_hevc_sao_band_filter_neon_8_wrapper;
  200. c->sao_band_filter[2] = ff_hevc_sao_band_filter_neon_8_wrapper;
  201. c->sao_band_filter[3] = ff_hevc_sao_band_filter_neon_8_wrapper;
  202. c->sao_band_filter[4] = ff_hevc_sao_band_filter_neon_8_wrapper;
  203. c->sao_edge_filter[0] = ff_hevc_sao_edge_filter_neon_8_wrapper;
  204. c->sao_edge_filter[1] = ff_hevc_sao_edge_filter_neon_8_wrapper;
  205. c->sao_edge_filter[2] = ff_hevc_sao_edge_filter_neon_8_wrapper;
  206. c->sao_edge_filter[3] = ff_hevc_sao_edge_filter_neon_8_wrapper;
  207. c->sao_edge_filter[4] = ff_hevc_sao_edge_filter_neon_8_wrapper;
  208. c->add_residual[0] = ff_hevc_add_residual_4x4_8_neon;
  209. c->add_residual[1] = ff_hevc_add_residual_8x8_8_neon;
  210. c->add_residual[2] = ff_hevc_add_residual_16x16_8_neon;
  211. c->add_residual[3] = ff_hevc_add_residual_32x32_8_neon;
  212. c->idct_dc[0] = ff_hevc_idct_4x4_dc_8_neon;
  213. c->idct_dc[1] = ff_hevc_idct_8x8_dc_8_neon;
  214. c->idct_dc[2] = ff_hevc_idct_16x16_dc_8_neon;
  215. c->idct_dc[3] = ff_hevc_idct_32x32_dc_8_neon;
  216. c->idct[0] = ff_hevc_idct_4x4_8_neon;
  217. c->idct[1] = ff_hevc_idct_8x8_8_neon;
  218. c->idct[2] = ff_hevc_idct_16x16_8_neon;
  219. c->idct[3] = ff_hevc_idct_32x32_8_neon;
  220. c->transform_4x4_luma = ff_hevc_transform_luma_4x4_neon_8;
  221. put_hevc_qpel_neon[1][0] = ff_hevc_put_qpel_v1_neon_8;
  222. put_hevc_qpel_neon[2][0] = ff_hevc_put_qpel_v2_neon_8;
  223. put_hevc_qpel_neon[3][0] = ff_hevc_put_qpel_v3_neon_8;
  224. put_hevc_qpel_neon[0][1] = ff_hevc_put_qpel_h1_neon_8;
  225. put_hevc_qpel_neon[0][2] = ff_hevc_put_qpel_h2_neon_8;
  226. put_hevc_qpel_neon[0][3] = ff_hevc_put_qpel_h3_neon_8;
  227. put_hevc_qpel_neon[1][1] = ff_hevc_put_qpel_h1v1_neon_8;
  228. put_hevc_qpel_neon[1][2] = ff_hevc_put_qpel_h2v1_neon_8;
  229. put_hevc_qpel_neon[1][3] = ff_hevc_put_qpel_h3v1_neon_8;
  230. put_hevc_qpel_neon[2][1] = ff_hevc_put_qpel_h1v2_neon_8;
  231. put_hevc_qpel_neon[2][2] = ff_hevc_put_qpel_h2v2_neon_8;
  232. put_hevc_qpel_neon[2][3] = ff_hevc_put_qpel_h3v2_neon_8;
  233. put_hevc_qpel_neon[3][1] = ff_hevc_put_qpel_h1v3_neon_8;
  234. put_hevc_qpel_neon[3][2] = ff_hevc_put_qpel_h2v3_neon_8;
  235. put_hevc_qpel_neon[3][3] = ff_hevc_put_qpel_h3v3_neon_8;
  236. put_hevc_qpel_uw_neon[1][0] = ff_hevc_put_qpel_uw_v1_neon_8;
  237. put_hevc_qpel_uw_neon[2][0] = ff_hevc_put_qpel_uw_v2_neon_8;
  238. put_hevc_qpel_uw_neon[3][0] = ff_hevc_put_qpel_uw_v3_neon_8;
  239. put_hevc_qpel_uw_neon[0][1] = ff_hevc_put_qpel_uw_h1_neon_8;
  240. put_hevc_qpel_uw_neon[0][2] = ff_hevc_put_qpel_uw_h2_neon_8;
  241. put_hevc_qpel_uw_neon[0][3] = ff_hevc_put_qpel_uw_h3_neon_8;
  242. put_hevc_qpel_uw_neon[1][1] = ff_hevc_put_qpel_uw_h1v1_neon_8;
  243. put_hevc_qpel_uw_neon[1][2] = ff_hevc_put_qpel_uw_h2v1_neon_8;
  244. put_hevc_qpel_uw_neon[1][3] = ff_hevc_put_qpel_uw_h3v1_neon_8;
  245. put_hevc_qpel_uw_neon[2][1] = ff_hevc_put_qpel_uw_h1v2_neon_8;
  246. put_hevc_qpel_uw_neon[2][2] = ff_hevc_put_qpel_uw_h2v2_neon_8;
  247. put_hevc_qpel_uw_neon[2][3] = ff_hevc_put_qpel_uw_h3v2_neon_8;
  248. put_hevc_qpel_uw_neon[3][1] = ff_hevc_put_qpel_uw_h1v3_neon_8;
  249. put_hevc_qpel_uw_neon[3][2] = ff_hevc_put_qpel_uw_h2v3_neon_8;
  250. put_hevc_qpel_uw_neon[3][3] = ff_hevc_put_qpel_uw_h3v3_neon_8;
  251. for (x = 0; x < 10; x++) {
  252. c->put_hevc_qpel[x][1][0] = ff_hevc_put_qpel_neon_wrapper;
  253. c->put_hevc_qpel[x][0][1] = ff_hevc_put_qpel_neon_wrapper;
  254. c->put_hevc_qpel[x][1][1] = ff_hevc_put_qpel_neon_wrapper;
  255. c->put_hevc_qpel_uni[x][1][0] = ff_hevc_put_qpel_uni_neon_wrapper;
  256. c->put_hevc_qpel_uni[x][0][1] = ff_hevc_put_qpel_uni_neon_wrapper;
  257. c->put_hevc_qpel_uni[x][1][1] = ff_hevc_put_qpel_uni_neon_wrapper;
  258. c->put_hevc_qpel_bi[x][1][0] = ff_hevc_put_qpel_bi_neon_wrapper;
  259. c->put_hevc_qpel_bi[x][0][1] = ff_hevc_put_qpel_bi_neon_wrapper;
  260. c->put_hevc_qpel_bi[x][1][1] = ff_hevc_put_qpel_bi_neon_wrapper;
  261. }
  262. c->put_hevc_qpel[0][0][0] = ff_hevc_put_pixels_w2_neon_8;
  263. c->put_hevc_qpel[1][0][0] = ff_hevc_put_pixels_w4_neon_8;
  264. c->put_hevc_qpel[2][0][0] = ff_hevc_put_pixels_w6_neon_8;
  265. c->put_hevc_qpel[3][0][0] = ff_hevc_put_pixels_w8_neon_8;
  266. c->put_hevc_qpel[4][0][0] = ff_hevc_put_pixels_w12_neon_8;
  267. c->put_hevc_qpel[5][0][0] = ff_hevc_put_pixels_w16_neon_8;
  268. c->put_hevc_qpel[6][0][0] = ff_hevc_put_pixels_w24_neon_8;
  269. c->put_hevc_qpel[7][0][0] = ff_hevc_put_pixels_w32_neon_8;
  270. c->put_hevc_qpel[8][0][0] = ff_hevc_put_pixels_w48_neon_8;
  271. c->put_hevc_qpel[9][0][0] = ff_hevc_put_pixels_w64_neon_8;
  272. c->put_hevc_qpel_uni[1][0][0] = ff_hevc_put_qpel_uw_pixels_w4_neon_8;
  273. c->put_hevc_qpel_uni[3][0][0] = ff_hevc_put_qpel_uw_pixels_w8_neon_8;
  274. c->put_hevc_qpel_uni[5][0][0] = ff_hevc_put_qpel_uw_pixels_w16_neon_8;
  275. c->put_hevc_qpel_uni[6][0][0] = ff_hevc_put_qpel_uw_pixels_w24_neon_8;
  276. c->put_hevc_qpel_uni[7][0][0] = ff_hevc_put_qpel_uw_pixels_w32_neon_8;
  277. c->put_hevc_qpel_uni[8][0][0] = ff_hevc_put_qpel_uw_pixels_w48_neon_8;
  278. c->put_hevc_qpel_uni[9][0][0] = ff_hevc_put_qpel_uw_pixels_w64_neon_8;
  279. }
  280. if (bit_depth == 10) {
  281. c->add_residual[0] = ff_hevc_add_residual_4x4_10_neon;
  282. c->add_residual[1] = ff_hevc_add_residual_8x8_10_neon;
  283. c->add_residual[2] = ff_hevc_add_residual_16x16_10_neon;
  284. c->add_residual[3] = ff_hevc_add_residual_32x32_10_neon;
  285. c->idct_dc[0] = ff_hevc_idct_4x4_dc_10_neon;
  286. c->idct_dc[1] = ff_hevc_idct_8x8_dc_10_neon;
  287. c->idct_dc[2] = ff_hevc_idct_16x16_dc_10_neon;
  288. c->idct_dc[3] = ff_hevc_idct_32x32_dc_10_neon;
  289. c->idct[0] = ff_hevc_idct_4x4_10_neon;
  290. c->idct[1] = ff_hevc_idct_8x8_10_neon;
  291. c->idct[2] = ff_hevc_idct_16x16_10_neon;
  292. c->idct[3] = ff_hevc_idct_32x32_10_neon;
  293. }
  294. }