]> git.sesse.net Git - ffmpeg/blob - libavcodec/arm/h264idct_neon.S
avcodec: Move all AVCodecParser.split functions to remove_extradata_bsf
[ffmpeg] / libavcodec / arm / h264idct_neon.S
1 /*
2  * Copyright (c) 2008 Mans Rullgard <mans@mansr.com>
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 #include "libavutil/arm/asm.S"
22
23 function ff_h264_idct_add_neon, export=1
24 h264_idct_add_neon_nothumb:
25         vld1.64         {d0-d3},  [r1,:128]
26         vmov.i16        q15, #0
27
28         vswp            d1,  d2
29         vst1.16         {q15},    [r1,:128]!
30         vadd.i16        d4,  d0,  d1
31         vst1.16         {q15},    [r1,:128]!
32         vshr.s16        q8,  q1,  #1
33         vsub.i16        d5,  d0,  d1
34         vadd.i16        d6,  d2,  d17
35         vsub.i16        d7,  d16, d3
36         vadd.i16        q0,  q2,  q3
37         vsub.i16        q1,  q2,  q3
38
39         vtrn.16         d0,  d1
40         vtrn.16         d3,  d2
41         vtrn.32         d0,  d3
42         vtrn.32         d1,  d2
43
44         vadd.i16        d4,  d0,  d3
45         vld1.32         {d18[0]}, [r0,:32], r2
46         vswp            d1,  d3
47         vshr.s16        q8,  q1,  #1
48         vld1.32         {d19[1]}, [r0,:32], r2
49         vsub.i16        d5,  d0,  d1
50         vld1.32         {d18[1]}, [r0,:32], r2
51         vadd.i16        d6,  d16, d3
52         vld1.32         {d19[0]}, [r0,:32], r2
53         vsub.i16        d7,  d2,  d17
54         sub             r0,  r0,  r2, lsl #2
55         vadd.i16        q0,  q2,  q3
56         vsub.i16        q1,  q2,  q3
57
58         vrshr.s16       q0,  q0,  #6
59         vrshr.s16       q1,  q1,  #6
60
61         vaddw.u8        q0,  q0,  d18
62         vaddw.u8        q1,  q1,  d19
63
64         vqmovun.s16     d0,  q0
65         vqmovun.s16     d1,  q1
66
67         vst1.32         {d0[0]},  [r0,:32], r2
68         vst1.32         {d1[1]},  [r0,:32], r2
69         vst1.32         {d0[1]},  [r0,:32], r2
70         vst1.32         {d1[0]},  [r0,:32], r2
71
72         sub             r1,  r1,  #32
73         bx              lr
74 endfunc
75
76 function ff_h264_idct_dc_add_neon, export=1
77 h264_idct_dc_add_neon_nothumb:
78         mov             r3,       #0
79         vld1.16         {d2[],d3[]}, [r1,:16]
80         strh            r3,       [r1]
81         vrshr.s16       q1,  q1,  #6
82         vld1.32         {d0[0]},  [r0,:32], r2
83         vld1.32         {d0[1]},  [r0,:32], r2
84         vaddw.u8        q2,  q1,  d0
85         vld1.32         {d1[0]},  [r0,:32], r2
86         vld1.32         {d1[1]},  [r0,:32], r2
87         vaddw.u8        q1,  q1,  d1
88         vqmovun.s16     d0,  q2
89         vqmovun.s16     d1,  q1
90         sub             r0,  r0,  r2, lsl #2
91         vst1.32         {d0[0]},  [r0,:32], r2
92         vst1.32         {d0[1]},  [r0,:32], r2
93         vst1.32         {d1[0]},  [r0,:32], r2
94         vst1.32         {d1[1]},  [r0,:32], r2
95         bx              lr
96 endfunc
97
98 function ff_h264_idct_add16_neon, export=1
99         push            {r4-r8,lr}
100         mov             r4,  r0
101         mov             r5,  r1
102         mov             r1,  r2
103         mov             r2,  r3
104         ldr             r6,  [sp, #24]
105         movrel          r7,  scan8
106         mov             ip,  #16
107 1:      ldrb            r8,  [r7], #1
108         ldr             r0,  [r5], #4
109         ldrb            r8,  [r6, r8]
110         subs            r8,  r8,  #1
111         blt             2f
112         ldrsh           lr,  [r1]
113         add             r0,  r0,  r4
114         it              ne
115         movne           lr,  #0
116         cmp             lr,  #0
117         ite             ne
118         adrne           lr,  h264_idct_dc_add_neon_nothumb + CONFIG_THUMB
119         adreq           lr,  h264_idct_add_neon_nothumb    + CONFIG_THUMB
120         blx             lr
121 2:      subs            ip,  ip,  #1
122         add             r1,  r1,  #32
123         bne             1b
124         pop             {r4-r8,pc}
125 endfunc
126
127 function ff_h264_idct_add16intra_neon, export=1
128         push            {r4-r8,lr}
129         mov             r4,  r0
130         mov             r5,  r1
131         mov             r1,  r2
132         mov             r2,  r3
133         ldr             r6,  [sp, #24]
134         movrel          r7,  scan8
135         mov             ip,  #16
136 1:      ldrb            r8,  [r7], #1
137         ldr             r0,  [r5], #4
138         ldrb            r8,  [r6, r8]
139         add             r0,  r0,  r4
140         cmp             r8,  #0
141         ldrsh           r8,  [r1]
142         iteet           ne
143         adrne           lr,  h264_idct_add_neon_nothumb    + CONFIG_THUMB
144         adreq           lr,  h264_idct_dc_add_neon_nothumb + CONFIG_THUMB
145         cmpeq           r8,  #0
146         blxne           lr
147         subs            ip,  ip,  #1
148         add             r1,  r1,  #32
149         bne             1b
150         pop             {r4-r8,pc}
151 endfunc
152
153 function ff_h264_idct_add8_neon, export=1
154         push            {r4-r10,lr}
155         ldm             r0,  {r4,r9}
156         add             r5,  r1,  #16*4
157         add             r1,  r2,  #16*32
158         mov             r2,  r3
159         mov             r10, r1
160         ldr             r6,  [sp, #32]
161         movrel          r7,  scan8+16
162         mov             r12, #0
163 1:      ldrb            r8,  [r7, r12]
164         ldr             r0,  [r5, r12, lsl #2]
165         ldrb            r8,  [r6, r8]
166         add             r0,  r0,  r4
167         add             r1,  r10, r12, lsl #5
168         cmp             r8,  #0
169         ldrsh           r8,  [r1]
170         iteet           ne
171         adrne           lr,  h264_idct_add_neon_nothumb    + CONFIG_THUMB
172         adreq           lr,  h264_idct_dc_add_neon_nothumb + CONFIG_THUMB
173         cmpeq           r8,  #0
174         blxne           lr
175         add             r12, r12, #1
176         cmp             r12, #4
177         itt             eq
178         moveq           r12, #16
179         moveq           r4,  r9
180         cmp             r12, #20
181         blt             1b
182         pop             {r4-r10,pc}
183 endfunc
184
185 .macro  idct8x8_cols    pass
186   .if \pass == 0
187         qa      .req    q2
188         qb      .req    q14
189         vshr.s16        q2,  q10, #1
190         vadd.i16        q0,  q8,  q12
191         vld1.16         {q14-q15},[r1,:128]
192         vst1.16         {q3},     [r1,:128]!
193         vst1.16         {q3},     [r1,:128]!
194         vsub.i16        q1,  q8,  q12
195         vshr.s16        q3,  q14, #1
196         vsub.i16        q2,  q2,  q14
197         vadd.i16        q3,  q3,  q10
198   .else
199         qa      .req    q14
200         qb      .req    q2
201         vtrn.32         q8,  q10
202         vtrn.16         q12, q13
203         vtrn.32         q9,  q11
204         vtrn.32         q12, q2
205         vtrn.32         q13, q15
206         vswp            d21, d4
207         vshr.s16        q14, q10, #1
208         vswp            d17, d24
209         vshr.s16        q3,  q2,  #1
210         vswp            d19, d26
211         vadd.i16        q0,  q8,  q12
212         vswp            d23, d30
213         vsub.i16        q1,  q8,  q12
214         vsub.i16        q14, q14, q2
215         vadd.i16        q3,  q3,  q10
216   .endif
217         vadd.i16        q10, q1,  qa
218         vsub.i16        q12, q1,  qa
219         vadd.i16        q8,  q0,  q3
220         vsub.i16        qb,  q0,  q3
221         vsub.i16        q0,  q13, q11
222         vadd.i16        q1,  q15, q9
223         vsub.i16        qa,  q15, q9
224         vadd.i16        q3,  q13, q11
225         vsub.i16        q0,  q0,  q15
226         vsub.i16        q1,  q1,  q11
227         vadd.i16        qa,  qa,  q13
228         vadd.i16        q3,  q3,  q9
229         vshr.s16        q9,  q9,  #1
230         vshr.s16        q11, q11, #1
231         vshr.s16        q13, q13, #1
232         vshr.s16        q15, q15, #1
233         vsub.i16        q0,  q0,  q15
234         vsub.i16        q1,  q1,  q11
235         vadd.i16        qa,  qa,  q13
236         vadd.i16        q3,  q3,  q9
237         vshr.s16        q9,  q0,  #2
238         vshr.s16        q11, q1,  #2
239         vshr.s16        q13, qa,  #2
240         vshr.s16        q15, q3,  #2
241         vsub.i16        q3,  q3,  q9
242         vsub.i16        qa,  q11, qa
243         vadd.i16        q1,  q1,  q13
244         vadd.i16        q0,  q0,  q15
245   .if \pass == 0
246         vsub.i16        q15, q8,  q3
247         vadd.i16        q8,  q8,  q3
248         vadd.i16        q9,  q10, q2
249         vsub.i16        q2,  q10, q2
250         vtrn.16         q8,  q9
251         vadd.i16        q10, q12, q1
252         vtrn.16         q2,  q15
253         vadd.i16        q11, q14, q0
254         vsub.i16        q13, q12, q1
255         vtrn.16         q10, q11
256         vsub.i16        q12, q14, q0
257   .else
258         vsub.i16        q15, q8,  q3
259         vadd.i16        q8,  q8,  q3
260         vadd.i16        q9,  q10, q14
261         vsub.i16        q14, q10, q14
262         vadd.i16        q10, q12, q1
263         vsub.i16        q13, q12, q1
264         vadd.i16        q11, q2, q0
265         vsub.i16        q12, q2, q0
266   .endif
267         .unreq          qa
268         .unreq          qb
269 .endm
270
271 function ff_h264_idct8_add_neon, export=1
272 h264_idct8_add_neon_nothumb:
273         vmov.i16        q3,       #0
274         vld1.16         {q8-q9},  [r1,:128]
275         vst1.16         {q3},     [r1,:128]!
276         vst1.16         {q3},     [r1,:128]!
277         vld1.16         {q10-q11},[r1,:128]
278         vst1.16         {q3},     [r1,:128]!
279         vst1.16         {q3},     [r1,:128]!
280         vld1.16         {q12-q13},[r1,:128]
281         vst1.16         {q3},     [r1,:128]!
282         vst1.16         {q3},     [r1,:128]!
283
284         idct8x8_cols    0
285         idct8x8_cols    1
286
287         mov             r3,  r0
288         vrshr.s16       q8,  q8,  #6
289         vld1.8          {d0},     [r0,:64], r2
290         vrshr.s16       q9,  q9,  #6
291         vld1.8          {d1},     [r0,:64], r2
292         vrshr.s16       q10, q10, #6
293         vld1.8          {d2},     [r0,:64], r2
294         vrshr.s16       q11, q11, #6
295         vld1.8          {d3},     [r0,:64], r2
296         vrshr.s16       q12, q12, #6
297         vld1.8          {d4},     [r0,:64], r2
298         vrshr.s16       q13, q13, #6
299         vld1.8          {d5},     [r0,:64], r2
300         vrshr.s16       q14, q14, #6
301         vld1.8          {d6},     [r0,:64], r2
302         vrshr.s16       q15, q15, #6
303         vld1.8          {d7},     [r0,:64], r2
304         vaddw.u8        q8,  q8,  d0
305         vaddw.u8        q9,  q9,  d1
306         vaddw.u8        q10, q10, d2
307         vqmovun.s16     d0,  q8
308         vaddw.u8        q11, q11, d3
309         vqmovun.s16     d1,  q9
310         vaddw.u8        q12, q12, d4
311         vqmovun.s16     d2,  q10
312         vst1.8          {d0},     [r3,:64], r2
313         vaddw.u8        q13, q13, d5
314         vqmovun.s16     d3,  q11
315         vst1.8          {d1},     [r3,:64], r2
316         vaddw.u8        q14, q14, d6
317         vqmovun.s16     d4,  q12
318         vst1.8          {d2},     [r3,:64], r2
319         vaddw.u8        q15, q15, d7
320         vqmovun.s16     d5,  q13
321         vst1.8          {d3},     [r3,:64], r2
322         vqmovun.s16     d6,  q14
323         vqmovun.s16     d7,  q15
324         vst1.8          {d4},     [r3,:64], r2
325         vst1.8          {d5},     [r3,:64], r2
326         vst1.8          {d6},     [r3,:64], r2
327         vst1.8          {d7},     [r3,:64], r2
328
329         sub             r1,  r1,  #128
330         bx              lr
331 endfunc
332
333 function ff_h264_idct8_dc_add_neon, export=1
334 h264_idct8_dc_add_neon_nothumb:
335         mov             r3,       #0
336         vld1.16         {d30[],d31[]},[r1,:16]
337         strh            r3,       [r1]
338         vld1.32         {d0},     [r0,:64], r2
339         vrshr.s16       q15, q15, #6
340         vld1.32         {d1},     [r0,:64], r2
341         vld1.32         {d2},     [r0,:64], r2
342         vaddw.u8        q8,  q15, d0
343         vld1.32         {d3},     [r0,:64], r2
344         vaddw.u8        q9,  q15, d1
345         vld1.32         {d4},     [r0,:64], r2
346         vaddw.u8        q10, q15, d2
347         vld1.32         {d5},     [r0,:64], r2
348         vaddw.u8        q11, q15, d3
349         vld1.32         {d6},     [r0,:64], r2
350         vaddw.u8        q12, q15, d4
351         vld1.32         {d7},     [r0,:64], r2
352         vaddw.u8        q13, q15, d5
353         vaddw.u8        q14, q15, d6
354         vaddw.u8        q15, q15, d7
355         vqmovun.s16     d0,  q8
356         vqmovun.s16     d1,  q9
357         vqmovun.s16     d2,  q10
358         vqmovun.s16     d3,  q11
359         sub             r0,  r0,  r2, lsl #3
360         vst1.32         {d0},     [r0,:64], r2
361         vqmovun.s16     d4,  q12
362         vst1.32         {d1},     [r0,:64], r2
363         vqmovun.s16     d5,  q13
364         vst1.32         {d2},     [r0,:64], r2
365         vqmovun.s16     d6,  q14
366         vst1.32         {d3},     [r0,:64], r2
367         vqmovun.s16     d7,  q15
368         vst1.32         {d4},     [r0,:64], r2
369         vst1.32         {d5},     [r0,:64], r2
370         vst1.32         {d6},     [r0,:64], r2
371         vst1.32         {d7},     [r0,:64], r2
372         bx              lr
373 endfunc
374
375 function ff_h264_idct8_add4_neon, export=1
376         push            {r4-r8,lr}
377         mov             r4,  r0
378         mov             r5,  r1
379         mov             r1,  r2
380         mov             r2,  r3
381         ldr             r6,  [sp, #24]
382         movrel          r7,  scan8
383         mov             r12, #16
384 1:      ldrb            r8,  [r7], #4
385         ldr             r0,  [r5], #16
386         ldrb            r8,  [r6, r8]
387         subs            r8,  r8,  #1
388         blt             2f
389         ldrsh           lr,  [r1]
390         add             r0,  r0,  r4
391         it              ne
392         movne           lr,  #0
393         cmp             lr,  #0
394         ite             ne
395         adrne           lr,  h264_idct8_dc_add_neon_nothumb + CONFIG_THUMB
396         adreq           lr,  h264_idct8_add_neon_nothumb    + CONFIG_THUMB
397         blx             lr
398 2:      subs            r12, r12, #4
399         add             r1,  r1,  #128
400         bne             1b
401         pop             {r4-r8,pc}
402 endfunc
403
404 const   scan8
405         .byte           4+ 1*8, 5+ 1*8, 4+ 2*8, 5+ 2*8
406         .byte           6+ 1*8, 7+ 1*8, 6+ 2*8, 7+ 2*8
407         .byte           4+ 3*8, 5+ 3*8, 4+ 4*8, 5+ 4*8
408         .byte           6+ 3*8, 7+ 3*8, 6+ 4*8, 7+ 4*8
409         .byte           4+ 6*8, 5+ 6*8, 4+ 7*8, 5+ 7*8
410         .byte           6+ 6*8, 7+ 6*8, 6+ 7*8, 7+ 7*8
411         .byte           4+ 8*8, 5+ 8*8, 4+ 9*8, 5+ 9*8
412         .byte           6+ 8*8, 7+ 8*8, 6+ 9*8, 7+ 9*8
413         .byte           4+11*8, 5+11*8, 4+12*8, 5+12*8
414         .byte           6+11*8, 7+11*8, 6+12*8, 7+12*8
415         .byte           4+13*8, 5+13*8, 4+14*8, 5+14*8
416         .byte           6+13*8, 7+13*8, 6+14*8, 7+14*8
417 endconst