ArDrone SDK 1.8 added
[mardrone] / mardrone / ARDrone_SDK_Version_1_8_20110726 / ARDroneLib / VLIB / Platform / arm9 / UVLC / uvlc_mb_layer_p5p.S
1 #include "../video_utils_p5p.h"
2
3 #ifdef HAS_UVLC_WRITE_BLOCK
4
5 #ifdef _ECOS
6 #include "config-tcm.h"
7
8         .section ".text.itcm","ax"
9 #endif // ! _ECOS
10
11
12         .global uvlc_write_block
13         .type   uvlc_write_block, %function
14
15 /* This code is an inline version of uvlc_write_block using video_zztable_t81
16
17 void uvlc_write_block( video_stream_t* const stream, int16_t* data, int32_t num_coeff ) */
18
19 #define zz(num1, num2)                            \
20 video_zztable_t81_next_##num1:                    ;\
21         cmp     r1, #0                            ;\
22         addeq   r2, r2, #1;                        \
23         ldreqsh r1, [r4, #2*num2];                \
24         beq     video_zztable_t81_next_##num2;     \
25         sub     r3, r3, #1;                        \
26         bl      uvlc_encode;                       \
27         cmp     r3, #0;                            \
28         ldrgtsh r1, [r4, #2*num2];                \
29         ldmleia sp!, {r4, pc};                     \
30         mov     r2, #0;
31
32 uvlc_write_block:
33         stmdb   sp!, {r4, lr}
34
35         mov     r4, r1
36         ldrsh   r1, [r1, #0]
37         sub     r3, r2, #1
38         mov     r2, #10
39         bl      video_write_data
40         cmp     r3, #0
41         ldrgtsh r1, [r4, #2]
42         mov     r2, #0
43         ldmleia sp!, {r4, pc}
44
45         zz(1, 8)
46         zz(8, 16)
47         zz(16, 9)
48         zz(9, 2)
49         zz(2, 3)
50         zz(3, 10)
51         zz(10, 17)
52         zz(17, 24)
53         zz(24, 32)
54         zz(32, 25)
55         zz(25, 18)
56         zz(18, 11)
57         zz(11, 4)
58         zz(4, 5)
59         zz(5, 12)
60         zz(12, 19)
61         zz(19, 26)
62         zz(26, 33)
63         zz(33, 40)
64         zz(40, 48)
65         zz(48, 41)
66         zz(41, 34)
67         zz(34, 27)
68         zz(27, 20)
69         zz(20, 13)
70         zz(13, 6)
71         zz(6, 7)
72         zz(7, 14)
73         zz(14, 21)
74         zz(21, 28)
75         zz(28, 35)
76         zz(35, 42)
77         zz(42, 49)
78         zz(49, 56)
79         zz(56, 57)
80         zz(57, 50)
81         zz(50, 43)
82         zz(43, 36)
83         zz(36, 29)
84         zz(29, 22)
85         zz(22, 15)
86         zz(15, 23)
87         zz(23, 30)
88         zz(30, 37)
89         zz(37, 44)
90         zz(44, 51)
91         zz(51, 58)
92         zz(58, 59)
93         zz(59, 52)
94         zz(52, 45)
95         zz(45, 38)
96         zz(38, 31)
97         zz(31, 39)
98         zz(39, 46)
99         zz(46, 53)
100         zz(53, 60)
101         zz(60, 61)
102         zz(61, 54)
103         zz(54, 47)
104         zz(47, 55)
105         zz(55, 62)
106         zz(62, 63)
107
108
109 video_zztable_t81_next_63:
110         mov     r3, #0
111         ldmia   sp!, {r4, lr}
112         b       uvlc_encode
113
114 /* This code is an optimized version of uvlc_write_block using video_zztable_t81
115
116 void uvlc_write_block( video_stream_t* const stream, int16_t* data, int32_t num_coeff ) */
117 /*
118 uvlc_write_block:
119         stmdb   sp!, {r4, r5, r6, lr}
120
121         mov     r4, r1
122         ldrsh   r1, [r1, #0]
123         sub     r3, r2, #1
124         mov     r2, #8
125         bl      video_write_data
126         mov     r2, #0
127         cmp     r3, #0
128         ldmleia sp!, {r4, r5, r6, pc}
129         ldr     r5, =video_zztable_t81
130
131 video_zztable_t81_next_1:
132         ldr     r6, [r5, #4]!
133         mov     r6, r6, lsl #1
134         ldrsh   r1, [r4, r6]
135         cmp     r1, #0
136         addeq   r2, r2, #1
137         beq     video_zztable_t81_next_1
138         sub     r3, r3, #1
139         bl      uvlc_encode
140         cmp     r3, #0
141         ldmleia sp!, {r4, r5, r6, pc}
142         mov     r2, #0
143         b video_zztable_t81_next_1
144 */
145
146 #endif // HAS_UVLC_WRITE_BLOCK