-rw-r--r-- | noncore/multimedia/opieplayer2/yuv2rgb_arm4l.S | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/noncore/multimedia/opieplayer2/yuv2rgb_arm4l.S b/noncore/multimedia/opieplayer2/yuv2rgb_arm4l.S index f4a3395..521bcaa 100644 --- a/noncore/multimedia/opieplayer2/yuv2rgb_arm4l.S +++ b/noncore/multimedia/opieplayer2/yuv2rgb_arm4l.S @@ -1,64 +1,85 @@ +/* +Copyright (c) 2001 Lionel Ulmer (lionel.ulmer@free.fr / bbrox@bbrox.org) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ + /* WARNING : this function only works when stride_U == stride_V (I use some hacks to not have to do too many computations at line's end)... C-like prototype : void convert_yuv420_rgb565(AVPicture *picture, unsigned char *results, int w, int h) ; */ #ifdef __arm__ .text .align .global convert_yuv420_rgb565 convert_yuv420_rgb565: stmdb sp!, { r4 - r12, lr } @ all callee saved regs ldr r7, [r0, #0] @ Y ptr ldr r9, [r0, #4] @ U ptr ldr r10, [r0, #8] @ V ptr subs r10, r10, r9 @ V ptr - U ptr ldr r8, [r0, #12] add r8, r8, r7 @ Y + stride_Y ldr r4, [r0, #12] @ Stride_Y mov r4, r4, lsl #1 sub r4, r4, r2 @ (2 * Stride_Y) - width ldr r5, [r0, #16] @ Stride_U sub r5, r5, r2, lsr #1 @ Stride_U - (width / 2) ldr r6, [r0, #20] @ Stride_V sub r6, r6, r2, lsr #1 @ Stride_V - (width / 2) add r0, r1, r2, lsl #1 @ RGB + 1 stmdb sp!, { r0-r10 } @ Stack description : @ (sp+ 0) RGB + one line @ (sp+ 4) RGB @ (sp+ 8) width (save) @ (sp+12) height @ (sp+16) (2 * stride_Y) - width @ (sp+20) stride_U - (width / 2) @ (sp+24) stride_V - (width / 2) !!! UNUSED !!! @ (sp+28) Y ptr @ (sp+32) Y ptr + one line @ (sp+36) U ptr @ (sp+40) V - U mov lr, r2 @ Initialize the width counter add r0, pc, #(const_storage-.-8) @ r0 = base pointer to the constants array ldr r8, [r0, #(4*4)] @ r8 = multy yuv_loop: add r0, pc, #(const_storage-.-8) @ r0 = base pointer to the constants array ldr r10, [sp, #28] @ r10 = Y ldr r1, [sp, #36] @ r1 = U ldrb r9, [r10, #0] @ r9 = *Y ldrb r11, [r1] @ r11 = *U add r1, r1, #1 @ r1 = U++ ldr r2, [sp, #40] @ r2 = V - U str r1, [sp, #36] @ store U++ add r2, r1, r2 @ r2 = V+1 ldrb r12, [r2, #-1] @ r12 = *V sub r11, r11, #128 @ r11 = *U - 128 sub r12, r12, #128 @ r12 = *V - 128 ldr r1, [r0, #(4*0)] @ r1 = crv mov r7, #32768 @ r7 = 32768 (for additions in MLA) ldr r2, [r0, #(4*3)] @ r2 = -cgv mla r6, r1, r12, r7 @ r6 = nonyc_r = crv * (*V - 128) + 32768 ldr r3, [r0, #(4*1)] @ r3 = cbu |