⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 asmcode.txt

📁 asm code for yuv to rgb conversion function
💻 TXT
字号:
/*Copyright (c) 2001 Lionel Ulmer (lionel.ulmer@free.fr / bbrox@bbrox.org)Permission is hereby granted, free of charge, to any person obtaining a copyof this software and associated documentation files (the "Software"), to dealin the Software without restriction, including without limitation the rightsto use, copy, modify, merge, publish, distribute, sublicense, and/or sellcopies of the Software, and to permit persons to whom the Software isfurnished to do so, subject to the following conditions:The above copyright notice and this permission notice shall be included inall copies or substantial portions of the Software.THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS ORIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THECOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHERIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR INCONNECTION 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, unsigned char *_py,unsigned char *_pu,unsigned char *_pv);*/#ifdef __arm__	.text  .align		.global convert_yuv420_rgb565convert_yuv420_rgb565:  	stmdb   sp!, { r4 - r12, lr }   @ all callee saved regs  ldr r7,[r0,#0]                  @dest width 	ldr r9,[r0,#4]                  @dest height 	ldr r10,[r0, #12]               @ sourcewidth 	ldr r5,  [r0, #16]              @ source_height  mul r4,r5,r10                   @zll  mov r4,r4,lsr#2                 @ Vptr - U ptr  ldr r6,  [r0, #20]              @  rgbstrid  ldr r8,[r0, #12]                @zll width	add r8, r8, r2                  @ Y + stride_Y  add r0,r1,r6                    @ RGB + 1	stmdb   sp!, { r0-r10 }	@ Stack description :	@ (sp+ 0) RGB + one line  r0 	@ (sp+ 4) RGB             r1	@ (sp+ 8) _py             r2	@ (sp+12) _pu             r3	@ (sp+16) _pv - _pu       r4  	@ (sp+20) sourceheight    r5	@ (sp+24) rgbstrid        r6 	@ (sp+28) destwidth       r7  	@ (sp+32) Ynext           r8	@ (sp+36) destheight      r9	@ (sp+40) sourcewidth     r10                 	mov lr,r10                         @ 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, #8]                 @ r10 = Y    ...	ldr r1, [sp, #12]                  @ r1 = U    ...	ldrb r9, [r10, #0]                 @ r9 = *Y    ...	ldrb r11, [r1]                     @ r11 = *U   	add r1, r1, #1                     @ r1 = U++	ldr r2, [sp, #16]                  @ r2 = V - U ...	str r1, [sp, #12]                  @ store U++	add r2, r2, r1                     @ 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	mla r4, r2, r12, r7                @ r4 = - cgv * (*V - 128) + 32768	sub r9, r9, #16                    @ r9 = *Y - 16	mla r5, r3, r11, r7                @ r5 = nonyc_b = cbu * (*U - 128) + 32768		ldr r0, [r0, #(4*2)]               @ r0 = -cgu	mla r7, r8, r9, r6                 @ r7 = (*Y - 16) * multy + nonyc_r	add r10, r10, #2                   @ r10 = Y + 2	mla r4, r0, r11, r4                @ r4 = nonyc_g = - cgu * (*U - 128) + r4 = - cgu * (*U - 128) - cgv * (*V - 128) + 32768	add r0, pc, #(rb_clip-.-8)         @ r0 contains the pointer to the R and B clipping array	mla r12, r8, r9, r5                @ r12 = (*Y - 16) * multy + nonyc_b	ldrb r7, [r0, r7, asr #(16+3)]     @ r7 = R composant	mla r1, r8, r9, r4                 @ r1 = (*Y - 16) * multy + nonyc_g	ldrb r9, [r10, #-1]                @ r9 = *(Y+1)	str r10, [sp, #8]                 @ save Y + 2	ldrb r12, [r0, r12, asr #(16+3)]   @ r12 = B composant (and the start of the RGB word)	add r11, pc, #(g_clip-.-8)         @ r11 now contains the pointer to the G clipping array	ldrb r1, [r11, r1, asr #(16+2)]    @ r1 contains the G part of the RGB triplet	sub r9, r9, #16                    @ r9 = *(Y+1) - 16	mla r10, r8, r9, r6                @ r10 is the Red part of the RGB triplet	add r12, r12, r7, lsl #11          @ r12 = .GB ...	mla r7, r8, r9, r5                 @ r7 is the Blue part of the RGB triplet	add r12, r12, r1, lsl #5           @ r12 = RGB ... (ie the first pixel (half-word) is done)	mla r2, r8, r9, r4                 @ r2 is the Green part of the RGB triplet	ldrb r10, [r0, r10, asr #(16+3)]   @ r10 = R composant	ldrb r7, [r0, r7, asr #(16+3)]     @ r7 = B composant	ldr r1, [sp, #32]                  @ r1 = Ynext	ldrb r2, [r11, r2, asr #(16+2)]    @ r2 = G composant	ldrb r9, [r1]                      @ r9 = *Ynext	add r12, r12, r2, lsl #(5+16)      @ r12 = RGB .G.	sub r9, r9, #16                    @ r9 = *Ynext - 16	mla r2, r8, r9, r4                 @ r2 is the Green part of the RGB triplet	add r12, r12, r7, lsl #(0+16)      @ r12 = RGB .GB	mla r7, r8, r9, r5                 @ r7 is the Blue part of the RGB triplet	add r12, r12, r10, lsl #(11+16)    @ r12 = RGB RGB	ldr r3, [sp, #4]                   @ r3 = RGB	mla r10, r8, r9, r6                @ r10 is the Red part of the RGB triplet	str r12, [r3]                      @ store the rgb pixel at *RGB	add r3, r3, #4                     @ r3 = RGB++ (ie next double-pixel)	str r3, [sp, #4]                   @ store the RGB pointer	ldrb r9, [r1, #1]                  @ r9 = *(Ynext+1)	add r1, r1, #2                     @ r1 = Ynext + 2	sub r9, r9, #16                    @ r9 = *(Ynext+1) - 16	ldrb r12, [r0, r7, asr #(16+3)]    @ r12 = ..B ...	ldrb r10, [r0, r10, asr #(16+3)]   @ r10 = B composant	mla r7, r8, r9, r5                 @ r7 is the Blue part of the RGB triplet	add r12, r12, r10, lsl #11         @ r12 = R.B ...	ldrb r2, [r11, r2, asr #(16+2)]    @ r2 = G composant	mla r10, r8, r9, r6                @ r10 is the Red part of the RGB triplet	add r12, r12, r2, lsl #5           @ r12 = RGB ...	mla r2, r8, r9, r4                 @ r2 is the Green part of the RGB triplet	ldrb r7, [r0, r7, asr #(16+3)]     @ r7 = B composant	str r1, [sp, #32]                  @ store the increased Ynext pointer	add r12, r12, r7, lsl #(16+0)      @ r12 = RGB ..B	ldrb r10, [r0, r10, asr #(16+3)]   @ r10 = R composant	ldr r3, [sp, #0]                   @ r3 = RGBnext pointer	add r12, r12, r10, lsl #(16+11)    @ r12 = RGB R.B	ldrb r2, [r11, r2, asr #(16+2)]    @ r2 = G composant	add r3, r3, #4                     @ r3 = next pixel on the RGBnext line	add r12, r12, r2, lsl #(16+5)      @ r12 = RGB RGB	str r12, [r3, #-4]                 @ store the next pixel	str r3, [sp, #0]                   @ store the increased 'next line' pixel pointer	subs lr, lr, #2                    @ decrement the line counter	bne yuv_loop                       @ and restart if not at the end of the line	ldr r0, [sp, #40]                  @ r0 = saved sourcewidth  ....    	ldr r1, [sp, #0]                   @ r1 = RGBnext pointer  ldr r2, [sp, #24]                  @ zll rgbstrid   mov lr, r0                         @ lr = saved width (to restart the line counter)    subs r3,r2,r0,lsl#1                @ (rgbstride - 2 width)  add  r1,r1,r3                      @  the nest two RGBline	str r1, [sp, #4]                   @ current RGBnext pointer is next iteration RGB pointer  add r1,r1,r2                       @ r1 = update RGBnext to next line	str r1, [sp, #0]                   @ store updated RGBnext pointer	ldr r3, [sp, #40]                  @ sourcewidth	ldr r4, [sp, #8]                   @ r4 = Y ptr	ldr r5, [sp, #32]                  @ r5 = Ynext ptr    add r4, r4, r3                     @ r4 = Y ptr for the next two lines  add r5, r5, r3                     @ r5 = Ynext ptr for the next two lines  str r4, [sp, #8]                  @ store updated Y pointer	str r5, [sp, #32]                  @ store update Ynext pointer 	ldr r6, [sp, #20]                  @ get height counter	subs r6, r6, #2	str r6, [sp, #20]	bne yuv_loop		@ Exit cleanly :-)	add sp, sp, #(11*4)             @ remove all custom things from stack	ldmia   sp!, { r4 - r12, pc }   @ restore callee saved regs and returnconst_storage:	@ In order : crv, cbu, - cgu, - cgv, multy	.word 0x00019895, 0x00020469, 0xffff9bb5, 0xffff2fe1, 0x00012A15rb_clip_dummy:	        .byte 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00        .byte 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00        .byte 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00rb_clip:        .byte 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f        .byte 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f        .byte 0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f        .byte 0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f        .byte 0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1fg_clip_dummy:	        .byte 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00        .byte 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00        .byte 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00        .byte 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00        .byte 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00        .byte 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00g_clip:	        .byte 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f        .byte 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f        .byte 0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2a,0x2b,0x2c,0x2d,0x2e,0x2f        .byte 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f        .byte 0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f        .byte 0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f        .byte 0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f        .byte 0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f        .byte 0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f        .byte 0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -