avfilter/af_rubberband: fix sample overqueueing
[ffmpeg.git] / libavcodec / arm / vp8_armv6.S
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