FFmpeg
Loading...
Searching...
No Matches
hevcdsp_init_aarch64.c
Go to the documentation of this file.
1/*
2 * Copyright (c) 2020 Reimar Döffinger
3 * Copyright (c) 2023 xu fulong <839789740@qq.com>
4 *
5 * This file is part of FFmpeg.
6 *
7 * FFmpeg 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 * FFmpeg 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 FFmpeg; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20 */
21
22#include <stdint.h>
23
25#include "libavutil/avassert.h"
26#include "libavutil/cpu.h"
29#include "libavcodec/hevc/dsp.h"
30
31void ff_hevc_v_loop_filter_chroma_8_neon(uint8_t *_pix, ptrdiff_t _stride,
32 const int *_tc, const uint8_t *_no_p, const uint8_t *_no_q);
33void ff_hevc_v_loop_filter_chroma_10_neon(uint8_t *_pix, ptrdiff_t _stride,
34 const int *_tc, const uint8_t *_no_p, const uint8_t *_no_q);
35void ff_hevc_v_loop_filter_chroma_12_neon(uint8_t *_pix, ptrdiff_t _stride,
36 const int *_tc, const uint8_t *_no_p, const uint8_t *_no_q);
37void ff_hevc_h_loop_filter_chroma_8_neon(uint8_t *_pix, ptrdiff_t _stride,
38 const int *_tc, const uint8_t *_no_p, const uint8_t *_no_q);
39void ff_hevc_h_loop_filter_chroma_10_neon(uint8_t *_pix, ptrdiff_t _stride,
40 const int *_tc, const uint8_t *_no_p, const uint8_t *_no_q);
41void ff_hevc_h_loop_filter_chroma_12_neon(uint8_t *_pix, ptrdiff_t _stride,
42 const int *_tc, const uint8_t *_no_p, const uint8_t *_no_q);
43void ff_hevc_v_loop_filter_luma_8_neon(uint8_t *_pix, ptrdiff_t _stride, int beta,
44 const int *_tc, const uint8_t *_no_p, const uint8_t *_no_q);
45void ff_hevc_v_loop_filter_luma_10_neon(uint8_t *_pix, ptrdiff_t _stride, int beta,
46 const int *_tc, const uint8_t *_no_p, const uint8_t *_no_q);
47void ff_hevc_v_loop_filter_luma_12_neon(uint8_t *_pix, ptrdiff_t _stride, int beta,
48 const int *_tc, const uint8_t *_no_p, const uint8_t *_no_q);
49void ff_hevc_h_loop_filter_luma_8_neon(uint8_t *_pix, ptrdiff_t _stride, int beta,
50 const int *_tc, const uint8_t *_no_p, const uint8_t *_no_q);
51void ff_hevc_h_loop_filter_luma_10_neon(uint8_t *_pix, ptrdiff_t _stride, int beta,
52 const int *_tc, const uint8_t *_no_p, const uint8_t *_no_q);
53void ff_hevc_h_loop_filter_luma_12_neon(uint8_t *_pix, ptrdiff_t _stride, int beta,
54 const int *_tc, const uint8_t *_no_p, const uint8_t *_no_q);
55void ff_hevc_add_residual_4x4_8_neon(uint8_t *_dst, const int16_t *coeffs,
56 ptrdiff_t stride);
57void ff_hevc_add_residual_4x4_10_neon(uint8_t *_dst, const int16_t *coeffs,
58 ptrdiff_t stride);
59void ff_hevc_add_residual_4x4_12_neon(uint8_t *_dst, const int16_t *coeffs,
60 ptrdiff_t stride);
61void ff_hevc_add_residual_8x8_8_neon(uint8_t *_dst, const int16_t *coeffs,
62 ptrdiff_t stride);
63void ff_hevc_add_residual_8x8_10_neon(uint8_t *_dst, const int16_t *coeffs,
64 ptrdiff_t stride);
65void ff_hevc_add_residual_8x8_12_neon(uint8_t *_dst, const int16_t *coeffs,
66 ptrdiff_t stride);
67void ff_hevc_add_residual_16x16_8_neon(uint8_t *_dst, const int16_t *coeffs,
68 ptrdiff_t stride);
69void ff_hevc_add_residual_16x16_10_neon(uint8_t *_dst, const int16_t *coeffs,
70 ptrdiff_t stride);
71void ff_hevc_add_residual_16x16_12_neon(uint8_t *_dst, const int16_t *coeffs,
72 ptrdiff_t stride);
73void ff_hevc_add_residual_32x32_8_neon(uint8_t *_dst, const int16_t *coeffs,
74 ptrdiff_t stride);
75void ff_hevc_add_residual_32x32_10_neon(uint8_t *_dst, const int16_t *coeffs,
76 ptrdiff_t stride);
77void ff_hevc_add_residual_32x32_12_neon(uint8_t *_dst, const int16_t *coeffs,
78 ptrdiff_t stride);
79void ff_hevc_idct_4x4_8_neon(int16_t *coeffs, int col_limit);
80void ff_hevc_idct_4x4_10_neon(int16_t *coeffs, int col_limit);
81void ff_hevc_idct_8x8_8_neon(int16_t *coeffs, int col_limit);
82void ff_hevc_idct_8x8_10_neon(int16_t *coeffs, int col_limit);
83void ff_hevc_idct_16x16_8_neon(int16_t *coeffs, int col_limit);
84void ff_hevc_idct_16x16_10_neon(int16_t *coeffs, int col_limit);
85void ff_hevc_idct_32x32_8_neon(int16_t *coeffs, int col_limit);
86void ff_hevc_idct_32x32_10_neon(int16_t *coeffs, int col_limit);
87void ff_hevc_idct_4x4_dc_8_neon(int16_t *coeffs);
88void ff_hevc_idct_8x8_dc_8_neon(int16_t *coeffs);
89void ff_hevc_idct_16x16_dc_8_neon(int16_t *coeffs);
90void ff_hevc_idct_32x32_dc_8_neon(int16_t *coeffs);
91void ff_hevc_idct_4x4_dc_10_neon(int16_t *coeffs);
92void ff_hevc_idct_8x8_dc_10_neon(int16_t *coeffs);
93void ff_hevc_idct_16x16_dc_10_neon(int16_t *coeffs);
94void ff_hevc_idct_32x32_dc_10_neon(int16_t *coeffs);
95void ff_hevc_idct_4x4_dc_12_neon(int16_t *coeffs);
96void ff_hevc_idct_8x8_dc_12_neon(int16_t *coeffs);
97void ff_hevc_idct_16x16_dc_12_neon(int16_t *coeffs);
98void ff_hevc_idct_32x32_dc_12_neon(int16_t *coeffs);
100
101void ff_hevc_dequant_4x4_8_neon(int16_t *coeffs);
102void ff_hevc_dequant_8x8_8_neon(int16_t *coeffs);
103void ff_hevc_dequant_16x16_8_neon(int16_t *coeffs);
104void ff_hevc_dequant_32x32_8_neon(int16_t *coeffs);
105
106void ff_hevc_dequant_4x4_10_neon(int16_t *coeffs);
107void ff_hevc_dequant_8x8_10_neon(int16_t *coeffs);
108void ff_hevc_dequant_16x16_10_neon(int16_t *coeffs);
109void ff_hevc_dequant_32x32_10_neon(int16_t *coeffs);
110
111void ff_hevc_dequant_4x4_12_neon(int16_t *coeffs);
112void ff_hevc_dequant_8x8_12_neon(int16_t *coeffs);
113void ff_hevc_dequant_16x16_12_neon(int16_t *coeffs);
114void ff_hevc_dequant_32x32_12_neon(int16_t *coeffs);
115
116static void hevc_dequant_8_neon(int16_t *coeffs, int16_t log2_size)
117{
118 switch (log2_size) {
119 case 2: ff_hevc_dequant_4x4_8_neon(coeffs); break;
120 case 3: ff_hevc_dequant_8x8_8_neon(coeffs); break;
121 case 4: ff_hevc_dequant_16x16_8_neon(coeffs); break;
122 case 5: ff_hevc_dequant_32x32_8_neon(coeffs); break;
123 default: av_unreachable("log2_size must be 2, 3, 4 or 5");
124 }
125}
126
127static void hevc_dequant_10_neon(int16_t *coeffs, int16_t log2_size)
128{
129 switch (log2_size) {
130 case 2: ff_hevc_dequant_4x4_10_neon(coeffs); break;
131 case 3: ff_hevc_dequant_8x8_10_neon(coeffs); break;
132 case 4: ff_hevc_dequant_16x16_10_neon(coeffs); break;
133 case 5: ff_hevc_dequant_32x32_10_neon(coeffs); break;
134 default: av_unreachable("log2_size must be 2, 3, 4 or 5");
135 }
136}
137
138static void hevc_dequant_12_neon(int16_t *coeffs, int16_t log2_size)
139{
140 switch (log2_size) {
141 case 2: ff_hevc_dequant_4x4_12_neon(coeffs); break;
142 case 3: ff_hevc_dequant_8x8_12_neon(coeffs); break;
143 case 4: ff_hevc_dequant_16x16_12_neon(coeffs); break;
144 case 5: ff_hevc_dequant_32x32_12_neon(coeffs); break;
145 default: av_unreachable("log2_size must be 2, 3, 4 or 5");
146 }
147}
148
149#define NEON8_FNASSIGN(member, v, h, fn, ext) \
150 member[1][v][h] = ff_hevc_put_hevc_##fn##4_8_neon##ext; \
151 member[2][v][h] = ff_hevc_put_hevc_##fn##6_8_neon##ext; \
152 member[3][v][h] = ff_hevc_put_hevc_##fn##8_8_neon##ext; \
153 member[4][v][h] = ff_hevc_put_hevc_##fn##12_8_neon##ext; \
154 member[5][v][h] = ff_hevc_put_hevc_##fn##16_8_neon##ext; \
155 member[6][v][h] = ff_hevc_put_hevc_##fn##24_8_neon##ext; \
156 member[7][v][h] = ff_hevc_put_hevc_##fn##32_8_neon##ext; \
157 member[8][v][h] = ff_hevc_put_hevc_##fn##48_8_neon##ext; \
158 member[9][v][h] = ff_hevc_put_hevc_##fn##64_8_neon##ext;
159
160#define NEON8_FNASSIGN_SHARED_32(member, v, h, fn, ext) \
161 member[1][v][h] = ff_hevc_put_hevc_##fn##4_8_neon##ext; \
162 member[2][v][h] = ff_hevc_put_hevc_##fn##6_8_neon##ext; \
163 member[3][v][h] = ff_hevc_put_hevc_##fn##8_8_neon##ext; \
164 member[4][v][h] = ff_hevc_put_hevc_##fn##12_8_neon##ext; \
165 member[5][v][h] = ff_hevc_put_hevc_##fn##16_8_neon##ext; \
166 member[6][v][h] = ff_hevc_put_hevc_##fn##24_8_neon##ext; \
167 member[7][v][h] = \
168 member[8][v][h] = \
169 member[9][v][h] = ff_hevc_put_hevc_##fn##32_8_neon##ext;
170
171#define NEON8_FNASSIGN_PARTIAL_4(member, v, h, fn, ext) \
172 member[1][v][h] = ff_hevc_put_hevc_##fn##4_8_neon##ext; \
173 member[3][v][h] = ff_hevc_put_hevc_##fn##8_8_neon##ext; \
174 member[5][v][h] = ff_hevc_put_hevc_##fn##16_8_neon##ext; \
175 member[7][v][h] = ff_hevc_put_hevc_##fn##64_8_neon##ext; \
176 member[8][v][h] = ff_hevc_put_hevc_##fn##64_8_neon##ext; \
177 member[9][v][h] = ff_hevc_put_hevc_##fn##64_8_neon##ext;
178
179#define NEON8_FNASSIGN_PARTIAL_5(member, v, h, fn, ext) \
180 member[1][v][h] = ff_hevc_put_hevc_##fn##4_8_neon##ext; \
181 member[3][v][h] = ff_hevc_put_hevc_##fn##8_8_neon##ext; \
182 member[5][v][h] = ff_hevc_put_hevc_##fn##16_8_neon##ext; \
183 member[7][v][h] = ff_hevc_put_hevc_##fn##32_8_neon##ext; \
184 member[9][v][h] = ff_hevc_put_hevc_##fn##64_8_neon##ext;
185
186#define NEON8_FNASSIGN_PARTIAL_6(member, v, h, fn, ext) \
187 member[1][v][h] = ff_hevc_put_hevc_##fn##4_8_neon##ext; \
188 member[2][v][h] = ff_hevc_put_hevc_##fn##6_8_neon##ext; \
189 member[3][v][h] = ff_hevc_put_hevc_##fn##8_8_neon##ext; \
190 member[4][v][h] = ff_hevc_put_hevc_##fn##12_8_neon##ext; \
191 member[5][v][h] = ff_hevc_put_hevc_##fn##16_8_neon##ext; \
192 member[6][v][h] = ff_hevc_put_hevc_##fn##24_8_neon##ext; \
193 member[7][v][h] = ff_hevc_put_hevc_##fn##32_8_neon##ext; \
194 member[8][v][h] = ff_hevc_put_hevc_##fn##24_8_neon##ext; \
195 member[9][v][h] = ff_hevc_put_hevc_##fn##32_8_neon##ext;
196
197/*
198 * qpel horizontal (non-i8mm): no dedicated w24/w48/w64 NEON functions,
199 * w12 and w24 share h12 (loop x2), w32/w48/w64 share h32 (loop).
200 *
201 * Index-to-width: [1]=4 [2]=6 [3]=8 [4]=12 [5]=16
202 * [6]=24 [7]=32 [8]=48 [9]=64
203 */
204#define NEON8_FNASSIGN_QPEL_H(member, fn) \
205 member[1][0][1] = ff_hevc_put_hevc_##fn##_h4_8_neon; \
206 member[2][0][1] = ff_hevc_put_hevc_##fn##_h6_8_neon; \
207 member[3][0][1] = ff_hevc_put_hevc_##fn##_h8_8_neon; \
208 member[4][0][1] = \
209 member[6][0][1] = ff_hevc_put_hevc_##fn##_h12_8_neon; \
210 member[5][0][1] = ff_hevc_put_hevc_##fn##_h16_8_neon; \
211 member[7][0][1] = \
212 member[8][0][1] = \
213 member[9][0][1] = ff_hevc_put_hevc_##fn##_h32_8_neon;
214
216{
218 if (!have_neon(cpu_flags)) return;
219
220 if (bit_depth == 8) {
221 c->hevc_h_loop_filter_luma = ff_hevc_h_loop_filter_luma_8_neon;
222 c->hevc_v_loop_filter_luma = ff_hevc_v_loop_filter_luma_8_neon;
223 c->hevc_h_loop_filter_chroma = ff_hevc_h_loop_filter_chroma_8_neon;
224 c->hevc_v_loop_filter_chroma = ff_hevc_v_loop_filter_chroma_8_neon;
225 c->add_residual[0] = ff_hevc_add_residual_4x4_8_neon;
226 c->add_residual[1] = ff_hevc_add_residual_8x8_8_neon;
227 c->add_residual[2] = ff_hevc_add_residual_16x16_8_neon;
228 c->add_residual[3] = ff_hevc_add_residual_32x32_8_neon;
229 c->idct[0] = ff_hevc_idct_4x4_8_neon;
230 c->idct[1] = ff_hevc_idct_8x8_8_neon;
231 c->idct[2] = ff_hevc_idct_16x16_8_neon;
232 c->idct[3] = ff_hevc_idct_32x32_8_neon;
233 c->idct_dc[0] = ff_hevc_idct_4x4_dc_8_neon;
234 c->idct_dc[1] = ff_hevc_idct_8x8_dc_8_neon;
235 c->idct_dc[2] = ff_hevc_idct_16x16_dc_8_neon;
236 c->idct_dc[3] = ff_hevc_idct_32x32_dc_8_neon;
237 c->transform_4x4_luma = ff_hevc_transform_luma_4x4_neon_8;
238 c->dequant = hevc_dequant_8_neon;
239 c->sao_band_filter[0] = ff_h26x_sao_band_filter_8x8_8_neon;
240 c->sao_band_filter[1] =
241 c->sao_band_filter[2] =
242 c->sao_band_filter[3] =
243 c->sao_band_filter[4] = ff_h26x_sao_band_filter_16x16_8_neon;
244 c->sao_edge_filter[0] = ff_hevc_sao_edge_filter_8x8_8_neon;
245 c->sao_edge_filter[1] =
246 c->sao_edge_filter[2] =
247 c->sao_edge_filter[3] =
248 c->sao_edge_filter[4] = ff_hevc_sao_edge_filter_16x16_8_neon;
249
250 /* ============ qpel ============ */
251 NEON8_FNASSIGN(c->put_hevc_qpel, 0, 0, pel_pixels,);
252 NEON8_FNASSIGN_QPEL_H(c->put_hevc_qpel, qpel);
253 NEON8_FNASSIGN(c->put_hevc_qpel, 1, 0, qpel_v,);
254 NEON8_FNASSIGN(c->put_hevc_qpel, 1, 1, qpel_hv,);
255
256 /* qpel_uni: pixels, h, v, hv */
257 NEON8_FNASSIGN(c->put_hevc_qpel_uni, 0, 0, pel_uni_pixels,);
258 NEON8_FNASSIGN_QPEL_H(c->put_hevc_qpel_uni, qpel_uni);
259 NEON8_FNASSIGN(c->put_hevc_qpel_uni, 1, 0, qpel_uni_v,);
260 NEON8_FNASSIGN(c->put_hevc_qpel_uni, 1, 1, qpel_uni_hv,);
261
262 /* qpel_bi: pixels, h, v, hv */
263 NEON8_FNASSIGN(c->put_hevc_qpel_bi, 0, 0, pel_bi_pixels,);
264 NEON8_FNASSIGN_QPEL_H(c->put_hevc_qpel_bi, qpel_bi);
265 NEON8_FNASSIGN(c->put_hevc_qpel_bi, 1, 0, qpel_bi_v,);
266 NEON8_FNASSIGN(c->put_hevc_qpel_bi, 1, 1, qpel_bi_hv,);
267
268 /* qpel_uni_w: pixels, h, v, hv */
269 NEON8_FNASSIGN(c->put_hevc_qpel_uni_w, 0, 0, pel_uni_w_pixels,);
270 NEON8_FNASSIGN_SHARED_32(c->put_hevc_qpel_uni_w, 0, 1, qpel_uni_w_h,);
271 NEON8_FNASSIGN(c->put_hevc_qpel_uni_w, 1, 0, qpel_uni_w_v,);
272 NEON8_FNASSIGN(c->put_hevc_qpel_uni_w, 1, 1, qpel_uni_w_hv,);
273
274 /* qpel_bi_w: pixels only */
275 NEON8_FNASSIGN_PARTIAL_6(c->put_hevc_qpel_bi_w, 0, 0, pel_bi_w_pixels,);
276
277 /* ============ epel ============ */
278 NEON8_FNASSIGN(c->put_hevc_epel, 0, 0, pel_pixels,);
279 NEON8_FNASSIGN_SHARED_32(c->put_hevc_epel, 0, 1, epel_h,);
280 NEON8_FNASSIGN(c->put_hevc_epel, 1, 0, epel_v,);
281 NEON8_FNASSIGN(c->put_hevc_epel, 1, 1, epel_hv,);
282
283 /* epel_uni: pixels, h, v, hv */
284 NEON8_FNASSIGN(c->put_hevc_epel_uni, 0, 0, pel_uni_pixels,);
285 NEON8_FNASSIGN(c->put_hevc_epel_uni, 0, 1, epel_uni_h,);
286 NEON8_FNASSIGN(c->put_hevc_epel_uni, 1, 0, epel_uni_v,);
287 NEON8_FNASSIGN(c->put_hevc_epel_uni, 1, 1, epel_uni_hv,);
288
289 /* epel_bi: pixels, h, v, hv */
290 NEON8_FNASSIGN(c->put_hevc_epel_bi, 0, 0, pel_bi_pixels,);
291 NEON8_FNASSIGN(c->put_hevc_epel_bi, 0, 1, epel_bi_h,);
292 NEON8_FNASSIGN(c->put_hevc_epel_bi, 1, 0, epel_bi_v,);
293 NEON8_FNASSIGN(c->put_hevc_epel_bi, 1, 1, epel_bi_hv,);
294
295 /* epel_uni_w: pixels, h, v, hv */
296 NEON8_FNASSIGN(c->put_hevc_epel_uni_w, 0, 0, pel_uni_w_pixels,);
297 NEON8_FNASSIGN_SHARED_32(c->put_hevc_epel_uni_w, 0, 1, epel_uni_w_h,);
298 NEON8_FNASSIGN(c->put_hevc_epel_uni_w, 1, 0, epel_uni_w_v,);
299 NEON8_FNASSIGN(c->put_hevc_epel_uni_w, 1, 1, epel_uni_w_hv,);
300
301 /* epel_bi_w: pixels only */
302 NEON8_FNASSIGN_PARTIAL_6(c->put_hevc_epel_bi_w, 0, 0, pel_bi_w_pixels,);
303
304 if (have_i8mm(cpu_flags)) {
305 /* i8mm overrides: qpel */
306 NEON8_FNASSIGN(c->put_hevc_qpel, 0, 1, qpel_h, _i8mm);
307 NEON8_FNASSIGN(c->put_hevc_qpel, 1, 1, qpel_hv, _i8mm);
308 NEON8_FNASSIGN(c->put_hevc_qpel_uni, 1, 1, qpel_uni_hv, _i8mm);
309 NEON8_FNASSIGN(c->put_hevc_qpel_uni_w, 0, 1, qpel_uni_w_h, _i8mm);
310 NEON8_FNASSIGN(c->put_hevc_qpel_uni_w, 1, 1, qpel_uni_w_hv, _i8mm);
311 NEON8_FNASSIGN(c->put_hevc_qpel_bi, 1, 1, qpel_bi_hv, _i8mm);
312
313 /* i8mm overrides: epel */
314 NEON8_FNASSIGN(c->put_hevc_epel, 0, 1, epel_h, _i8mm);
315 NEON8_FNASSIGN(c->put_hevc_epel, 1, 1, epel_hv, _i8mm);
316 NEON8_FNASSIGN(c->put_hevc_epel_uni, 1, 1, epel_uni_hv, _i8mm);
317 NEON8_FNASSIGN(c->put_hevc_epel_uni_w, 0, 1, epel_uni_w_h, _i8mm);
318 NEON8_FNASSIGN(c->put_hevc_epel_uni_w, 1, 1, epel_uni_w_hv, _i8mm);
319 NEON8_FNASSIGN(c->put_hevc_epel_bi, 1, 1, epel_bi_hv, _i8mm);
320 }
321
322 }
323 if (bit_depth == 10) {
324 c->hevc_h_loop_filter_luma = ff_hevc_h_loop_filter_luma_10_neon;
325 c->hevc_v_loop_filter_luma = ff_hevc_v_loop_filter_luma_10_neon;
326 c->hevc_h_loop_filter_chroma = ff_hevc_h_loop_filter_chroma_10_neon;
327 c->hevc_v_loop_filter_chroma = ff_hevc_v_loop_filter_chroma_10_neon;
328 c->add_residual[0] = ff_hevc_add_residual_4x4_10_neon;
329 c->add_residual[1] = ff_hevc_add_residual_8x8_10_neon;
330 c->add_residual[2] = ff_hevc_add_residual_16x16_10_neon;
331 c->add_residual[3] = ff_hevc_add_residual_32x32_10_neon;
332 c->idct[0] = ff_hevc_idct_4x4_10_neon;
333 c->idct[1] = ff_hevc_idct_8x8_10_neon;
334 c->idct[2] = ff_hevc_idct_16x16_10_neon;
335 c->idct[3] = ff_hevc_idct_32x32_10_neon;
336 c->idct_dc[0] = ff_hevc_idct_4x4_dc_10_neon;
337 c->idct_dc[1] = ff_hevc_idct_8x8_dc_10_neon;
338 c->idct_dc[2] = ff_hevc_idct_16x16_dc_10_neon;
339 c->idct_dc[3] = ff_hevc_idct_32x32_dc_10_neon;
340 c->dequant = hevc_dequant_10_neon;
341 }
342 if (bit_depth == 12) {
343 c->hevc_h_loop_filter_luma = ff_hevc_h_loop_filter_luma_12_neon;
344 c->hevc_v_loop_filter_luma = ff_hevc_v_loop_filter_luma_12_neon;
345 c->hevc_h_loop_filter_chroma = ff_hevc_h_loop_filter_chroma_12_neon;
346 c->hevc_v_loop_filter_chroma = ff_hevc_v_loop_filter_chroma_12_neon;
347 c->add_residual[0] = ff_hevc_add_residual_4x4_12_neon;
348 c->add_residual[1] = ff_hevc_add_residual_8x8_12_neon;
349 c->add_residual[2] = ff_hevc_add_residual_16x16_12_neon;
350 c->add_residual[3] = ff_hevc_add_residual_32x32_12_neon;
351 c->idct_dc[0] = ff_hevc_idct_4x4_dc_12_neon;
352 c->idct_dc[1] = ff_hevc_idct_8x8_dc_12_neon;
353 c->idct_dc[2] = ff_hevc_idct_16x16_dc_12_neon;
354 c->idct_dc[3] = ff_hevc_idct_32x32_dc_12_neon;
355 c->dequant = hevc_dequant_12_neon;
356 }
357}
void ff_hevc_sao_edge_filter_8x8_8_neon(uint8_t *dst, const uint8_t *src, ptrdiff_t stride_dst, const int16_t *sao_offset_val, int eo, int width, int height)
uint8_t * _dst
Definition dsp.h:56
void ff_hevc_sao_edge_filter_16x16_8_neon(uint8_t *dst, const uint8_t *src, ptrdiff_t stride_dst, const int16_t *sao_offset_val, int eo, int width, int height)
void ff_h26x_sao_band_filter_8x8_8_neon(uint8_t *_dst, const uint8_t *_src, ptrdiff_t stride_dst, ptrdiff_t stride_src, const int16_t *sao_offset_val, int sao_left_class, int width, int height)
void ff_h26x_sao_band_filter_16x16_8_neon(uint8_t *_dst, const uint8_t *_src, ptrdiff_t stride_dst, ptrdiff_t stride_src, const int16_t *sao_offset_val, int sao_left_class, int width, int height)
static void bit_depth(AudioStatsContext *s, const uint64_t *const mask, uint8_t *depth)
Definition af_astats.c:246
simple assert() macros that are a bit more flexible than ISO C assert().
#define av_unreachable(msg)
Asserts that are used as compiler optimization hints depending upon ASSERT_LEVEL and NBDEBUG.
Definition avassert.h:109
ptrdiff_t _stride
void ff_hevc_v_loop_filter_luma_10_neon(uint8_t *_pix, ptrdiff_t _stride, int beta, const int *_tc, const uint8_t *_no_p, const uint8_t *_no_q)
void ff_hevc_dequant_16x16_10_neon(int16_t *coeffs)
void ff_hevc_add_residual_4x4_8_neon(uint8_t *_dst, const int16_t *coeffs, ptrdiff_t stride)
void ff_hevc_idct_32x32_dc_8_neon(int16_t *coeffs)
void ff_hevc_idct_8x8_dc_8_neon(int16_t *coeffs)
void ff_hevc_h_loop_filter_luma_12_neon(uint8_t *_pix, ptrdiff_t _stride, int beta, const int *_tc, const uint8_t *_no_p, const uint8_t *_no_q)
static void hevc_dequant_12_neon(int16_t *coeffs, int16_t log2_size)
#define NEON8_FNASSIGN_PARTIAL_6(member, v, h, fn, ext)
void ff_hevc_dequant_16x16_8_neon(int16_t *coeffs)
void ff_hevc_add_residual_32x32_8_neon(uint8_t *_dst, const int16_t *coeffs, ptrdiff_t stride)
void ff_hevc_idct_32x32_10_neon(int16_t *coeffs, int col_limit)
void ff_hevc_add_residual_4x4_10_neon(uint8_t *_dst, const int16_t *coeffs, ptrdiff_t stride)
void ff_hevc_v_loop_filter_luma_8_neon(uint8_t *_pix, ptrdiff_t _stride, int beta, const int *_tc, const uint8_t *_no_p, const uint8_t *_no_q)
void ff_hevc_idct_32x32_dc_10_neon(int16_t *coeffs)
void ff_hevc_idct_32x32_8_neon(int16_t *coeffs, int col_limit)
void ff_hevc_add_residual_8x8_8_neon(uint8_t *_dst, const int16_t *coeffs, ptrdiff_t stride)
void ff_hevc_v_loop_filter_luma_12_neon(uint8_t *_pix, ptrdiff_t _stride, int beta, const int *_tc, const uint8_t *_no_p, const uint8_t *_no_q)
void ff_hevc_idct_16x16_dc_8_neon(int16_t *coeffs)
void ff_hevc_add_residual_16x16_8_neon(uint8_t *_dst, const int16_t *coeffs, ptrdiff_t stride)
void ff_hevc_idct_4x4_8_neon(int16_t *coeffs, int col_limit)
void ff_hevc_dequant_32x32_10_neon(int16_t *coeffs)
void ff_hevc_idct_16x16_dc_12_neon(int16_t *coeffs)
void ff_hevc_idct_4x4_10_neon(int16_t *coeffs, int col_limit)
void ff_hevc_add_residual_16x16_10_neon(uint8_t *_dst, const int16_t *coeffs, ptrdiff_t stride)
void ff_hevc_add_residual_16x16_12_neon(uint8_t *_dst, const int16_t *coeffs, ptrdiff_t stride)
void ff_hevc_dequant_4x4_8_neon(int16_t *coeffs)
void ff_hevc_v_loop_filter_chroma_8_neon(uint8_t *_pix, ptrdiff_t _stride, const int *_tc, const uint8_t *_no_p, const uint8_t *_no_q)
void ff_hevc_dequant_8x8_10_neon(int16_t *coeffs)
#define NEON8_FNASSIGN_QPEL_H(member, fn)
#define NEON8_FNASSIGN(member, v, h, fn, ext)
void ff_hevc_add_residual_32x32_12_neon(uint8_t *_dst, const int16_t *coeffs, ptrdiff_t stride)
void ff_hevc_idct_32x32_dc_12_neon(int16_t *coeffs)
void ff_hevc_dequant_4x4_10_neon(int16_t *coeffs)
static void hevc_dequant_8_neon(int16_t *coeffs, int16_t log2_size)
void ff_hevc_h_loop_filter_chroma_12_neon(uint8_t *_pix, ptrdiff_t _stride, const int *_tc, const uint8_t *_no_p, const uint8_t *_no_q)
void ff_hevc_idct_8x8_8_neon(int16_t *coeffs, int col_limit)
void ff_hevc_idct_16x16_dc_10_neon(int16_t *coeffs)
void ff_hevc_idct_4x4_dc_8_neon(int16_t *coeffs)
void ff_hevc_idct_4x4_dc_12_neon(int16_t *coeffs)
void ff_hevc_h_loop_filter_chroma_8_neon(uint8_t *_pix, ptrdiff_t _stride, const int *_tc, const uint8_t *_no_p, const uint8_t *_no_q)
void ff_hevc_dequant_4x4_12_neon(int16_t *coeffs)
void ff_hevc_h_loop_filter_luma_8_neon(uint8_t *_pix, ptrdiff_t _stride, int beta, const int *_tc, const uint8_t *_no_p, const uint8_t *_no_q)
void ff_hevc_dequant_16x16_12_neon(int16_t *coeffs)
void ff_hevc_add_residual_32x32_10_neon(uint8_t *_dst, const int16_t *coeffs, ptrdiff_t stride)
void ff_hevc_dequant_32x32_8_neon(int16_t *coeffs)
void ff_hevc_add_residual_4x4_12_neon(uint8_t *_dst, const int16_t *coeffs, ptrdiff_t stride)
void ff_hevc_idct_8x8_dc_12_neon(int16_t *coeffs)
void ff_hevc_idct_16x16_10_neon(int16_t *coeffs, int col_limit)
void ff_hevc_add_residual_8x8_12_neon(uint8_t *_dst, const int16_t *coeffs, ptrdiff_t stride)
void ff_hevc_idct_8x8_10_neon(int16_t *coeffs, int col_limit)
void ff_hevc_v_loop_filter_chroma_10_neon(uint8_t *_pix, ptrdiff_t _stride, const int *_tc, const uint8_t *_no_p, const uint8_t *_no_q)
static void hevc_dequant_10_neon(int16_t *coeffs, int16_t log2_size)
void ff_hevc_idct_8x8_dc_10_neon(int16_t *coeffs)
#define NEON8_FNASSIGN_SHARED_32(member, v, h, fn, ext)
void ff_hevc_dequant_8x8_12_neon(int16_t *coeffs)
void ff_hevc_v_loop_filter_chroma_12_neon(uint8_t *_pix, ptrdiff_t _stride, const int *_tc, const uint8_t *_no_p, const uint8_t *_no_q)
void ff_hevc_transform_luma_4x4_neon_8(int16_t *coeffs)
void ff_hevc_idct_16x16_8_neon(int16_t *coeffs, int col_limit)
void ff_hevc_idct_4x4_dc_10_neon(int16_t *coeffs)
av_cold void ff_hevc_dsp_init_aarch64(HEVCDSPContext *c, const int bit_depth)
void ff_hevc_dequant_32x32_12_neon(int16_t *coeffs)
void ff_hevc_h_loop_filter_luma_10_neon(uint8_t *_pix, ptrdiff_t _stride, int beta, const int *_tc, const uint8_t *_no_p, const uint8_t *_no_q)
void ff_hevc_add_residual_8x8_10_neon(uint8_t *_dst, const int16_t *coeffs, ptrdiff_t stride)
void ff_hevc_dequant_8x8_8_neon(int16_t *coeffs)
void ff_hevc_h_loop_filter_chroma_10_neon(uint8_t *_pix, ptrdiff_t _stride, const int *_tc, const uint8_t *_no_p, const uint8_t *_no_q)
#define have_i8mm(flags)
Definition cpu.h:32
#define have_neon(flags)
Definition cpu.h:26
Macro definitions for various function/variable attributes.
#define av_cold
Definition attributes.h:117
static atomic_int cpu_flags
Definition cpu.c:56
int av_get_cpu_flags(void)
Return the flags which specify extensions supported by the CPU.
Definition cpu.c:109
#define stride
static double c[64]