2 ; Copyright (c) 2010 The WebM project authors. All Rights Reserved.
4 ; Use of this source code is governed by a BSD-style license
5 ; that can be found in the LICENSE file in the root of the source
6 ; tree. An additional intellectual property rights grant can be found
7 ; in the file PATENTS. All contributing project authors may
8 ; be found in the AUTHORS file in the root of the source tree.
12 EXPORT |vp8_start_encode|
13 EXPORT |vp9_encode_bool|
14 EXPORT |vp8_stop_encode|
15 EXPORT |vp8_encode_value|
17 INCLUDE vp9_asm_enc_offsets.asm
23 AREA |.text|, CODE, READONLY
26 ; r1 unsigned char *source
28 |vp8_start_encode| PROC
32 str r12, [r0, #vp9_writer_lowvalue]
33 str r3, [r0, #vp9_writer_range]
34 str r12, [r0, #vp9_writer_value]
35 str r2, [r0, #vp9_writer_count]
36 str r12, [r0, #vp9_writer_pos]
37 str r1, [r0, #vp9_writer_buffer]
44 |vp9_encode_bool| PROC
49 ldr r2, [r0, #vp9_writer_lowvalue]
50 ldr r5, [r0, #vp9_writer_range]
51 ldr r3, [r0, #vp9_writer_count]
53 sub r7, r5, #1 ; range-1
56 mul r6, r4, r7 ; ((range-1) * probability)
59 add r4, r7, r6, lsr #8 ; 1 + (((range-1) * probability) >> 8)
61 addne r2, r2, r4 ; if (bit) lowvalue += split
62 subne r4, r5, r4 ; if (bit) range = range-split
64 ; Counting the leading zeros is used to normalize range.
66 sub r6, r6, #24 ; shift
68 ; Flag is set on the sum of count. This flag is used later
69 ; to determine if count >= 0
70 adds r3, r3, r6 ; count += shift
71 lsl r5, r4, r6 ; range <<= shift
72 bmi token_count_lt_zero ; if(count >= 0)
74 sub r6, r6, r3 ; offset = shift - count
75 sub r4, r6, #1 ; offset-1
76 lsls r4, r2, r4 ; if((lowvalue<<(offset-1)) & 0x80000000 )
77 bpl token_high_bit_not_set
79 ldr r4, [r0, #vp9_writer_pos] ; x
80 sub r4, r4, #1 ; x = w->pos-1
81 b token_zero_while_start
84 strb r9, [r7, r4] ; w->buffer[x] =(unsigned char)0
86 token_zero_while_start
88 ldrge r7, [r0, #vp9_writer_buffer]
91 beq token_zero_while_loop
93 ldr r7, [r0, #vp9_writer_buffer]
94 ldrb r9, [r7, r4] ; w->buffer[x]
96 strb r9, [r7, r4] ; w->buffer[x] + 1
97 token_high_bit_not_set
98 rsb r4, r6, #24 ; 24-offset
99 ldr r9, [r0, #vp9_writer_buffer]
100 lsr r7, r2, r4 ; lowvalue >> (24-offset)
101 ldr r4, [r0, #vp9_writer_pos] ; w->pos
102 lsl r2, r2, r6 ; lowvalue <<= offset
103 mov r6, r3 ; shift = count
104 add r1, r4, #1 ; w->pos++
105 bic r2, r2, #0xff000000 ; lowvalue &= 0xffffff
106 str r1, [r0, #vp9_writer_pos]
107 sub r3, r3, #8 ; count -= 8
108 strb r7, [r9, r4] ; w->buffer[w->pos++]
111 lsl r2, r2, r6 ; lowvalue <<= shift
113 str r2, [r0, #vp9_writer_lowvalue]
114 str r5, [r0, #vp9_writer_range]
115 str r3, [r0, #vp9_writer_count]
120 |vp8_stop_encode| PROC
123 ldr r2, [r0, #vp9_writer_lowvalue]
124 ldr r5, [r0, #vp9_writer_range]
125 ldr r3, [r0, #vp9_writer_count]
130 sub r7, r5, #1 ; range-1
132 mov r4, r7, lsl #7 ; ((range-1) * 128)
135 add r4, r7, r4, lsr #8 ; 1 + (((range-1) * 128) >> 8)
137 ; Counting the leading zeros is used to normalize range.
139 sub r6, r6, #24 ; shift
141 ; Flag is set on the sum of count. This flag is used later
142 ; to determine if count >= 0
143 adds r3, r3, r6 ; count += shift
144 lsl r5, r4, r6 ; range <<= shift
145 bmi token_count_lt_zero_se ; if(count >= 0)
147 sub r6, r6, r3 ; offset = shift - count
148 sub r4, r6, #1 ; offset-1
149 lsls r4, r2, r4 ; if((lowvalue<<(offset-1)) & 0x80000000 )
150 bpl token_high_bit_not_set_se
152 ldr r4, [r0, #vp9_writer_pos] ; x
153 sub r4, r4, #1 ; x = w->pos-1
154 b token_zero_while_start_se
155 token_zero_while_loop_se
157 strb r9, [r7, r4] ; w->buffer[x] =(unsigned char)0
159 token_zero_while_start_se
161 ldrge r7, [r0, #vp9_writer_buffer]
164 beq token_zero_while_loop_se
166 ldr r7, [r0, #vp9_writer_buffer]
167 ldrb r9, [r7, r4] ; w->buffer[x]
169 strb r9, [r7, r4] ; w->buffer[x] + 1
170 token_high_bit_not_set_se
171 rsb r4, r6, #24 ; 24-offset
172 ldr r9, [r0, #vp9_writer_buffer]
173 lsr r7, r2, r4 ; lowvalue >> (24-offset)
174 ldr r4, [r0, #vp9_writer_pos] ; w->pos
175 lsl r2, r2, r6 ; lowvalue <<= offset
176 mov r6, r3 ; shift = count
177 add r1, r4, #1 ; w->pos++
178 bic r2, r2, #0xff000000 ; lowvalue &= 0xffffff
179 str r1, [r0, #vp9_writer_pos]
180 sub r3, r3, #8 ; count -= 8
181 strb r7, [r9, r4] ; w->buffer[w->pos++]
183 token_count_lt_zero_se
184 lsl r2, r2, r6 ; lowvalue <<= shift
189 str r2, [r0, #vp9_writer_lowvalue]
190 str r5, [r0, #vp9_writer_range]
191 str r3, [r0, #vp9_writer_count]
199 |vp8_encode_value| PROC
204 ldr r2, [r0, #vp9_writer_lowvalue]
205 ldr r5, [r0, #vp9_writer_range]
206 ldr r3, [r0, #vp9_writer_count]
208 rsb r4, r10, #32 ; 32-n
210 ; v is kept in r1 during the token pack loop
211 lsl r1, r1, r4 ; r1 = v << 32 - n
214 sub r7, r5, #1 ; range-1
216 ; Decisions are made based on the bit value shifted
217 ; off of v, so set a flag here based on this.
218 ; This value is refered to as "bb"
219 lsls r1, r1, #1 ; bit = v >> n
220 mov r4, r7, lsl #7 ; ((range-1) * 128)
223 add r4, r7, r4, lsr #8 ; 1 + (((range-1) * 128) >> 8)
225 addcs r2, r2, r4 ; if (bit) lowvalue += split
226 subcs r4, r5, r4 ; if (bit) range = range-split
228 ; Counting the leading zeros is used to normalize range.
230 sub r6, r6, #24 ; shift
232 ; Flag is set on the sum of count. This flag is used later
233 ; to determine if count >= 0
234 adds r3, r3, r6 ; count += shift
235 lsl r5, r4, r6 ; range <<= shift
236 bmi token_count_lt_zero_ev ; if(count >= 0)
238 sub r6, r6, r3 ; offset = shift - count
239 sub r4, r6, #1 ; offset-1
240 lsls r4, r2, r4 ; if((lowvalue<<(offset-1)) & 0x80000000 )
241 bpl token_high_bit_not_set_ev
243 ldr r4, [r0, #vp9_writer_pos] ; x
244 sub r4, r4, #1 ; x = w->pos-1
245 b token_zero_while_start_ev
246 token_zero_while_loop_ev
248 strb r9, [r7, r4] ; w->buffer[x] =(unsigned char)0
250 token_zero_while_start_ev
252 ldrge r7, [r0, #vp9_writer_buffer]
255 beq token_zero_while_loop_ev
257 ldr r7, [r0, #vp9_writer_buffer]
258 ldrb r9, [r7, r4] ; w->buffer[x]
260 strb r9, [r7, r4] ; w->buffer[x] + 1
261 token_high_bit_not_set_ev
262 rsb r4, r6, #24 ; 24-offset
263 ldr r9, [r0, #vp9_writer_buffer]
264 lsr r7, r2, r4 ; lowvalue >> (24-offset)
265 ldr r4, [r0, #vp9_writer_pos] ; w->pos
266 lsl r2, r2, r6 ; lowvalue <<= offset
267 mov r6, r3 ; shift = count
268 add r11, r4, #1 ; w->pos++
269 bic r2, r2, #0xff000000 ; lowvalue &= 0xffffff
270 str r11, [r0, #vp9_writer_pos]
271 sub r3, r3, #8 ; count -= 8
272 strb r7, [r9, r4] ; w->buffer[w->pos++]
274 token_count_lt_zero_ev
275 lsl r2, r2, r6 ; lowvalue <<= shift
278 bne encode_value_loop
280 str r2, [r0, #vp9_writer_lowvalue]
281 str r5, [r0, #vp9_writer_range]
282 str r3, [r0, #vp9_writer_count]