ArDrone SDK 1.8 added
[mardrone] / mardrone / ARDrone_SDK_Version_1_8_20110726 / ARDroneLib / VLIB / Platform / arm9_P6 / UVLC / uvlc_mb_layer_p6.S
diff --git a/mardrone/ARDrone_SDK_Version_1_8_20110726/ARDroneLib/VLIB/Platform/arm9_P6/UVLC/uvlc_mb_layer_p6.S b/mardrone/ARDrone_SDK_Version_1_8_20110726/ARDroneLib/VLIB/Platform/arm9_P6/UVLC/uvlc_mb_layer_p6.S
new file mode 100644 (file)
index 0000000..4eb9ae6
--- /dev/null
@@ -0,0 +1,146 @@
+#include "../video_utils_p6.h"
+
+#ifdef HAS_UVLC_WRITE_BLOCK
+
+        .global uvlc_write_block
+        .type   uvlc_write_block, %function
+
+/* This code is an inline version of uvlc_write_block using video_zztable_t81
+
+void uvlc_write_block( video_stream_t* const stream, int16_t* data, int32_t num_coeff ) */
+
+#define zz(num1, num2)                            \
+video_zztable_t81_next_##num1:                    ;\
+        cmp     r1, #0                            ;\
+        addeq   r2, r2, #1;                        \
+        ldreqsh r1, [r4, #2*num2];                \
+        beq     video_zztable_t81_next_##num2;     \
+        sub     r3, r3, #1;                        \
+        bl      uvlc_encode;                       \
+        cmp     r3, #0;                            \
+        ldrgtsh r1, [r4, #2*num2];                \
+        ldmleia sp!, {r4, pc};                     \
+        mov     r2, #0;
+
+uvlc_write_block:
+        stmdb   sp!, {r4, lr}
+
+        mov     r4, r1
+        ldrsh   r1, [r1, #0]
+        sub     r3, r2, #1
+        mov     r2, #10
+        bl      video_write_data
+        cmp     r3, #0
+        ldrgtsh r1, [r4, #2]
+        mov     r2, #0
+        ldmleia sp!, {r4, pc}
+/*
+r1 = code
+r2 = run
+r3 = num_coeff
+*/
+
+        zz(1,2)
+        zz(2,3)
+        zz(3,4)
+        zz(4,5)
+        zz(5,6)
+        zz(6,7)
+        zz(7,8)
+        zz(8,9)
+        zz(9,10)
+        zz(10,11)
+        zz(11,12)
+        zz(12,13)
+        zz(13,14)
+        zz(14,15)
+        zz(15,16)
+        zz(16,17)
+        zz(17,18)
+        zz(18,19)
+        zz(19,20)
+        zz(20,21)
+        zz(21,22)
+        zz(22,23)
+        zz(23,24)
+        zz(24,25)
+        zz(25,26)
+        zz(26,27)
+        zz(27,28)
+        zz(28,29)
+        zz(29,30)
+        zz(30,31)
+        zz(31,32)
+        zz(32,33)
+        zz(33,34)
+        zz(34,35)
+        zz(35,36)
+        zz(36,37)
+        zz(37,38)
+        zz(38,39)
+        zz(39,40)
+        zz(40,41)
+        zz(41,42)
+        zz(42,43)
+        zz(43,44)
+        zz(44,45)
+        zz(45,46)
+        zz(46,47)
+        zz(47,48)
+        zz(48,49)
+        zz(49,50)
+        zz(50,51)
+        zz(51,52)
+        zz(52,53)
+        zz(53,54)
+        zz(54,55)
+        zz(55,56)
+        zz(56,57)
+        zz(57,58)
+        zz(58,59)
+        zz(59,60)
+        zz(60,61)
+        zz(61,62)
+        zz(62,63)
+
+
+
+
+video_zztable_t81_next_63:
+        mov     r3, #0
+        ldmia   sp!, {r4, lr}
+        b       uvlc_encode
+
+/* This code is an optimized version of uvlc_write_block using video_zztable_t81
+
+void uvlc_write_block( video_stream_t* const stream, int16_t* data, int32_t num_coeff ) */
+/*
+uvlc_write_block:
+        stmdb   sp!, {r4, r5, r6, lr}
+
+        mov     r4, r1
+        ldrsh   r1, [r1, #0]
+        sub     r3, r2, #1
+        mov     r2, #8
+        bl      video_write_data
+        mov     r2, #0
+        cmp     r3, #0
+        ldmleia sp!, {r4, r5, r6, pc}
+        ldr     r5, =video_zztable_t81
+
+video_zztable_t81_next_1:
+        ldr     r6, [r5, #4]!
+        mov     r6, r6, lsl #1
+        ldrsh   r1, [r4, r6]
+        cmp     r1, #0
+        addeq   r2, r2, #1
+        beq     video_zztable_t81_next_1
+        sub     r3, r3, #1
+        bl      uvlc_encode
+        cmp     r3, #0
+        ldmleia sp!, {r4, r5, r6, pc}
+        mov     r2, #0
+        b video_zztable_t81_next_1
+*/
+
+#endif // HAS_UVLC_WRITE_BLOCK