ArDrone SDK 1.8 added
[mardrone] / mardrone / ARDrone_SDK_Version_1_8_20110726 / ARDroneLib / VLIB / Platform / arm9_P6 / UVLC / uvlc_mb_layer_p6.S
1 #include "../video_utils_p6.h"
2
3 #ifdef HAS_UVLC_WRITE_BLOCK
4
5         .global uvlc_write_block
6         .type   uvlc_write_block, %function
7
8 /* This code is an inline version of uvlc_write_block using video_zztable_t81
9
10 void uvlc_write_block( video_stream_t* const stream, int16_t* data, int32_t num_coeff ) */
11
12 #define zz(num1, num2)                            \
13 video_zztable_t81_next_##num1:                    ;\
14         cmp     r1, #0                            ;\
15         addeq   r2, r2, #1;                        \
16         ldreqsh r1, [r4, #2*num2];                \
17         beq     video_zztable_t81_next_##num2;     \
18         sub     r3, r3, #1;                        \
19         bl      uvlc_encode;                       \
20         cmp     r3, #0;                            \
21         ldrgtsh r1, [r4, #2*num2];                \
22         ldmleia sp!, {r4, pc};                     \
23         mov     r2, #0;
24
25 uvlc_write_block:
26         stmdb   sp!, {r4, lr}
27
28         mov     r4, r1
29         ldrsh   r1, [r1, #0]
30         sub     r3, r2, #1
31         mov     r2, #10
32         bl      video_write_data
33         cmp     r3, #0
34         ldrgtsh r1, [r4, #2]
35         mov     r2, #0
36         ldmleia sp!, {r4, pc}
37 /*
38 r1 = code
39 r2 = run
40 r3 = num_coeff
41 */
42
43         zz(1,2)
44         zz(2,3)
45         zz(3,4)
46         zz(4,5)
47         zz(5,6)
48         zz(6,7)
49         zz(7,8)
50         zz(8,9)
51         zz(9,10)
52         zz(10,11)
53         zz(11,12)
54         zz(12,13)
55         zz(13,14)
56         zz(14,15)
57         zz(15,16)
58         zz(16,17)
59         zz(17,18)
60         zz(18,19)
61         zz(19,20)
62         zz(20,21)
63         zz(21,22)
64         zz(22,23)
65         zz(23,24)
66         zz(24,25)
67         zz(25,26)
68         zz(26,27)
69         zz(27,28)
70         zz(28,29)
71         zz(29,30)
72         zz(30,31)
73         zz(31,32)
74         zz(32,33)
75         zz(33,34)
76         zz(34,35)
77         zz(35,36)
78         zz(36,37)
79         zz(37,38)
80         zz(38,39)
81         zz(39,40)
82         zz(40,41)
83         zz(41,42)
84         zz(42,43)
85         zz(43,44)
86         zz(44,45)
87         zz(45,46)
88         zz(46,47)
89         zz(47,48)
90         zz(48,49)
91         zz(49,50)
92         zz(50,51)
93         zz(51,52)
94         zz(52,53)
95         zz(53,54)
96         zz(54,55)
97         zz(55,56)
98         zz(56,57)
99         zz(57,58)
100         zz(58,59)
101         zz(59,60)
102         zz(60,61)
103         zz(61,62)
104         zz(62,63)
105
106
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