📄 store.c
字号:
add esi, 0x04
cmp esi, [HALF_WIDTH]
movd [ebx+esi-4], mm5
jl convyuv422bottomp
}
}
else
{
__asm
{
mov eax, [src]
mov ecx, [dst]
mov esi, 0x00
pxor mm0, mm0
movq mm3, [mmmask_0003]
movq mm4, [mmmask_0004]
movq mm5, [mmmask_0005]
convyuv422topi:
movd mm1, [eax+esi]
mov ebx, eax
add ebx, [HALF_WIDTH]
movd mm2, [ebx+esi]
movd [ecx+esi], mm1
punpcklbw mm1, mm0
movq mm6, mm1
pmullw mm1, mm3
punpcklbw mm2, mm0
movq mm7, mm2
pmullw mm2, mm5
paddusw mm2, mm1
paddusw mm2, mm4
psrlw mm2, 0x03
packuswb mm2, mm0
mov edx, ecx
add edx, [HALF_WIDTH]
pmullw mm6, mm5
movd [edx+esi], mm2
add ebx, [HALF_WIDTH]
movd mm2, [ebx+esi]
punpcklbw mm2, mm0
pmullw mm2, mm3
paddusw mm2, mm6
paddusw mm2, mm4
psrlw mm2, 0x03
packuswb mm2, mm0
add edx, [HALF_WIDTH]
add ebx, [HALF_WIDTH]
pmullw mm7, [mmmask_0007]
movd [edx+esi], mm2
movd mm2, [ebx+esi]
punpcklbw mm2, mm0
paddusw mm2, mm7
paddusw mm2, mm4
psrlw mm2, 0x03
packuswb mm2, mm0
add edx, [HALF_WIDTH]
add esi, 0x04
cmp esi, [HALF_WIDTH]
movd [edx+esi-4], mm2
jl convyuv422topi
add eax, [Coded_Picture_Width]
add ecx, [DOUBLE_WIDTH]
mov esi, 0x00
mov edi, [INTERLACED_HEIGHT]
convyuv422i:
movd mm1, [eax+esi]
punpcklbw mm1, mm0
movq mm6, mm1
mov ebx, eax
sub ebx, [Coded_Picture_Width]
movd mm3, [ebx+esi]
pmullw mm1, [mmmask_0007]
punpcklbw mm3, mm0
paddusw mm3, mm1
paddusw mm3, mm4
psrlw mm3, 0x03
packuswb mm3, mm0
add ebx, [HALF_WIDTH]
movq mm1, [ebx+esi]
add ebx, [Coded_Picture_Width]
movd [ecx+esi], mm3
movq mm3, [mmmask_0003]
movd mm2, [ebx+esi]
punpcklbw mm1, mm0
pmullw mm1, mm3
punpcklbw mm2, mm0
movq mm7, mm2
pmullw mm2, mm5
paddusw mm2, mm1
paddusw mm2, mm4
psrlw mm2, 0x03
packuswb mm2, mm0
pmullw mm6, mm5
mov edx, ecx
add edx, [HALF_WIDTH]
movd [edx+esi], mm2
add ebx, [HALF_WIDTH]
movd mm2, [ebx+esi]
punpcklbw mm2, mm0
pmullw mm2, mm3
paddusw mm2, mm6
paddusw mm2, mm4
psrlw mm2, 0x03
packuswb mm2, mm0
pmullw mm7, [mmmask_0007]
add edx, [HALF_WIDTH]
add ebx, [HALF_WIDTH]
movd [edx+esi], mm2
movd mm2, [ebx+esi]
punpcklbw mm2, mm0
paddusw mm2, mm7
paddusw mm2, mm4
psrlw mm2, 0x03
packuswb mm2, mm0
add edx, [HALF_WIDTH]
add esi, 0x04
cmp esi, [HALF_WIDTH]
movd [edx+esi-4], mm2
jl convyuv422i
add eax, [Coded_Picture_Width]
add ecx, [DOUBLE_WIDTH]
mov esi, 0x00
sub edi, 0x01
cmp edi, 0x00
jg convyuv422i
convyuv422bottomi:
movd mm1, [eax+esi]
movq mm6, mm1
punpcklbw mm1, mm0
mov ebx, eax
sub ebx, [Coded_Picture_Width]
movd mm3, [ebx+esi]
punpcklbw mm3, mm0
pmullw mm1, [mmmask_0007]
paddusw mm3, mm1
paddusw mm3, mm4
psrlw mm3, 0x03
packuswb mm3, mm0
add ebx, [HALF_WIDTH]
movq mm1, [ebx+esi]
punpcklbw mm1, mm0
movd [ecx+esi], mm3
pmullw mm1, [mmmask_0003]
add ebx, [Coded_Picture_Width]
movd mm2, [ebx+esi]
punpcklbw mm2, mm0
movq mm7, mm2
pmullw mm2, mm5
paddusw mm2, mm1
paddusw mm2, mm4
psrlw mm2, 0x03
packuswb mm2, mm0
mov edx, ecx
add edx, [HALF_WIDTH]
pmullw mm7, [mmmask_0007]
movd [edx+esi], mm2
add edx, [HALF_WIDTH]
movd [edx+esi], mm6
punpcklbw mm6, mm0
paddusw mm6, mm7
paddusw mm6, mm4
psrlw mm6, 0x03
packuswb mm6, mm0
add edx, [HALF_WIDTH]
add esi, 0x04
cmp esi, [HALF_WIDTH]
movd [edx+esi-4], mm6
jl convyuv422bottomi
}
}
}
static void conv422toyuy2odd(unsigned char *py, unsigned char *pu, unsigned char *pv, unsigned char *dst)
{
int DST_STRIDE = Coded_Picture_Width<<2;
int SRC_STRIDE = Coded_Picture_Width>>1;
int DOUBLE_WIDTH = Coded_Picture_Width<<1;
TFB = 1;
__asm
{
mov eax, [py]
mov ebx, [pu]
mov ecx, [pv]
mov edx, [dst]
mov esi, 0x00
mov edi, [Coded_Picture_Height]
yuy2conv:
movd mm2, [ebx+esi]
movd mm3, [ecx+esi]
punpcklbw mm2, mm3
movq mm1, [eax+esi*2]
movq mm4, mm1
punpcklbw mm1, mm2
punpckhbw mm4, mm2
add esi, 0x04
cmp esi, [SRC_STRIDE]
movq [edx+esi*4-16], mm1
movq [edx+esi*4-8], mm4
jl yuy2conv
add eax, [DOUBLE_WIDTH]
add ebx, [Coded_Picture_Width]
add ecx, [Coded_Picture_Width]
add edx, [DST_STRIDE]
sub edi, 0x02
mov esi, 0x00
cmp edi, 0x00
jg yuy2conv
}
}
static void conv422toyuy2even(unsigned char *py, unsigned char *pu, unsigned char *pv, unsigned char *dst)
{
int DST_STRIDE = Coded_Picture_Width<<2;
int SRC_STRIDE = Coded_Picture_Width>>1;
int DOUBLE_WIDTH = Coded_Picture_Width<<1;
BFB = 1;
py += Coded_Picture_Width; pu += SRC_STRIDE; pv += SRC_STRIDE; dst += DOUBLE_WIDTH;
__asm
{
mov eax, [py]
mov ebx, [pu]
mov ecx, [pv]
mov edx, [dst]
mov esi, 0x00
mov edi, [Coded_Picture_Height]
yuy2conv:
movd mm2, [ebx+esi]
movd mm3, [ecx+esi]
punpcklbw mm2, mm3
movq mm1, [eax+esi*2]
movq mm4, mm1
punpcklbw mm1, mm2
punpckhbw mm4, mm2
add esi, 0x04
cmp esi, [SRC_STRIDE]
movq [edx+esi*4-16], mm1
movq [edx+esi*4-8], mm4
jl yuy2conv
add eax, [DOUBLE_WIDTH]
add ebx, [Coded_Picture_Width]
add ecx, [Coded_Picture_Width]
add edx, [DST_STRIDE]
sub edi, 0x02
mov esi, 0x00
cmp edi, 0x00
jg yuy2conv
}
}
static void conv444toRGB24odd(unsigned char *py, unsigned char *pu, unsigned char *pv, unsigned char *dst)
{
int DST_STRIDE = Coded_Picture_Width * 9;
int DOUBLE_WIDTH = Coded_Picture_Width<<1;
TFB = 1;
dst += Coded_Picture_Width * (Coded_Picture_Height-1) * 3;
__asm
{
mov eax, [py]
mov ebx, [pu]
mov ecx, [pv]
mov edx, [dst]
mov edi, [Coded_Picture_Height]
mov esi, 0x00
pxor mm0, mm0
convRGB24:
movd mm1, [eax+esi]
movd mm3, [ebx+esi]
punpcklbw mm1, mm0
punpcklbw mm3, mm0
movd mm5, [ecx+esi]
punpcklbw mm5, mm0
movq mm7, [mmmask_0128]
psubw mm3, mm7
psubw mm5, mm7
psubw mm1, [YUVRGB_Offset]
movq mm2, mm1
movq mm7, [mmmask_0001]
punpcklwd mm1, mm7
punpckhwd mm2, mm7
movq mm7, [YUVRGB_Scale]
pmaddwd mm1, mm7
pmaddwd mm2, mm7
movq mm4, mm3
punpcklwd mm3, mm0
punpckhwd mm4, mm0
movq mm7, [mmmask_cbu]
pmaddwd mm3, mm7
pmaddwd mm4, mm7
paddd mm3, mm1
paddd mm4, mm2
psrld mm3, 13
psrld mm4, 13
packuswb mm3, mm0
packuswb mm4, mm0
movq mm6, mm5
punpcklwd mm5, mm0
punpckhwd mm6, mm0
movq mm7, [mmmask_crv]
pmaddwd mm5, mm7
pmaddwd mm6, mm7
paddd mm5, mm1
paddd mm6, mm2
psrld mm5, 13
psrld mm6, 13
packuswb mm5, mm0
packuswb mm6, mm0
punpcklbw mm3, mm5
punpcklbw mm4, mm6
movq mm5, mm3
movq mm6, mm4
psrlq mm5, 16
psrlq mm6, 16
por mm3, mm5
por mm4, mm6
movd mm5, [ebx+esi]
movd mm6, [ecx+esi]
punpcklbw mm5, mm0
punpcklbw mm6, mm0
movq mm7, [mmmask_0128]
psubw mm5, mm7
psubw mm6, mm7
movq mm7, mm6
punpcklwd mm6, mm5
punpckhwd mm7, mm5
movq mm5, [mmmask_cgu_cgv]
pmaddwd mm6, mm5
pmaddwd mm7, mm5
paddd mm6, mm1
paddd mm7, mm2
psrld mm6, 13
psrld mm7, 13
packuswb mm6, mm0
packuswb mm7, mm0
punpcklbw mm3, mm6
punpcklbw mm4, mm7
movq mm1, mm3
movq mm5, mm4
movq mm6, mm4
psrlq mm1, 32
psllq mm1, 24
por mm1, mm3
psrlq mm3, 40
psllq mm6, 16
por mm3, mm6
movd [edx], mm1
psrld mm4, 16
psrlq mm5, 24
por mm5, mm4
movd [edx+4], mm3
add edx, 0x0c
add esi, 0x04
cmp esi, [Coded_Picture_Width]
movd [edx-4], mm5
jl convRGB24
add eax, [DOUBLE_WIDTH]
add ebx, [DOUBLE_WIDTH]
add ecx, [DOUBLE_WIDTH]
sub edx, [DST_STRIDE]
mov esi, 0x00
sub edi, 0x02
cmp edi, 0x00
jg convRGB24
}
}
static void conv444toRGB24even(unsigned char *py, unsigned char *pu, unsigned char *pv, unsigned char *dst)
{
int DST_STRIDE = Coded_Picture_Width * 9;
int DOUBLE_WIDTH = Coded_Picture_Width<<1;
BFB = 1;
dst += Coded_Picture_Width * (Coded_Picture_Height-2) * 3;
py += Coded_Picture_Width; pu += Coded_Picture_Width; pv += Coded_Picture_Width;
__asm
{
mov eax, [py]
mov ebx, [pu]
mov ecx, [pv]
mov edx, [dst]
mov edi, [Coded_Picture_Height]
mov esi, 0x00
pxor mm0, mm0
convRGB24:
movd mm1, [eax+esi]
movd mm3, [ebx+esi]
punpcklbw mm1, mm0
punpcklbw mm3, mm0
movd mm5, [ecx+esi]
punpcklbw mm5, mm0
movq mm7, [mmmask_0128]
psubw mm3, mm7
psubw mm5, mm7
psubw mm1, [YUVRGB_Offset]
movq mm2, mm1
movq mm7, [mmmask_0001]
punpcklwd mm1, mm7
punpckhwd mm2, mm7
movq mm7, [YUVRGB_Scale]
pmaddwd mm1, mm7
pmaddwd mm2, mm7
movq mm4, mm3
punpcklwd mm3, mm0
punpckhwd mm4, mm0
movq mm7, [mmmask_cbu]
pmaddwd mm3, mm7
pmaddwd mm4, mm7
paddd mm3, mm1
paddd mm4, mm2
psrld mm3, 13
psrld mm4, 13
packuswb mm3, mm0
packuswb mm4, mm0
movq mm6, mm5
punpcklwd mm5, mm0
punpckhwd mm6, mm0
movq mm7, [mmmask_crv]
pmaddwd mm5, mm7
pmaddwd mm6, mm7
paddd mm5, mm1
paddd mm6, mm2
psrld mm5, 13
psrld mm6, 13
packuswb mm5, mm0
packuswb mm6, mm0
punpcklbw mm3, mm5
punpcklbw mm4, mm6
movq mm5, mm3
movq mm6, mm4
psrlq mm5, 16
psrlq mm6, 16
por mm3, mm5
por mm4, mm6
movd mm5, [ebx+esi]
movd mm6, [ecx+esi]
punpcklbw mm5, mm0
punpcklbw mm6, mm0
movq mm7, [mmmask_0128]
psubw mm5, mm7
psubw mm6, mm7
movq mm7, mm6
punpcklwd mm6, mm5
punpckhwd mm7, mm5
movq mm5, [mmmask_cgu_cgv]
pmaddwd mm6, mm5
pmaddwd mm7, mm5
paddd mm6, mm1
paddd mm7, mm2
psrld mm6, 13
psrld mm7, 13
packuswb mm6, mm0
packuswb mm7, mm0
punpcklbw mm3, mm6
punpcklbw mm4, mm7
movq mm1, mm3
movq mm5, mm4
movq mm6, mm4
psrlq mm1, 32
psllq mm1, 24
por mm1, mm3
psrlq mm3, 40
psllq mm6, 16
por mm3, mm6
movd [edx], mm1
psrld mm4, 16
psrlq mm5, 24
por mm5, mm4
movd [edx+4], mm3
add edx, 0x0c
add esi, 0x04
cmp esi, [Coded_Picture_Width]
movd [edx-4], mm5
jl convRGB24
add eax, [DOUBLE_WIDTH]
add ebx, [DOUBLE_WIDTH]
add ecx, [DOUBLE_WIDTH]
sub edx, [DST_STRIDE]
mov esi, 0x00
sub edi, 0x02
cmp edi, 0x00
jg convRGB24
}
}
void RenderRGB24()
{
SetDIBitsToDevice(hDC, 0, 0, Coded_Picture_Width, Coded_Picture_Height,
0, 0, 0, Coded_Picture_Height, rgb24, (LPBITMAPINFO)lpbirgb, DIB_RGB_COLORS);
}
void RenderYUY2()
{
unsigned char *dst;
POINT point = {0, 0};
int DOUBLE_WIDTH = Coded_Picture_Width<<1;
ZeroMemory(&ddsd, sizeof(DDSURFACEDESC));
ddsd.dwSize = sizeof(DDSURFACEDESC);
if (IDirectDrawSurface_Lock(lpOverlay, 0, &ddsd, 0, 0)==DD_OK)
{
dst = (unsigned char *)ddsd.lpSurface;
__asm
{
mov eax, [yuy2]
mov ebx, [dst]
mov esi, 0x00
mov edi, [Coded_Picture_Height]
yuy2copy:
movq mm1, [eax+esi]
add esi, 0x08
cmp esi, [DOUBLE_WIDTH]
movq [ebx+esi-8], mm1
jl yuy2copy
add eax, [DOUBLE_WIDTH]
add ebx, [ddsd.lPitch]
sub edi, 0x01
mov esi, 0x00
cmp edi, 0x00
jg yuy2copy
}
if (IDirectDrawSurface_Unlock(lpOverlay, 0)==DD_OK)
{
SetRect(&orect, 0, 0, Coded_Picture_Width, Coded_Picture_Height);
ClientToScreen(hWnd, &point);
prect.left = point.x;
prect.right = point.x + Coded_Picture_Width;
prect.top = point.y;
prect.bottom = point.y + Coded_Picture_Height;
if (prect.left < 0)
{
orect.left = -prect.left;
prect.left = 0;
}
if (prect.top < 0)
{
orect.top = -prect.top;
prect.top = 0;
}
if (prect.right > GetSystemMetrics(SM_CXSCREEN))
{
orect.right = Coded_Picture_Width + GetSystemMetrics(SM_CXSCREEN) - prect.right;
prect.right = GetSystemMetrics(SM_CXSCREEN);
}
if (prect.bottom > GetSystemMetrics(SM_CYSCREEN))
{
orect.bottom = Coded_Picture_Height + GetSystemMetrics(SM_CYSCREEN) - prect.bottom;
prect.bottom = GetSystemMetrics(SM_CYSCREEN);
}
IDirectDrawSurface_UpdateOverlay(lpOverlay, &orect, lpPrimary, &prect,
DDOVER_SHOW | DDOVER_DDFX | DDOVER_KEYDESTOVERRIDE, &ddofx);
}
}
}
int DetectVideoType(int frame, int trf)
{
static int Old_TRF, Repeat_On, Repeat_Off, Repeat_Init;
if (frame)
{
if ((trf & 3) == ((Old_TRF+1) & 3))
FILM_Purity++;
else
NTSC_Purity++;
}
else
Video_Type = FILM_Purity = NTSC_Purity = Repeat_On = Repeat_Off = Repeat_Init = 0;
Old_TRF = trf;
if (trf & 1)
Repeat_On ++;
else
Repeat_Off ++;
if (Repeat_Init)
{
if (Repeat_Off-Repeat_On == 5)
{
Repeat_Off = Repeat_On = 0;
return 0;
}
else if (Repeat_On-Repeat_Off == 5)
{
Repeat_Off = Repeat_On = 0;
return 2;
}
}
else
{
if (Repeat_Off-Repeat_On == 3)
{
Repeat_Off = Repeat_On = 0;
Repeat_Init = 1;
return 0;
}
else if (Repeat_On-Repeat_Off == 3)
{
Repeat_Off = Repeat_On = 0;
Repeat_Init = 1;
return 2;
}
}
return 1;
}
static void AVIKill()
{
AVI_Init = 1; frame_count = 0;
if (ps)
AVIStreamClose(ps);
if (psCompressed)
AVIStreamClose(psCompressed);
if (pfile)
AVIFileClose(pfile);
if (Stop_Flag || Fault_Flag)
{
AVIFileExit();
if (Store_Flag!=STORE_RGB24)
ICSeqCompressFrameEnd(pcompvars);
ICCompressorFree(pcompvars);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -