• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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
21
22#include "libavutil/arm/asm.S"
23#include "neon.S"
24
25.macro hevc_loop_filter_chroma_start
26        ldr      r12, [r2]
27        ldr      r3, [r2, #4]
28        add      r2, r3, r12
29        cmp      r2, #0
30        it       eq
31        bxeq     lr
32.endm
33
34.macro hevc_loop_filter_chroma_body
35        vsubl.u8  q3, d4, d2
36        vsubl.u8  q11, d18, d19
37        vshl.i16  q3, #2
38        vadd.i16  q11, q3
39        vdup.16   d0, r12
40        vdup.16   d1, r3
41        vrshr.s16 q11, q11, #3
42        vneg.s16  q12, q0
43        vmovl.u8  q2, d4
44        vmin.s16  q11, q11, q0
45        vmax.s16  q11, q11, q12
46        vaddw.u8  q1, q11, d2
47        vsub.i16  q2, q11
48        vqmovun.s16 d2, q1
49        vqmovun.s16 d4, q2
50.endm
51
52.macro hevc_loop_filter_luma_start
53        ldr     r12, [r3]
54        ldr      r3, [r3, #4]
55        lsl      r3, #16
56        orr      r3, r12
57        cmp      r3, #0
58        it       eq
59        bxeq     lr
60        lsr      r3, #16
61.endm
62
63.macro hevc_loop_filter_luma_body
64        vmovl.u8  q8, d16
65        vmovl.u8  q9, d18
66        vmovl.u8  q10, d20
67        vmovl.u8  q11, d22
68        vmovl.u8  q12, d24
69        vmovl.u8  q13, d26
70        vmovl.u8  q14, d28
71        vmovl.u8  q15, d30
72
73        vadd.i16   q7, q9, q11
74        vadd.i16   q6, q14, q12
75        vsub.i16   q7, q10
76        vsub.i16   q6, q13
77        vabd.s16   q7, q7, q10
78        vabd.s16   q6, q6, q13
79
80
81        vdup.16    q0, r2
82        vmov       q4, q7
83        vmov       q5, q6
84        vdup.16    d4, r12
85        vtrn.16    q7, q4
86        vtrn.16    q6, q5
87
88        vshl.u64   q7, #32
89        vshr.u64   q4, #32
90        vshl.u64   q6, #32
91        vshr.u64   q5, #32
92        vshr.u64   q7, #32
93        vshr.u64   q6, #32
94        vshl.u64   q5, #32
95        vshl.u64   q4, #32
96        vorr       q6, q5
97        vorr       q7, q4
98        vdup.16    d5, r3
99        vadd.i16   q5, q7, q6
100
101        vmov       q4, q5
102        vmov       q3, q5
103        vtrn.32    q3, q4
104
105        vadd.i16   q4, q3
106
107        vshl.s16   q5, q5, #1
108        vcgt.s16   q3, q0, q4
109
110        vmovn.i16  d6, q3
111        vshr.s16   q1, q0, #2
112        vmovn.i16  d6, q3
113        vcgt.s16   q5, q1, q5
114        vmov       r7, s12
115        cmp        r7, #0
116        beq        bypasswrite
117
118        vpadd.i32  d0, d14, d12
119        vpadd.i32  d1, d15, d13
120        vmov       q4, q2
121        vshl.s16   q2, #2
122        vshr.s16   q1, q1, #1
123        vrhadd.s16 q2, q4
124
125        vabd.s16   q7, q8, q11
126        vaba.s16   q7, q15, q12
127
128        vmovn.i32  d0, q0
129        vmov       r5, r6, s0, s1
130        vcgt.s16   q6, q1, q7
131        vand       q5, q5, q6
132        vabd.s16   q7, q11, q12
133        vcgt.s16   q6, q2, q7
134        vand       q5, q5, q6
135
136        vmov       q2, q5
137        vtrn.s16   q5, q2
138        vshr.u64   q2, #32
139        vshl.u64   q5, #32
140        vshl.u64   q2, #32
141        vshr.u64   q5, #32
142        vorr       q5, q2
143
144        vmov       q2, q5
145        vshl.i16   q7, q4, #1
146        vtrn.32    q2, q5
147        vand       q5, q2
148        vneg.s16   q6, q7
149        vmovn.i16  d4, q5
150        vmovn.i16  d4, q2
151        vmov       r8, s8
152
153        and        r9, r8, r7
154        cmp        r9, #0
155        beq        1f
156
157        vadd.i16  q2, q11, q12
158        vadd.i16  q4, q9, q8
159        vadd.i16  q1, q2, q10
160        vdup.16   d10, r9
161        vadd.i16  q0, q1, q9
162        vshl.i16  q4, #1
163        lsr        r9, #16
164        vadd.i16  q1, q0
165        vrshr.s16 q3, q0, #2
166        vadd.i16  q1, q13
167        vadd.i16  q4, q0
168        vsub.i16  q3, q10
169        vrshr.s16 q1, #3
170        vrshr.s16 q4, #3
171        vmax.s16  q3, q6
172        vsub.i16  q1, q11
173        vsub.i16  q4, q9
174        vmin.s16  q3, q7
175        vmax.s16  q4, q6
176        vmax.s16  q1, q6
177        vadd.i16  q3, q10
178        vmin.s16  q4, q7
179        vmin.s16  q1, q7
180        vdup.16   d11, r9
181        vadd.i16  q4, q9
182        vadd.i16  q1, q11
183        vbit      q9, q4, q5
184        vadd.i16  q4, q2, q13
185        vbit      q11, q1, q5
186        vadd.i16  q0, q4, q14
187        vadd.i16  q2, q15, q14
188        vadd.i16  q4, q0
189
190        vshl.i16  q2, #1
191        vadd.i16  q4, q10
192        vbit      q10, q3, q5
193        vrshr.s16 q4, #3
194        vadd.i16  q2, q0
195        vrshr.s16 q3, q0, #2
196        vsub.i16  q4, q12
197        vrshr.s16 q2, #3
198        vsub.i16  q3, q13
199        vmax.s16  q4, q6
200        vsub.i16  q2, q14
201        vmax.s16  q3, q6
202        vmin.s16  q4, q7
203        vmax.s16  q2, q6
204        vmin.s16  q3, q7
205        vadd.i16  q4, q12
206        vmin.s16  q2, q7
207        vadd.i16  q3, q13
208        vbit      q12, q4, q5
209        vadd.i16  q2, q14
210        vbit      q13, q3, q5
211        vbit      q14, q2, q5
212
2131:
214        mvn       r8, r8
215        and       r9, r8, r7
216        cmp       r9, #0
217        beq       2f
218
219        vdup.16    q4, r2
220
221        vdup.16   d10, r9
222        lsr       r9, #16
223        vmov       q1, q4
224        vdup.16   d11, r9
225        vshr.s16   q1, #1
226        vsub.i16  q2, q12, q11
227        vadd.i16   q4, q1
228        vshl.s16  q0, q2, #3
229        vshr.s16   q4, #3
230        vadd.i16  q2, q0
231        vsub.i16  q0, q13, q10
232        vsub.i16  q2, q0
233        vshl.i16  q0, q0, #1
234        vsub.i16  q2, q0
235        vshl.s16  q1, q7, 2
236        vrshr.s16 q2, q2, #4
237        vadd.i16  q1, q7
238        vabs.s16  q3, q2
239        vshr.s16  q6, q6, #1
240        vcgt.s16  q1, q1, q3
241        vand      q5, q1
242        vshr.s16  q7, q7, #1
243        vmax.s16  q2, q2, q6
244        vmin.s16  q2, q2, q7
245
246        vshr.s16  q7, q7, #1
247        vrhadd.s16 q3, q9, q11
248        vneg.s16  q6, q7
249        vsub.s16  q3, q10
250        vdup.16   d2, r5
251        vhadd.s16 q3, q2
252        vdup.16   d3, r6
253        vmax.s16  q3, q3, q6
254        vcgt.s16  q1, q4, q1
255        vmin.s16  q3, q3, q7
256        vand      q1, q5
257        vadd.i16  q3, q10
258        lsr       r5, #16
259        lsr       r6, #16
260        vbit      q10, q3, q1
261
262        vrhadd.s16 q3, q14, q12
263        vdup.16   d2, r5
264        vsub.s16  q3, q13
265        vdup.16   d3, r6
266        vhsub.s16 q3, q2
267        vcgt.s16  q1, q4, q1
268        vmax.s16  q3, q3, q6
269        vand      q1, q5
270        vmin.s16  q3, q3, q7
271        vadd.i16  q3, q13
272        vbit      q13, q3, q1
273        vadd.i16  q0, q11, q2
274        vsub.i16  q4, q12, q2
275        vbit      q11, q0, q5
276        vbit      q12, q4, q5
277
2782:
279        vqmovun.s16 d16, q8
280        vqmovun.s16 d18, q9
281        vqmovun.s16 d20, q10
282        vqmovun.s16 d22, q11
283        vqmovun.s16 d24, q12
284        vqmovun.s16 d26, q13
285        vqmovun.s16 d28, q14
286        vqmovun.s16 d30, q15
287.endm
288
289function ff_hevc_v_loop_filter_luma_neon, export=1
290        hevc_loop_filter_luma_start
291        push     {r5-r11}
292        vpush    {d8-d15}
293        sub      r0, #4
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
313        vst1.8   {d30}, [r0]
314        vpop     {d8-d15}
315        pop      {r5-r11}
316        bx lr
317endfunc
318
319function ff_hevc_h_loop_filter_luma_neon, export=1
320        hevc_loop_filter_luma_start
321        push     {r5-r11}
322        vpush    {d8-d15}
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
333        add        r0, r1
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
340        vst1.8   {d28}, [r0]
341bypasswrite:
342        vpop     {d8-d15}
343        pop      {r5-r11}
344        bx lr
345endfunc
346
347function ff_hevc_v_loop_filter_chroma_neon, export=1
348        hevc_loop_filter_chroma_start
349        sub      r0, #4
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
369        vst1.8   {d21}, [r0]
370        bx       lr
371endfunc
372
373function 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
379        vld1.8   {d19}, [r0]
380        sub      r0, r0, r1, lsl #1
381        hevc_loop_filter_chroma_body
382        vst1.8   {d2}, [r0], r1
383        vst1.8   {d4}, [r0]
384        bx       lr
385endfunc
386