Commit | Line | Data |
---|---|---|
2ba45a60 DM |
1 | /* |
2 | * Copyright (C) 2010 Mans Rullgard | |
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 | .macro rac_get_prob h, bs, buf, cw, pr, t0, t1 | |
24 | adds \bs, \bs, \t0 | |
25 | lsl \cw, \cw, \t0 | |
26 | lsl \t0, \h, \t0 | |
27 | rsb \h, \pr, #256 | |
28 | it cs | |
29 | ldrhcs \t1, [\buf], #2 | |
30 | smlabb \h, \t0, \pr, \h | |
31 | T itttt cs | |
32 | rev16cs \t1, \t1 | |
33 | A orrcs \cw, \cw, \t1, lsl \bs | |
34 | T lslcs \t1, \t1, \bs | |
35 | T orrcs \cw, \cw, \t1 | |
36 | subcs \bs, \bs, #16 | |
37 | lsr \h, \h, #8 | |
38 | cmp \cw, \h, lsl #16 | |
39 | itt ge | |
40 | subge \cw, \cw, \h, lsl #16 | |
41 | subge \h, \t0, \h | |
42 | .endm | |
43 | ||
44 | .macro rac_get_128 h, bs, buf, cw, t0, t1 | |
45 | adds \bs, \bs, \t0 | |
46 | lsl \cw, \cw, \t0 | |
47 | lsl \t0, \h, \t0 | |
48 | it cs | |
49 | ldrhcs \t1, [\buf], #2 | |
50 | mov \h, #128 | |
51 | it cs | |
52 | rev16cs \t1, \t1 | |
53 | add \h, \h, \t0, lsl #7 | |
54 | A orrcs \cw, \cw, \t1, lsl \bs | |
55 | T ittt cs | |
56 | T lslcs \t1, \t1, \bs | |
57 | T orrcs \cw, \cw, \t1 | |
58 | subcs \bs, \bs, #16 | |
59 | lsr \h, \h, #8 | |
60 | cmp \cw, \h, lsl #16 | |
61 | itt ge | |
62 | subge \cw, \cw, \h, lsl #16 | |
63 | subge \h, \t0, \h | |
64 | .endm | |
65 | ||
66 | function ff_decode_block_coeffs_armv6, export=1 | |
67 | push {r0,r1,r4-r11,lr} | |
68 | movrelx lr, X(ff_vp56_norm_shift) | |
69 | ldrd r4, r5, [sp, #44] @ token_prob, qmul | |
70 | cmp r3, #0 | |
71 | ldr r11, [r5] | |
72 | ldm r0, {r5-r7} @ high, bits, buf | |
73 | it ne | |
74 | pkhtbne r11, r11, r11, asr #16 | |
75 | ldr r8, [r0, #16] @ code_word | |
76 | 0: | |
77 | ldrb r9, [lr, r5] | |
78 | add r3, r3, #1 | |
79 | ldrb r0, [r4, #1] | |
80 | rac_get_prob r5, r6, r7, r8, r0, r9, r10 | |
81 | blt 2f | |
82 | ||
83 | ldrb r9, [lr, r5] | |
84 | ldrb r0, [r4, #2] | |
85 | rac_get_prob r5, r6, r7, r8, r0, r9, r10 | |
86 | ldrb r9, [lr, r5] | |
87 | bge 3f | |
88 | ||
89 | add r4, r3, r3, lsl #5 | |
90 | sxth r12, r11 | |
91 | add r4, r4, r2 | |
92 | adds r6, r6, r9 | |
93 | add r4, r4, #11 | |
94 | lsl r8, r8, r9 | |
95 | it cs | |
96 | ldrhcs r10, [r7], #2 | |
97 | lsl r9, r5, r9 | |
98 | mov r5, #128 | |
99 | it cs | |
100 | rev16cs r10, r10 | |
101 | add r5, r5, r9, lsl #7 | |
102 | T ittt cs | |
103 | T lslcs r10, r10, r6 | |
104 | T orrcs r8, r8, r10 | |
105 | A orrcs r8, r8, r10, lsl r6 | |
106 | subcs r6, r6, #16 | |
107 | lsr r5, r5, #8 | |
108 | cmp r8, r5, lsl #16 | |
109 | movrel r10, zigzag_scan-1 | |
110 | itt ge | |
111 | subge r8, r8, r5, lsl #16 | |
112 | subge r5, r9, r5 | |
113 | ldrb r10, [r10, r3] | |
114 | it ge | |
115 | rsbge r12, r12, #0 | |
116 | cmp r3, #16 | |
117 | strh r12, [r1, r10] | |
118 | bge 6f | |
119 | 5: | |
120 | ldrb r9, [lr, r5] | |
121 | ldrb r0, [r4] | |
122 | rac_get_prob r5, r6, r7, r8, r0, r9, r10 | |
123 | pkhtb r11, r11, r11, asr #16 | |
124 | bge 0b | |
125 | ||
126 | 6: | |
127 | ldr r0, [sp] | |
128 | ldr r9, [r0, #12] | |
129 | cmp r7, r9 | |
130 | it hi | |
131 | movhi r7, r9 | |
132 | stm r0, {r5-r7} @ high, bits, buf | |
133 | str r8, [r0, #16] @ code_word | |
134 | ||
135 | add sp, sp, #8 | |
136 | mov r0, r3 | |
137 | pop {r4-r11,pc} | |
138 | 2: | |
139 | add r4, r3, r3, lsl #5 | |
140 | cmp r3, #16 | |
141 | add r4, r4, r2 | |
142 | pkhtb r11, r11, r11, asr #16 | |
143 | bne 0b | |
144 | b 6b | |
145 | 3: | |
146 | ldrb r0, [r4, #3] | |
147 | rac_get_prob r5, r6, r7, r8, r0, r9, r10 | |
148 | ldrb r9, [lr, r5] | |
149 | bge 1f | |
150 | ||
151 | mov r12, #2 | |
152 | ldrb r0, [r4, #4] | |
153 | rac_get_prob r5, r6, r7, r8, r0, r9, r10 | |
154 | it ge | |
155 | addge r12, #1 | |
156 | ldrb r9, [lr, r5] | |
157 | blt 4f | |
158 | ldrb r0, [r4, #5] | |
159 | rac_get_prob r5, r6, r7, r8, r0, r9, r10 | |
160 | it ge | |
161 | addge r12, #1 | |
162 | ldrb r9, [lr, r5] | |
163 | b 4f | |
164 | 1: | |
165 | ldrb r0, [r4, #6] | |
166 | rac_get_prob r5, r6, r7, r8, r0, r9, r10 | |
167 | ldrb r9, [lr, r5] | |
168 | bge 3f | |
169 | ||
170 | ldrb r0, [r4, #7] | |
171 | rac_get_prob r5, r6, r7, r8, r0, r9, r10 | |
172 | ldrb r9, [lr, r5] | |
173 | bge 2f | |
174 | ||
175 | mov r12, #5 | |
176 | mov r0, #159 | |
177 | rac_get_prob r5, r6, r7, r8, r0, r9, r10 | |
178 | it ge | |
179 | addge r12, r12, #1 | |
180 | ldrb r9, [lr, r5] | |
181 | b 4f | |
182 | 2: | |
183 | mov r12, #7 | |
184 | mov r0, #165 | |
185 | rac_get_prob r5, r6, r7, r8, r0, r9, r10 | |
186 | it ge | |
187 | addge r12, r12, #2 | |
188 | ldrb r9, [lr, r5] | |
189 | mov r0, #145 | |
190 | rac_get_prob r5, r6, r7, r8, r0, r9, r10 | |
191 | it ge | |
192 | addge r12, r12, #1 | |
193 | ldrb r9, [lr, r5] | |
194 | b 4f | |
195 | 3: | |
196 | ldrb r0, [r4, #8] | |
197 | rac_get_prob r5, r6, r7, r8, r0, r9, r10 | |
198 | it ge | |
199 | addge r4, r4, #1 | |
200 | ldrb r9, [lr, r5] | |
201 | ite ge | |
202 | movge r12, #2 | |
203 | movlt r12, #0 | |
204 | ldrb r0, [r4, #9] | |
205 | rac_get_prob r5, r6, r7, r8, r0, r9, r10 | |
206 | mov r9, #8 | |
207 | it ge | |
208 | addge r12, r12, #1 | |
209 | movrelx r4, X(ff_vp8_dct_cat_prob), r1 | |
210 | lsl r9, r9, r12 | |
211 | ldr r4, [r4, r12, lsl #2] | |
212 | add r12, r9, #3 | |
213 | mov r1, #0 | |
214 | ldrb r0, [r4], #1 | |
215 | 1: | |
216 | ldrb r9, [lr, r5] | |
217 | lsl r1, r1, #1 | |
218 | rac_get_prob r5, r6, r7, r8, r0, r9, r10 | |
219 | ldrb r0, [r4], #1 | |
220 | it ge | |
221 | addge r1, r1, #1 | |
222 | cmp r0, #0 | |
223 | bne 1b | |
224 | ldrb r9, [lr, r5] | |
225 | add r12, r12, r1 | |
226 | ldr r1, [sp, #4] | |
227 | 4: | |
228 | add r4, r3, r3, lsl #5 | |
229 | add r4, r4, r2 | |
230 | add r4, r4, #22 | |
231 | rac_get_128 r5, r6, r7, r8, r9, r10 | |
232 | it ge | |
233 | rsbge r12, r12, #0 | |
234 | smulbb r12, r12, r11 | |
235 | movrel r9, zigzag_scan-1 | |
236 | ldrb r9, [r9, r3] | |
237 | cmp r3, #16 | |
238 | strh r12, [r1, r9] | |
239 | bge 6b | |
240 | b 5b | |
241 | endfunc | |
242 | ||
243 | const zigzag_scan | |
244 | .byte 0, 2, 8, 16 | |
245 | .byte 10, 4, 6, 12 | |
246 | .byte 18, 24, 26, 20 | |
247 | .byte 14, 22, 28, 30 | |
248 | endconst |