yading@10
|
1 /*
|
yading@10
|
2 * Copyright (C) 2010 Mans Rullgard
|
yading@10
|
3 *
|
yading@10
|
4 * This file is part of FFmpeg.
|
yading@10
|
5 *
|
yading@10
|
6 * FFmpeg is free software; you can redistribute it and/or
|
yading@10
|
7 * modify it under the terms of the GNU Lesser General Public
|
yading@10
|
8 * License as published by the Free Software Foundation; either
|
yading@10
|
9 * version 2.1 of the License, or (at your option) any later version.
|
yading@10
|
10 *
|
yading@10
|
11 * FFmpeg is distributed in the hope that it will be useful,
|
yading@10
|
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
yading@10
|
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
yading@10
|
14 * Lesser General Public License for more details.
|
yading@10
|
15 *
|
yading@10
|
16 * You should have received a copy of the GNU Lesser General Public
|
yading@10
|
17 * License along with FFmpeg; if not, write to the Free Software
|
yading@10
|
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
yading@10
|
19 */
|
yading@10
|
20
|
yading@10
|
21 #include "libavutil/arm/asm.S"
|
yading@10
|
22
|
yading@10
|
23 .macro rac_get_prob h, bs, buf, cw, pr, t0, t1
|
yading@10
|
24 adds \bs, \bs, \t0
|
yading@10
|
25 lsl \cw, \cw, \t0
|
yading@10
|
26 lsl \t0, \h, \t0
|
yading@10
|
27 rsb \h, \pr, #256
|
yading@10
|
28 it cs
|
yading@10
|
29 ldrhcs \t1, [\buf], #2
|
yading@10
|
30 smlabb \h, \t0, \pr, \h
|
yading@10
|
31 T itttt cs
|
yading@10
|
32 rev16cs \t1, \t1
|
yading@10
|
33 A orrcs \cw, \cw, \t1, lsl \bs
|
yading@10
|
34 T lslcs \t1, \t1, \bs
|
yading@10
|
35 T orrcs \cw, \cw, \t1
|
yading@10
|
36 subcs \bs, \bs, #16
|
yading@10
|
37 lsr \h, \h, #8
|
yading@10
|
38 cmp \cw, \h, lsl #16
|
yading@10
|
39 itt ge
|
yading@10
|
40 subge \cw, \cw, \h, lsl #16
|
yading@10
|
41 subge \h, \t0, \h
|
yading@10
|
42 .endm
|
yading@10
|
43
|
yading@10
|
44 .macro rac_get_128 h, bs, buf, cw, t0, t1
|
yading@10
|
45 adds \bs, \bs, \t0
|
yading@10
|
46 lsl \cw, \cw, \t0
|
yading@10
|
47 lsl \t0, \h, \t0
|
yading@10
|
48 it cs
|
yading@10
|
49 ldrhcs \t1, [\buf], #2
|
yading@10
|
50 mov \h, #128
|
yading@10
|
51 it cs
|
yading@10
|
52 rev16cs \t1, \t1
|
yading@10
|
53 add \h, \h, \t0, lsl #7
|
yading@10
|
54 A orrcs \cw, \cw, \t1, lsl \bs
|
yading@10
|
55 T ittt cs
|
yading@10
|
56 T lslcs \t1, \t1, \bs
|
yading@10
|
57 T orrcs \cw, \cw, \t1
|
yading@10
|
58 subcs \bs, \bs, #16
|
yading@10
|
59 lsr \h, \h, #8
|
yading@10
|
60 cmp \cw, \h, lsl #16
|
yading@10
|
61 itt ge
|
yading@10
|
62 subge \cw, \cw, \h, lsl #16
|
yading@10
|
63 subge \h, \t0, \h
|
yading@10
|
64 .endm
|
yading@10
|
65
|
yading@10
|
66 function ff_decode_block_coeffs_armv6, export=1
|
yading@10
|
67 push {r0,r1,r4-r11,lr}
|
yading@10
|
68 movrelx lr, X(ff_vp56_norm_shift)
|
yading@10
|
69 ldrd r4, r5, [sp, #44] @ token_prob, qmul
|
yading@10
|
70 cmp r3, #0
|
yading@10
|
71 ldr r11, [r5]
|
yading@10
|
72 ldm r0, {r5-r7} @ high, bits, buf
|
yading@10
|
73 it ne
|
yading@10
|
74 pkhtbne r11, r11, r11, asr #16
|
yading@10
|
75 ldr r8, [r0, #16] @ code_word
|
yading@10
|
76 0:
|
yading@10
|
77 ldrb r9, [lr, r5]
|
yading@10
|
78 add r3, r3, #1
|
yading@10
|
79 ldrb r0, [r4, #1]
|
yading@10
|
80 rac_get_prob r5, r6, r7, r8, r0, r9, r10
|
yading@10
|
81 blt 2f
|
yading@10
|
82
|
yading@10
|
83 ldrb r9, [lr, r5]
|
yading@10
|
84 ldrb r0, [r4, #2]
|
yading@10
|
85 rac_get_prob r5, r6, r7, r8, r0, r9, r10
|
yading@10
|
86 ldrb r9, [lr, r5]
|
yading@10
|
87 bge 3f
|
yading@10
|
88
|
yading@10
|
89 add r4, r3, r3, lsl #5
|
yading@10
|
90 sxth r12, r11
|
yading@10
|
91 add r4, r4, r2
|
yading@10
|
92 adds r6, r6, r9
|
yading@10
|
93 add r4, r4, #11
|
yading@10
|
94 lsl r8, r8, r9
|
yading@10
|
95 it cs
|
yading@10
|
96 ldrhcs r10, [r7], #2
|
yading@10
|
97 lsl r9, r5, r9
|
yading@10
|
98 mov r5, #128
|
yading@10
|
99 it cs
|
yading@10
|
100 rev16cs r10, r10
|
yading@10
|
101 add r5, r5, r9, lsl #7
|
yading@10
|
102 T ittt cs
|
yading@10
|
103 T lslcs r10, r10, r6
|
yading@10
|
104 T orrcs r8, r8, r10
|
yading@10
|
105 A orrcs r8, r8, r10, lsl r6
|
yading@10
|
106 subcs r6, r6, #16
|
yading@10
|
107 lsr r5, r5, #8
|
yading@10
|
108 cmp r8, r5, lsl #16
|
yading@10
|
109 movrel r10, zigzag_scan-1
|
yading@10
|
110 itt ge
|
yading@10
|
111 subge r8, r8, r5, lsl #16
|
yading@10
|
112 subge r5, r9, r5
|
yading@10
|
113 ldrb r10, [r10, r3]
|
yading@10
|
114 it ge
|
yading@10
|
115 rsbge r12, r12, #0
|
yading@10
|
116 cmp r3, #16
|
yading@10
|
117 strh r12, [r1, r10]
|
yading@10
|
118 bge 6f
|
yading@10
|
119 5:
|
yading@10
|
120 ldrb r9, [lr, r5]
|
yading@10
|
121 ldrb r0, [r4]
|
yading@10
|
122 rac_get_prob r5, r6, r7, r8, r0, r9, r10
|
yading@10
|
123 pkhtb r11, r11, r11, asr #16
|
yading@10
|
124 bge 0b
|
yading@10
|
125
|
yading@10
|
126 6:
|
yading@10
|
127 ldr r0, [sp]
|
yading@10
|
128 ldr r9, [r0, #12]
|
yading@10
|
129 cmp r7, r9
|
yading@10
|
130 it hi
|
yading@10
|
131 movhi r7, r9
|
yading@10
|
132 stm r0, {r5-r7} @ high, bits, buf
|
yading@10
|
133 str r8, [r0, #16] @ code_word
|
yading@10
|
134
|
yading@10
|
135 add sp, sp, #8
|
yading@10
|
136 mov r0, r3
|
yading@10
|
137 pop {r4-r11,pc}
|
yading@10
|
138 2:
|
yading@10
|
139 add r4, r3, r3, lsl #5
|
yading@10
|
140 cmp r3, #16
|
yading@10
|
141 add r4, r4, r2
|
yading@10
|
142 pkhtb r11, r11, r11, asr #16
|
yading@10
|
143 bne 0b
|
yading@10
|
144 b 6b
|
yading@10
|
145 3:
|
yading@10
|
146 ldrb r0, [r4, #3]
|
yading@10
|
147 rac_get_prob r5, r6, r7, r8, r0, r9, r10
|
yading@10
|
148 ldrb r9, [lr, r5]
|
yading@10
|
149 bge 1f
|
yading@10
|
150
|
yading@10
|
151 mov r12, #2
|
yading@10
|
152 ldrb r0, [r4, #4]
|
yading@10
|
153 rac_get_prob r5, r6, r7, r8, r0, r9, r10
|
yading@10
|
154 it ge
|
yading@10
|
155 addge r12, #1
|
yading@10
|
156 ldrb r9, [lr, r5]
|
yading@10
|
157 blt 4f
|
yading@10
|
158 ldrb r0, [r4, #5]
|
yading@10
|
159 rac_get_prob r5, r6, r7, r8, r0, r9, r10
|
yading@10
|
160 it ge
|
yading@10
|
161 addge r12, #1
|
yading@10
|
162 ldrb r9, [lr, r5]
|
yading@10
|
163 b 4f
|
yading@10
|
164 1:
|
yading@10
|
165 ldrb r0, [r4, #6]
|
yading@10
|
166 rac_get_prob r5, r6, r7, r8, r0, r9, r10
|
yading@10
|
167 ldrb r9, [lr, r5]
|
yading@10
|
168 bge 3f
|
yading@10
|
169
|
yading@10
|
170 ldrb r0, [r4, #7]
|
yading@10
|
171 rac_get_prob r5, r6, r7, r8, r0, r9, r10
|
yading@10
|
172 ldrb r9, [lr, r5]
|
yading@10
|
173 bge 2f
|
yading@10
|
174
|
yading@10
|
175 mov r12, #5
|
yading@10
|
176 mov r0, #159
|
yading@10
|
177 rac_get_prob r5, r6, r7, r8, r0, r9, r10
|
yading@10
|
178 it ge
|
yading@10
|
179 addge r12, r12, #1
|
yading@10
|
180 ldrb r9, [lr, r5]
|
yading@10
|
181 b 4f
|
yading@10
|
182 2:
|
yading@10
|
183 mov r12, #7
|
yading@10
|
184 mov r0, #165
|
yading@10
|
185 rac_get_prob r5, r6, r7, r8, r0, r9, r10
|
yading@10
|
186 it ge
|
yading@10
|
187 addge r12, r12, #2
|
yading@10
|
188 ldrb r9, [lr, r5]
|
yading@10
|
189 mov r0, #145
|
yading@10
|
190 rac_get_prob r5, r6, r7, r8, r0, r9, r10
|
yading@10
|
191 it ge
|
yading@10
|
192 addge r12, r12, #1
|
yading@10
|
193 ldrb r9, [lr, r5]
|
yading@10
|
194 b 4f
|
yading@10
|
195 3:
|
yading@10
|
196 ldrb r0, [r4, #8]
|
yading@10
|
197 rac_get_prob r5, r6, r7, r8, r0, r9, r10
|
yading@10
|
198 it ge
|
yading@10
|
199 addge r4, r4, #1
|
yading@10
|
200 ldrb r9, [lr, r5]
|
yading@10
|
201 ite ge
|
yading@10
|
202 movge r12, #2
|
yading@10
|
203 movlt r12, #0
|
yading@10
|
204 ldrb r0, [r4, #9]
|
yading@10
|
205 rac_get_prob r5, r6, r7, r8, r0, r9, r10
|
yading@10
|
206 mov r9, #8
|
yading@10
|
207 it ge
|
yading@10
|
208 addge r12, r12, #1
|
yading@10
|
209 movrelx r4, X(ff_vp8_dct_cat_prob), r1
|
yading@10
|
210 lsl r9, r9, r12
|
yading@10
|
211 ldr r4, [r4, r12, lsl #2]
|
yading@10
|
212 add r12, r9, #3
|
yading@10
|
213 mov r1, #0
|
yading@10
|
214 ldrb r0, [r4], #1
|
yading@10
|
215 1:
|
yading@10
|
216 ldrb r9, [lr, r5]
|
yading@10
|
217 lsl r1, r1, #1
|
yading@10
|
218 rac_get_prob r5, r6, r7, r8, r0, r9, r10
|
yading@10
|
219 ldrb r0, [r4], #1
|
yading@10
|
220 it ge
|
yading@10
|
221 addge r1, r1, #1
|
yading@10
|
222 cmp r0, #0
|
yading@10
|
223 bne 1b
|
yading@10
|
224 ldrb r9, [lr, r5]
|
yading@10
|
225 add r12, r12, r1
|
yading@10
|
226 ldr r1, [sp, #4]
|
yading@10
|
227 4:
|
yading@10
|
228 add r4, r3, r3, lsl #5
|
yading@10
|
229 add r4, r4, r2
|
yading@10
|
230 add r4, r4, #22
|
yading@10
|
231 rac_get_128 r5, r6, r7, r8, r9, r10
|
yading@10
|
232 it ge
|
yading@10
|
233 rsbge r12, r12, #0
|
yading@10
|
234 smulbb r12, r12, r11
|
yading@10
|
235 movrel r9, zigzag_scan-1
|
yading@10
|
236 ldrb r9, [r9, r3]
|
yading@10
|
237 cmp r3, #16
|
yading@10
|
238 strh r12, [r1, r9]
|
yading@10
|
239 bge 6b
|
yading@10
|
240 b 5b
|
yading@10
|
241 endfunc
|
yading@10
|
242
|
yading@10
|
243 const zigzag_scan
|
yading@10
|
244 .byte 0, 2, 8, 16
|
yading@10
|
245 .byte 10, 4, 6, 12
|
yading@10
|
246 .byte 18, 24, 26, 20
|
yading@10
|
247 .byte 14, 22, 28, 30
|
yading@10
|
248 endconst
|