2 * Copyright (c) 2014 Seppo Tomperi <seppo.tomperi@vtt.fi>
4 * This file is part of FFmpeg.
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.
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.
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
22 #include "libavutil/arm/asm.S"
25 .macro hevc_loop_filter_chroma_start
34 .macro hevc_loop_filter_chroma_body
36 vsubl.u8 q11, d18, d19
41 vrshr.s16 q11, q11, #3
45 vmax.s16 q11, q11, q12
52 .macro hevc_loop_filter_luma_start
63 .macro hevc_loop_filter_luma_body
118 vpadd.i32 d0, d14, d12
119 vpadd.i32 d1, d15, d13
126 vaba.s16 q7, q15, q12
132 vabd.s16 q7, q11, q12
157 vadd.i16 q2, q11, q12
187 vadd.i16 q2, q15, q14
226 vsub.i16 q2, q12, q11
231 vsub.i16 q0, q13, q10
247 vrhadd.s16 q3, q9, q11
262 vrhadd.s16 q3, q14, q12
289 function ff_hevc_v_loop_filter_luma_neon, export=1
290 hevc_loop_filter_luma_start
294 vld1.8 {d16}, [r0], r1
295 vld1.8 {d18}, [r0], r1
296 vld1.8 {d20}, [r0], r1
297 vld1.8 {d22}, [r0], r1
298 vld1.8 {d24}, [r0], r1
299 vld1.8 {d26}, [r0], r1
300 vld1.8 {d28}, [r0], r1
301 vld1.8 {d30}, [r0], r1
302 sub r0, r0, r1, lsl #3
303 transpose_8x8 d16, d18, d20, d22, d24, d26, d28, d30
304 hevc_loop_filter_luma_body
305 transpose_8x8 d16, d18, d20, d22, d24, d26, d28, d30
306 vst1.8 {d16}, [r0], r1
307 vst1.8 {d18}, [r0], r1
308 vst1.8 {d20}, [r0], r1
309 vst1.8 {d22}, [r0], r1
310 vst1.8 {d24}, [r0], r1
311 vst1.8 {d26}, [r0], r1
312 vst1.8 {d28}, [r0], r1
319 function ff_hevc_h_loop_filter_luma_neon, export=1
320 hevc_loop_filter_luma_start
323 sub r0, r0, r1, lsl #2
324 vld1.8 {d16}, [r0], r1
325 vld1.8 {d18}, [r0], r1
326 vld1.8 {d20}, [r0], r1
327 vld1.8 {d22}, [r0], r1
328 vld1.8 {d24}, [r0], r1
329 vld1.8 {d26}, [r0], r1
330 vld1.8 {d28}, [r0], r1
331 vld1.8 {d30}, [r0], r1
332 sub r0, r0, r1, lsl #3
334 hevc_loop_filter_luma_body
335 vst1.8 {d18}, [r0], r1
336 vst1.8 {d20}, [r0], r1
337 vst1.8 {d22}, [r0], r1
338 vst1.8 {d24}, [r0], r1
339 vst1.8 {d26}, [r0], r1
347 function ff_hevc_v_loop_filter_chroma_neon, export=1
348 hevc_loop_filter_chroma_start
350 vld1.8 {d16}, [r0], r1
351 vld1.8 {d17}, [r0], r1
352 vld1.8 {d18}, [r0], r1
353 vld1.8 {d2}, [r0], r1
354 vld1.8 {d4}, [r0], r1
355 vld1.8 {d19}, [r0], r1
356 vld1.8 {d20}, [r0], r1
357 vld1.8 {d21}, [r0], r1
358 sub r0, r0, r1, lsl #3
359 transpose_8x8 d16, d17, d18, d2, d4, d19, d20, d21
360 hevc_loop_filter_chroma_body
361 transpose_8x8 d16, d17, d18, d2, d4, d19, d20, d21
362 vst1.8 {d16}, [r0], r1
363 vst1.8 {d17}, [r0], r1
364 vst1.8 {d18}, [r0], r1
365 vst1.8 {d2}, [r0], r1
366 vst1.8 {d4}, [r0], r1
367 vst1.8 {d19}, [r0], r1
368 vst1.8 {d20}, [r0], r1
373 function ff_hevc_h_loop_filter_chroma_neon, export=1
374 hevc_loop_filter_chroma_start
375 sub r0, r0, r1, lsl #1
376 vld1.8 {d18}, [r0], r1
377 vld1.8 {d2}, [r0], r1
378 vld1.8 {d4}, [r0], r1
380 sub r0, r0, r1, lsl #1
381 hevc_loop_filter_chroma_body
382 vst1.8 {d2}, [r0], r1