📄 yuvtorgb.asm
字号:
.nolist
INCLUDE iammx.inc ; IAMMX Emulator Macros
.list
.586p
.model FLAT
.data
ALIGN 8
UVOff DQ 00080008000800080h
UVCoe1 DQ 0E9FAD24C4B570000h
;Coeff of convert U V to G-Y B-Y
;-0.34414 -0.71414 1.1772 0
; G-Y B-Y
UVCoe2 DQ 04B570000000059BAh
;Coeff of convert U V to B-Y R-Y
;1.1772 0 0 1.402
; B-Y R-Y
UVCoe3 DQ 059BAE9FAD24Ch
;Coeff of convert U V to R-Y G-Y
;0 1.402 -0.34414 -0.71414
; R-Y G-Y
AndMask1 DQ 0FFFFFFFFFFFFh
AndMask2 DQ 0FFFFFFFFh
AndMask3 DQ 0FFFF000000000000h
AndMask4 DQ 0FFFFh
AndMask5 DQ 0FFFFFFFF00000000h
AndMask6 DQ 0FFFFFFFFFFFF0000h
.const
.code
COMMENT ^
void YUVRGBTwoLine (
BYTE *Y,
BYTE *U,
BYTE *V,
BYTE *RGB,
int Pixel,
BYTE *LTemp
);
^
;
; X X X X X X X X
; U0 U1 U2 U3
; V0 V1 V2 V3
; Y00 Y01 Y10 Y11 Y20 Y21 Y30 Y31
; Y02 Y03 Y12 Y13 Y22 Y23 Y32 Y33
; X X X X X X X X
;
;
YUVRGBTwoLine PROC NEAR C USES ESI EDI EAX EBX ECX EDX,
Y:PTR BYTE,U:PTR BYTE,V:PTR BYTE,RGB:PTR BYTE,
Pixel:DWORD,LTemp: PTR BYTE
; above (commented) line is an example of declaring local parameters
mov ebx, Pixel
mov esi, U
mov edx, ebx
xor eax, eax
mov ecx, ebx
mov edi, V
add edx, ebx
add edx, ebx
LINELOOP:
movq mm0, [esi+eax] ;U Pipe
pxor mm7, mm7 ;V
movq mm1, [edi+eax] ;U
punpcklbw mm0, mm7 ;V
psubw mm0,dword ptr UVOff ;U
punpcklbw mm1, mm7 ;V
psubw mm1,dword ptr UVOff ;U
;mm0--U3-128 U2-128 U1-128 U0-128
;mm1--V3-128 V2-128 V1-128 V0-128
movq mm2, mm0 ;V
movq mm3, mm1 ;U
punpcklwd mm3, mm2 ;U
movq mm5, mm3 ;U
movq mm4, mm3 ;V
pmaddwd mm4,dword ptr UVCoe2 ;U
punpckldq mm3, mm3 ;V
pmaddwd mm3,dword ptr UVCoe1 ;U
punpckhdq mm5, mm5 ;V
pmaddwd mm5,dword ptr UVCoe3 ;U
movq mm2, mm0 ;V
psrad mm4, 14 ;U
movq mm6, mm1 ;V
punpckhwd mm6, mm2 ;U
psrad mm3, 14 ;U
movq mm7, mm6 ;V
mov edi, LTemp
punpckhdq mm7, mm7 ;V
pmaddwd mm7,dword ptr UVCoe3 ;U
packssdw mm3, mm4 ;V
psrad mm5, 14 ;U
;mm3--B1-Y R0-Y G0-Y B0-Y
;mm5-- R1-Y G1-Y
movq mm4, mm6 ;V
pmaddwd mm4,dword ptr UVCoe2 ;U
punpckldq mm6, mm6 ;V
pmaddwd mm6,dword ptr UVCoe1 ;U
movq mm2, mm3 ;V
movq [edi+56],mm3 ;U
psrad mm7, 14 ;V
pand mm3,dword ptr AndMask1;U
psrad mm4, 14 ;V
psrad mm6, 14 ;U
packssdw mm5, mm6 ;U
psllq mm2, 48 ;U
packssdw mm4, mm7 ;U
;mm3--B1-Y R0-Y G0-Y B0-Y
;mm5--G2-Y B2-Y R1-Y G1-Y
;mm4--R3-Y G3-Y B3-Y R2-Y
por mm3, mm2 ;V
movq [edi+48],mm5 ;U
movq mm2, mm3 ;V
psrlq mm2, 16 ;U
movq mm6, mm2 ;U
pand mm6,dword ptr AndMask2;U
;mm6--B0-Y R0-Y G0-Y B0-Y
;mm3-- 0 0 R0-Y G0-Y
movq mm2, [edi+56] ;U
psllq mm5, 32 ;V
pand mm2, dword ptr AndMask3;U
mov esi, Y
psrlq mm2, 32 ;V
movq [edi], mm3 ;U
por mm5, mm2 ;V
movq mm7, mm5 ;U
movq mm2, mm5 ;V
add esi, ebx
psrlq mm2, 48 ;V
sub esi, ecx
por mm5, mm2 ;V
movq mm2, [edi+48] ;U
psllq mm7, 16 ;V
psrlq mm2, 32 ;U
por mm6, mm7 ;V
;mm6--B0-Y R0-Y G0-Y B0-Y
;mm3--G1-Y B1-Y R0-Y G0-Y
;mm5--R1-Y G1-Y B1-Y R1-Y
movq [edi+16],mm5 ;U
movq mm5, mm4 ;V
pand mm5, dword ptr AndMask4;U
movq [edi+8],mm6 ;U
psllq mm5, 32 ;V
por mm2, mm5 ;U
movq mm6, mm4 ;V
movq mm5, mm2 ;U
psllq mm6, 16 ;V
movq mm3, mm2 ;U
psllq mm5, 48 ;V
pand mm6, dword ptr AndMask5;U
psrlq mm3, 16 ;V
por mm2, mm5 ;U
por mm3, mm6 ;V
;mm2--B2-Y R2-Y G2-Y B2-Y
;mm3--G3-Y B3-Y R2-Y G2-Y
movq mm0, [esi] ;U
movq mm5, mm4 ;V
pand mm4, dword ptr AndMask6;U
psrlq mm5, 48 ;V
movq [edi+24],mm2 ;U
por mm4, mm5 ;V
;mm4--R3-Y G3-Y B3-Y R3-Y
movq [edi+32],mm3 ;U
pxor mm5, mm5 ;V
mov esi, RGB
movq mm1, mm0 ;V
movq [edi+40],mm4 ;U
punpcklbw mm1, mm5 ;V
;[LTemp] --B0-Y R0-Y G0-Y B0-Y
;[LTemp+8] --G1-Y B1-Y R0-Y G0-Y
;[LTemp+16]--R1-Y G1-Y B1-Y R1-Y
;[LTemp+24]--B2-Y R2-Y G2-Y B2-Y
;[LTemp+32]--G3-Y B3-Y R2-Y G2-Y
;[LTemp+40]--R3-Y G3-Y B3-Y R3-Y
;mm0--Y31 Y30 Y21 Y20 Y11 Y10 Y01 Y00
;mm1-- Y11 Y10 Y01 Y00
movq mm2, mm1 ;U
add esi, edx
pxor mm7, mm7 ;U
sub esi, ecx
movq mm3, mm2 ;U
sub esi, ecx
punpckhbw mm0, mm7 ;U
sub esi, ecx
punpcklwd mm2, mm2 ;U
;mm2--Y01 Y01 Y00 Y00
punpckldq mm2, mm2 ;U
movq mm7, mm0 ;V
pand mm2,dword ptr AndMask1;U
psrlq mm3, 32 ;V
;mm3--0 0 Y01 Y01
;mm2--Y00 Y00 Y00 Y00
movq mm4, mm3 ;U
punpcklwd mm7, mm7 ;V
psllq mm4, 48 ;U
movq mm6, mm7 ;V
por mm2, mm4 ;U
psrlq mm6, 32 ;V
;mm2--Y01 Y00 Y00 Y00
movq mm4, mm1 ;U
punpckldq mm7, mm7 ;V
punpckhwd mm4, mm4 ;U
movq mm1, mm6 ;V
;mm4--Y11 Y11 Y10 Y10
psllq mm1, 48 ;U
movq mm5, mm4 ;V
pand mm7,dword ptr AndMask1;U
psllq mm5, 32 ;V
por mm3, mm5 ;U
;mm3--Y10 Y10 Y01 Y01
punpckhdq mm4, mm4 ;V
pand mm4, dword ptr AndMask6;U
;mm4--Y11 Y11 Y11 0
psrlq mm5, 48 ;V
paddw mm2, [edi] ;U
por mm4, mm5 ;V
;mm4--Y11 Y11 Y11 Y10
paddw mm3, [edi+8] ;U
por mm7, mm1 ;V
packuswb mm2, mm3 ;U
movq mm5, mm0 ;V
paddw mm4, [edi+16] ;U
punpckhwd mm5, mm5 ;V
paddw mm7, [edi+24] ;U
movq mm1, mm5 ;V
movq [esi], mm2 ;U
psllq mm1, 32 ;V
;mm0--Y31 Y30 Y21 Y20
;mm7--Y21 Y21 Y20 Y20
;mm6--0 0 Y21 Y21
;mm7--Y20 Y20 Y20 Y20
;mm7--Y21 Y20 Y20 Y20
;mm5--Y31 Y31 Y30 Y30
por mm6, mm1 ;U
punpckhdq mm5, mm5 ;V
pand mm5, dword ptr AndMask6;U
;mm5--Y31 Y31 Y31 0
psrlq mm1, 48 ;V
por mm5, mm1 ;U
packuswb mm4, mm7 ;V
;mm5--Y31 Y31 Y31 Y30
paddw mm6, [edi+32] ;U
pxor mm7, mm7 ;V
paddw mm5, [edi+40] ;U
movq [esi+8],mm4 ;U
packuswb mm6, mm5 ;V
movq [esi+16],mm6 ;U
mov esi, Y
add esi, ebx
add esi, ebx
sub esi, ecx
;The next line of Y
movq mm0, [esi] ;U
movq mm1, mm0 ;U
punpcklbw mm1, mm7 ;U
movq mm2, mm1 ;U
mov esi, RGB
punpcklwd mm2, mm2 ;V
sub esi, ecx
movq mm3, mm2 ;V
sub esi, ecx
punpckhbw mm0, mm7 ;V
sub esi, ecx
punpckldq mm2, mm2 ;V
;mm0--Y31 Y30 Y21 Y20 Y11 Y10 Y01 Y00
;mm1-- Y11 Y10 Y01 Y00
;mm2--Y01 Y01 Y00 Y00
movq mm7, mm0 ;V
pand mm2,dword ptr AndMask1;U
psrlq mm3, 32 ;V
;mm3--0 0 Y01 Y01
;mm2--Y00 Y00 Y00 Y00
movq mm4, mm3 ;U
punpcklwd mm7, mm7 ;V
psllq mm4, 48 ;U
movq mm6, mm7 ;V
por mm2, mm4 ;U
psrlq mm6, 32 ;V
;mm2--Y01 Y00 Y00 Y00
movq mm4, mm1 ;U
punpckldq mm7, mm7 ;V
punpckhwd mm4, mm4 ;U
movq mm1, mm6 ;V
;mm4--Y11 Y11 Y10 Y10
psllq mm1, 48 ;U
movq mm5, mm4 ;V
pand mm7,dword ptr AndMask1;U
psllq mm5, 32 ;V
por mm3, mm5 ;U
;mm3--Y10 Y10 Y01 Y01
punpckhdq mm4, mm4 ;V
pand mm4, dword ptr AndMask6;U
;mm4--Y11 Y11 Y11 0
psrlq mm5, 48 ;V
paddw mm2, [edi] ;U
por mm4, mm5 ;V
;mm4--Y11 Y11 Y11 Y10
paddw mm3, [edi+8] ;U
por mm7, mm1 ;V
packuswb mm2, mm3 ;U
movq mm5, mm0 ;V
paddw mm4, [edi+16] ;U
punpckhwd mm5, mm5 ;V
paddw mm7, [edi+24] ;U
movq mm1, mm5 ;V
movq [esi], mm2 ;U
psllq mm1, 32 ;V
;mm0--Y31 Y30 Y21 Y20
;mm7--Y21 Y21 Y20 Y20
;mm6--0 0 Y21 Y21
;mm7--Y20 Y20 Y20 Y20
;mm7--Y21 Y20 Y20 Y20
;mm5--Y31 Y31 Y30 Y30
por mm6, mm1 ;U
punpckhdq mm5, mm5 ;V
pand mm5, dword ptr AndMask6;U
;mm5--Y31 Y31 Y31 0
psrlq mm1, 48 ;V
por mm5, mm1 ;U
packuswb mm4, mm7 ;V
;mm5--Y31 Y31 Y31 Y30
paddw mm6, [edi+32] ;U
paddw mm5, [edi+40] ;U
mov edi, V
packuswb mm6, mm5 ;U
movq [esi+8],mm4 ;U
movq [esi+16],mm6 ;U
mov esi, U
movq mm0, [esi+eax] ;U Pipe
pxor mm7, mm7 ;V
movq mm1, [edi+eax] ;U
punpckhbw mm0, mm7 ;V
psubw mm0,dword ptr UVOff ;U
punpckhbw mm1, mm7 ;V
psubw mm1,dword ptr UVOff ;U
;mm0--U3-128 U2-128 U1-128 U0-128
;mm1--V3-128 V2-128 V1-128 V0-128
movq mm2, mm0 ;V
movq mm3, mm1 ;U
punpcklwd mm3, mm2 ;U
movq mm5, mm3 ;U
movq mm4, mm3 ;V
pmaddwd mm4,dword ptr UVCoe2 ;U
punpckldq mm3, mm3 ;V
pmaddwd mm3,dword ptr UVCoe1 ;U
punpckhdq mm5, mm5 ;V
pmaddwd mm5,dword ptr UVCoe3 ;U
movq mm2, mm0 ;V
psrad mm4, 14 ;U
movq mm6, mm1 ;V
punpckhwd mm6, mm2 ;U
psrad mm3, 14 ;U
movq mm7, mm6 ;V
mov edi, LTemp
punpckhdq mm7, mm7 ;V
pmaddwd mm7,dword ptr UVCoe3 ;U
packssdw mm3, mm4 ;V
psrad mm5, 14 ;U
;mm3--B1-Y R0-Y G0-Y B0-Y
;mm5-- R1-Y G1-Y
movq mm4, mm6 ;V
pmaddwd mm4,dword ptr UVCoe2 ;U
punpckldq mm6, mm6 ;V
pmaddwd mm6,dword ptr UVCoe1 ;U
movq mm2, mm3 ;V
movq [edi+56],mm3 ;U
psrad mm7, 14 ;V
pand mm3,dword ptr AndMask1;U
psrad mm4, 14 ;V
psrad mm6, 14 ;U
packssdw mm5, mm6 ;U
psllq mm2, 48 ;U
packssdw mm4, mm7 ;U
;mm3--B1-Y R0-Y G0-Y B0-Y
;mm5--G2-Y B2-Y R1-Y G1-Y
;mm4--R3-Y G3-Y B3-Y R2-Y
por mm3, mm2 ;V
movq [edi+48],mm5 ;U
movq mm2, mm3 ;V
psrlq mm2, 16 ;U
movq mm6, mm2 ;U
pand mm6,dword ptr AndMask2;U
;mm6--B0-Y R0-Y G0-Y B0-Y
;mm3-- 0 0 R0-Y G0-Y
movq mm2, [edi+56] ;U
psllq mm5, 32 ;V
pand mm2, dword ptr AndMask3;U
mov esi, Y
psrlq mm2, 32 ;V
movq [edi], mm3 ;U
por mm5, mm2 ;V
movq mm7, mm5 ;U
movq mm2, mm5 ;V
add esi, ebx
psrlq mm2, 48 ;V
sub esi, ecx
por mm5, mm2 ;V
movq mm2, [edi+48] ;U
psllq mm7, 16 ;V
psrlq mm2, 32 ;U
por mm6, mm7 ;V
;mm6--B0-Y R0-Y G0-Y B0-Y
;mm3--G1-Y B1-Y R0-Y G0-Y
;mm5--R1-Y G1-Y B1-Y R1-Y
movq [edi+16],mm5 ;U
movq mm5, mm4 ;V
pand mm5, dword ptr AndMask4;U
movq [edi+8],mm6 ;U
psllq mm5, 32 ;V
por mm2, mm5 ;U
movq mm6, mm4 ;V
movq mm5, mm2 ;U
psllq mm6, 16 ;V
movq mm3, mm2 ;U
psllq mm5, 48 ;V
pand mm6, dword ptr AndMask5;U
psrlq mm3, 16 ;V
por mm2, mm5 ;U
por mm3, mm6 ;V
;mm2--B2-Y R2-Y G2-Y B2-Y
;mm3--G3-Y B3-Y R2-Y G2-Y
movq mm0, [esi+8] ;U
movq mm5, mm4 ;V
pand mm4, dword ptr AndMask6;U
psrlq mm5, 48 ;V
movq [edi+24],mm2 ;U
por mm4, mm5 ;V
;mm4--R3-Y G3-Y B3-Y R3-Y
movq [edi+32],mm3 ;U
pxor mm5, mm5 ;V
mov esi, RGB
movq mm1, mm0 ;V
movq [edi+40],mm4 ;U
punpcklbw mm1, mm5 ;V
;[LTemp] --B0-Y R0-Y G0-Y B0-Y
;[LTemp+8] --G1-Y B1-Y R0-Y G0-Y
;[LTemp+16]--R1-Y G1-Y B1-Y R1-Y
;[LTemp+24]--B2-Y R2-Y G2-Y B2-Y
;[LTemp+32]--G3-Y B3-Y R2-Y G2-Y
;[LTemp+40]--R3-Y G3-Y B3-Y R3-Y
;mm0--Y31 Y30 Y21 Y20 Y11 Y10 Y01 Y00
;mm1-- Y11 Y10 Y01 Y00
add esi, edx
movq mm2, mm1 ;U
sub esi, ecx
pxor mm7, mm7 ;V
sub esi, ecx
punpcklwd mm2, mm2
;mm2--Y01 Y01 Y00 Y00
sub esi, ecx
movq mm3, mm2 ;U
punpckhbw mm0, mm7 ;V
punpckldq mm2, mm2 ;U
movq mm7, mm0 ;V
pand mm2,dword ptr AndMask1;U
psrlq mm3, 32 ;V
;mm3--0 0 Y01 Y01
;mm2--Y00 Y00 Y00 Y00
movq mm4, mm3 ;U
punpcklwd mm7, mm7 ;V
psllq mm4, 48 ;U
movq mm6, mm7 ;V
por mm2, mm4 ;U
psrlq mm6, 32 ;V
;mm2--Y01 Y00 Y00 Y00
movq mm4, mm1 ;U
punpckldq mm7, mm7 ;V
punpckhwd mm4, mm4 ;U
movq mm1, mm6 ;V
;mm4--Y11 Y11 Y10 Y10
psllq mm1, 48 ;U
movq mm5, mm4 ;V
pand mm7,dword ptr AndMask1;U
psllq mm5, 32 ;V
por mm3, mm5 ;U
;mm3--Y10 Y10 Y01 Y01
punpckhdq mm4, mm4 ;V
pand mm4, dword ptr AndMask6;U
;mm4--Y11 Y11 Y11 0
psrlq mm5, 48 ;V
paddw mm2, [edi] ;U
por mm4, mm5 ;V
;mm4--Y11 Y11 Y11 Y10
paddw mm3, [edi+8] ;U
por mm7, mm1 ;V
packuswb mm2, mm3 ;U
movq mm5, mm0 ;V
paddw mm4, [edi+16] ;U
punpckhwd mm5, mm5 ;V
paddw mm7, [edi+24] ;U
movq mm1, mm5 ;V
movq [esi+24], mm2 ;U
psllq mm1, 32 ;V
;mm0--Y31 Y30 Y21 Y20
;mm7--Y21 Y21 Y20 Y20
;mm6--0 0 Y21 Y21
;mm7--Y20 Y20 Y20 Y20
;mm7--Y21 Y20 Y20 Y20
;mm5--Y31 Y31 Y30 Y30
por mm6, mm1 ;U
punpckhdq mm5, mm5 ;V
pand mm5, dword ptr AndMask6;U
;mm5--Y31 Y31 Y31 0
psrlq mm1, 48 ;V
por mm5, mm1 ;U
packuswb mm4, mm7 ;V
;mm5--Y31 Y31 Y31 Y30
paddw mm6, [edi+32] ;U
pxor mm7, mm7 ;V
paddw mm5, [edi+40] ;U
movq [esi+32],mm4 ;U
packuswb mm6, mm5 ;V
movq [esi+40],mm6 ;U
mov esi, Y
add esi, ebx
add esi, ebx
sub esi, ecx
;The next line of Y
movq mm0, [esi+8] ;U
movq mm1, mm0 ;U
punpcklbw mm1, mm7 ;U
movq mm2, mm1 ;U
mov esi, RGB
punpcklwd mm2, mm2 ;V
sub esi, ecx
movq mm3, mm2 ;V
sub esi, ecx
punpckhbw mm0, mm7 ;V
sub esi, ecx
punpckldq mm2, mm2 ;V
;mm0--Y31 Y30 Y21 Y20 Y11 Y10 Y01 Y00
;mm1-- Y11 Y10 Y01 Y00
;mm2--Y01 Y01 Y00 Y00
movq mm7, mm0 ;V
pand mm2,dword ptr AndMask1;U
psrlq mm3, 32 ;V
;mm3--0 0 Y01 Y01
;mm2--Y00 Y00 Y00 Y00
movq mm4, mm3 ;U
punpcklwd mm7, mm7 ;V
psllq mm4, 48 ;U
movq mm6, mm7 ;V
por mm2, mm4 ;U
psrlq mm6, 32 ;V
;mm2--Y01 Y00 Y00 Y00
movq mm4, mm1 ;U
punpckldq mm7, mm7 ;V
punpckhwd mm4, mm4 ;U
movq mm1, mm6 ;V
;mm4--Y11 Y11 Y10 Y10
psllq mm1, 48 ;U
movq mm5, mm4 ;V
pand mm7,dword ptr AndMask1;U
psllq mm5, 32 ;V
por mm3, mm5 ;U
;mm3--Y10 Y10 Y01 Y01
punpckhdq mm4, mm4 ;V
pand mm4, dword ptr AndMask6;U
;mm4--Y11 Y11 Y11 0
psrlq mm5, 48 ;V
paddw mm2, [edi] ;U
por mm4, mm5 ;V
;mm4--Y11 Y11 Y11 Y10
paddw mm3, [edi+8] ;U
por mm7, mm1 ;V
packuswb mm2, mm3 ;U
movq mm5, mm0 ;V
paddw mm4, [edi+16] ;U
punpckhwd mm5, mm5 ;V
paddw mm7, [edi+24] ;U
movq mm1, mm5 ;V
movq [esi+24], mm2 ;U
psllq mm1, 32 ;V
;mm0--Y31 Y30 Y21 Y20
;mm7--Y21 Y21 Y20 Y20
;mm6--0 0 Y21 Y21
;mm7--Y20 Y20 Y20 Y20
;mm7--Y21 Y20 Y20 Y20
;mm5--Y31 Y31 Y30 Y30
por mm6, mm1 ;U
punpckhdq mm5, mm5 ;V
pand mm5, dword ptr AndMask6;U
;mm5--Y31 Y31 Y31 0
psrlq mm1, 48 ;V
por mm5, mm1 ;U
packuswb mm4, mm7 ;V
;mm5--Y31 Y31 Y31 Y30
paddw mm6, [edi+32] ;U
paddw mm5, [edi+40] ;U
mov edi, V
packuswb mm6, mm5 ;V
movq [esi+32],mm4 ;U
movq [esi+40],mm6 ;U
mov esi, U
add eax, 8
sub ecx, 16
jnz LINELOOP
emms
ret
YUVRGBTwoLine ENDP
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -