ArDrone SDK 1.8 added
[mardrone] / mardrone / ARDrone_SDK_Version_1_8_20110726 / ARDroneLib / VLIB / Platform / arm9 / UVLC / uvlc_mb_layer_p5p.S
diff --git a/mardrone/ARDrone_SDK_Version_1_8_20110726/ARDroneLib/VLIB/Platform/arm9/UVLC/uvlc_mb_layer_p5p.S b/mardrone/ARDrone_SDK_Version_1_8_20110726/ARDroneLib/VLIB/Platform/arm9/UVLC/uvlc_mb_layer_p5p.S
new file mode 100644 (file)
index 0000000..b4cfcd8
--- /dev/null
@@ -0,0 +1,146 @@
+#include "../video_utils_p5p.h"
+
+#ifdef HAS_UVLC_WRITE_BLOCK
+
+#ifdef _ECOS
+#include "config-tcm.h"
+
+        .section ".text.itcm","ax"
+#endif // ! _ECOS
+
+
+        .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}
+
+        zz(1, 8)
+        zz(8, 16)
+        zz(16, 9)
+        zz(9, 2)
+        zz(2, 3)
+        zz(3, 10)
+        zz(10, 17)
+        zz(17, 24)
+        zz(24, 32)
+        zz(32, 25)
+        zz(25, 18)
+        zz(18, 11)
+        zz(11, 4)
+        zz(4, 5)
+        zz(5, 12)
+        zz(12, 19)
+        zz(19, 26)
+        zz(26, 33)
+        zz(33, 40)
+        zz(40, 48)
+        zz(48, 41)
+        zz(41, 34)
+        zz(34, 27)
+        zz(27, 20)
+        zz(20, 13)
+        zz(13, 6)
+        zz(6, 7)
+        zz(7, 14)
+        zz(14, 21)
+        zz(21, 28)
+        zz(28, 35)
+        zz(35, 42)
+        zz(42, 49)
+        zz(49, 56)
+        zz(56, 57)
+        zz(57, 50)
+        zz(50, 43)
+        zz(43, 36)
+        zz(36, 29)
+        zz(29, 22)
+        zz(22, 15)
+        zz(15, 23)
+        zz(23, 30)
+        zz(30, 37)
+        zz(37, 44)
+        zz(44, 51)
+        zz(51, 58)
+        zz(58, 59)
+        zz(59, 52)
+        zz(52, 45)
+        zz(45, 38)
+        zz(38, 31)
+        zz(31, 39)
+        zz(39, 46)
+        zz(46, 53)
+        zz(53, 60)
+        zz(60, 61)
+        zz(61, 54)
+        zz(54, 47)
+        zz(47, 55)
+        zz(55, 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