📄 ff_kerneldeint.cpp
字号:
//#define SOURCE SRC_CUR
//#define TARGET mm4
//#define DIRECTION ASU1
DeinterlaceLoad<ASU1,SRC_CUR>(eax,esi,ecx,edi,mm4,EAX_INVERTED);// #include "include\DeinterlaceLoad.cpp"
movq (mm5,mm4);
punpcklbw (mm4,mm4);
punpckhbw (mm5,mm5);
psrlw (mm4,3);
psrlw (mm5,3);
paddsw (mm4,mm0);
paddsw (mm5,mm1);
//;mov ebx,043544354h
//;movd mm2,ebx
//;punpcklwd mm2,mm2
movq (mm2,qword_4354h);
pmulhw (mm4,mm2);
pmulhw (mm5,mm2);
//; + 5570*( *(curNextPtr )
//#define SOURCE SRC_NEXT
//#define TARGET mm0
//#define DIRECTION 0
DeinterlaceLoad<0,SRC_NEXT>(eax,esi,ecx,edi,mm0,EAX_INVERTED);// #include "include\DeinterlaceLoad.cpp"
movq (mm1,mm0);
punpcklbw (mm0,mm0);
punpckhbw (mm1,mm1);
psrlw (mm0,3);
psrlw (mm1,3);
//; +*(curPrevPtr ))
//#define SOURCE SRC_PREV
//#define TARGET mm2
//#define DIRECTION 0
DeinterlaceLoad<0,SRC_PREV>(eax,esi,ecx,edi,mm2,EAX_INVERTED);// #include "include\DeinterlaceLoad.cpp"
movq (mm3,mm2);
punpcklbw (mm2,mm2);
punpckhbw (mm3,mm3);
psrlw (mm2,3);
psrlw (mm3,3);
paddsw (mm0,mm2);
paddsw (mm1,mm3);
//;mov ebx,015c215c2h
//;movd mm2,ebx
//;punpcklwd mm2,mm2
movq (mm2,qword_15c2h);
pmulhw (mm0,mm2);
pmulhw (mm1,mm2);
paddsw (mm4,mm0);
paddsw (mm5,mm1);
//; - 3801*( *(curNextPtr+U1*nextPitch )
//#define SOURCE SRC_NEXT
//#define TARGET mm0
//#define DIRECTION U1
DeinterlaceLoad<U1,SRC_NEXT>(eax,esi,ecx,edi,mm0,EAX_INVERTED);// #include "include\DeinterlaceLoad.cpp"
movq (mm1,mm0);
punpcklbw (mm0,mm0);
punpckhbw (mm1,mm1);
psrlw (mm0,3);
psrlw (mm1,3);
//; +*(curNextPtr+D1*nextPitch )
//#define SOURCE SRC_NEXT
//#define TARGET mm2
//#define DIRECTION D1
DeinterlaceLoad<D1,SRC_NEXT>(eax,esi,ecx,edi,mm2,EAX_INVERTED);// #include "include\DeinterlaceLoad.cpp"
movq (mm3,mm2);
punpcklbw (mm2,mm2);
punpckhbw (mm3,mm3);
psrlw (mm2,3);
psrlw (mm3,3);
paddsw (mm0,mm2);
paddsw (mm1,mm3);
//; +*(curPrevPtr+D1*prevPitch )
//#define SOURCE SRC_PREV
//#define TARGET mm2
//#define DIRECTION D1
DeinterlaceLoad<D1,SRC_PREV>(eax,esi,ecx,edi,mm2,EAX_INVERTED);// #include "include\DeinterlaceLoad.cpp"
movq (mm3,mm2);
punpcklbw (mm2,mm2);
punpckhbw (mm3,mm3);
psrlw (mm2,3);
psrlw (mm3,3);
paddsw (mm0,mm2);
paddsw (mm1,mm3);
//; +*(curPrevPtr+U1*prevPitch ))
//#define SOURCE SRC_PREV
//#define TARGET mm2
//#define DIRECTION U1
DeinterlaceLoad<U1,SRC_PREV>(eax,esi,ecx,edi,mm2,EAX_INVERTED);// #include "include\DeinterlaceLoad.cpp"
movq (mm3,mm2);
punpcklbw (mm2,mm2);
punpckhbw (mm3,mm3);
psrlw (mm2,3);
psrlw (mm3,3);
paddsw (mm0,mm2);
paddsw (mm1,mm3);
//;mov ebx,00ed90ed9h
//;movd mm2,ebx
//;punpcklwd mm2,mm2
movq (mm2,qword_0ed9h);
pmulhw (mm0,mm2);
pmulhw (mm1,mm2);
psubsw (mm4,mm0);
psubsw (mm5,mm1);
//; - 852*( *(curSrcPtr +ASU2*srcPitch)
//#define SOURCE SRC_CUR
//#define TARGET mm0
//#define DIRECTION ASU2
DeinterlaceLoad<ASU2,SRC_CUR>(eax,esi,ecx,edi,mm0,EAX_INVERTED);// #include "include\DeinterlaceLoad.cpp"
movq (mm1,mm0);
punpcklbw (mm0,mm0);
punpckhbw (mm1,mm1);
psrlw (mm0,3);
psrlw (mm1,3);
//; +*(curSrcPtr +ASD2*srcPitch))
//#define SOURCE SRC_CUR
//#define TARGET mm2
//#define DIRECTION ASD2
DeinterlaceLoad<ASD2,SRC_CUR>(eax,esi,ecx,edi,mm2,EAX_INVERTED);// #include "include\DeinterlaceLoad.cpp"
movq (mm3,mm2);
punpcklbw (mm2,mm2);
punpckhbw (mm3,mm3);
psrlw (mm2,3);
psrlw (mm3,3);
paddsw (mm0,mm2);
paddsw (mm1,mm3);
//;mov ebx,003540354h
//;movd mm2,ebx
//;punpcklwd mm2,mm2
movq (mm2,qword_0354h);
pmulhw (mm0,mm2);
pmulhw (mm1,mm2);
psubsw (mm4,mm0);
psubsw (mm5,mm1);
//; + 1016*( *(curNextPtr+D2*nextPitch )
//#define SOURCE SRC_NEXT
//#define TARGET mm0
//#define DIRECTION D2
DeinterlaceLoad<D2,SRC_NEXT>(eax,esi,ecx,edi,mm0,EAX_INVERTED);// #include "include\DeinterlaceLoad.cpp"
movq (mm1,mm0);
punpcklbw (mm0,mm0);
punpckhbw (mm1,mm1);
psrlw (mm0,3);
psrlw (mm1,3);
//; +*(curNextPtr+U2*nextPitch )
//#define SOURCE SRC_NEXT
//#define TARGET mm2
//#define DIRECTION U2
DeinterlaceLoad<U2,SRC_NEXT>(eax,esi,ecx,edi,mm2,EAX_INVERTED);// #include "include\DeinterlaceLoad.cpp"
movq (mm3,mm2);
punpcklbw (mm2,mm2);
punpckhbw (mm3,mm3);
psrlw (mm2,3);
psrlw (mm3,3);
paddsw (mm0,mm2);
paddsw (mm1,mm3);
//; +*(curPrevPtr+U2*prevPitch )
//#define SOURCE SRC_PREV
//#define TARGET mm2
//#define DIRECTION U2
DeinterlaceLoad<U2,SRC_PREV>(eax,esi,ecx,edi,mm2,EAX_INVERTED);// #include "include\DeinterlaceLoad.cpp"
movq (mm3,mm2);
punpcklbw (mm2,mm2);
punpckhbw (mm3,mm3);
psrlw (mm2,3);
psrlw (mm3,3);
paddsw (mm0,mm2);
paddsw (mm1,mm3);
//; +*(curPrevPtr+D2*prevPitch ));
//#define SOURCE SRC_PREV
//#define TARGET mm2
//#define DIRECTION D2
DeinterlaceLoad<D2,SRC_PREV>(eax,esi,ecx,edi,mm2,EAX_INVERTED);// #include "include\DeinterlaceLoad.cpp"
movq (mm3,mm2);
punpcklbw (mm2,mm2);
punpckhbw (mm3,mm3);
psrlw (mm2,3);
psrlw (mm3,3);
paddsw (mm0,mm2);
paddsw (mm1,mm3);
//;mov ebx,003f803f8h
//;movd mm2,ebx
//;punpcklwd mm2,mm2
movq (mm2,qword_03f8h);
pmulhw (mm0,mm2);
pmulhw (mm1,mm2);
paddsw (mm4,mm0);
paddsw (mm5,mm1);
if (EAX_INVERTED)
eax=-eax;
//; intVal=lIntVal/16384;
movq (mm0,mm4);
movq (mm1,mm5);
psraw (mm0,8);
psraw (mm1,8);
psubsw (mm4,mm0);
psubsw (mm5,mm1);
psraw (mm4,4);
psraw (mm5,4);
}
}
//; convert words to bytes
packuswb (mm4,mm5);
//; clamp value ranges
if (COLORSPACE == YV12){
if (!HALFSIZE){
//;mov ebx,00f0f0f0fh
movq (mm0,qword_0fh);
}else{ // defined HALFSIZE
//;mov ebx,014141414h
movq (mm0,qword_14h);
}
//;movd mm0,ebx
//;mov ebx,010101010h
//;movd mm1,ebx
movq (mm1,qword_10h);
punpcklbw (mm0,mm0);
punpcklbw (mm1,mm1);
paddusb (mm4,mm0);
psubusb (mm4,mm0);
psubusb (mm4,mm1);
paddusb (mm4,mm1);
}else if (COLORSPACE == YUY2){
//;mov ebx,0140f140fh
//;movd mm0,ebx
movq (mm0,qword_140fh);
//;mov ebx,010101010h
//;movd mm1,ebx
movq (mm1,qword_10h);
punpckldq (mm0,mm0);
punpckldq (mm1,mm1);
paddusb (mm4,mm0);
psubusb (mm4,mm0);
psubusb (mm4,mm1);
paddusb (mm4,mm1);
}
// apply motion mask
pand (mm4,mm7);
pcmpeqb (mm6,mm7);
movq (mm0,edi);
pand (mm0,mm6);
por (mm0,mm4);
movq (edx,mm0);
//; Update pointers
esi+=8;
ecx+=8;
edi+=8;
edx+=8;
bytesLeft-=8;
if (bytesLeft!=0)
goto ColLoop;
goto RowEnd;
CopyThrough:
movq (mm0,edi);
esi+=8;
ecx+=8;
edi+=8;
movq (edx,mm0);
edx+=8;
bytesLeft-=8;
if (bytesLeft!=0)
goto ColLoop;
RowEnd:;
}
template<bool SHARP,bool TWOWAY,int COLORSPACE,int U2,int U1,int D1,int D2,int SU2,int SU1,int SD1,int SD2> static __forceinline void DeinterlaceLine_1(int rowSize,const unsigned char* &prevPtr,const unsigned char* &srcPtr,const unsigned char* &nextPtr,const unsigned char* &maskPtr,unsigned char* &dstPtr,stride_t maskPitch,stride_t dstPitch,stride_t prevPitch,stride_t nextPitch,stride_t srcPitch,bool halfsize,int order)
{
int bytesLeft=rowSize;
const unsigned char *curPrevPtr=prevPtr;
const unsigned char *curSrcPtr=srcPtr;
const unsigned char *curNextPtr=nextPtr;
const unsigned char *curMaskPtr=maskPtr;
unsigned char *curDstPtr=dstPtr;
if (!halfsize)
{
//#undef HALFSIZE
if (order == 0)
{
#undef TOPFIRST
//#define ASU2 (SU2-1)
//#define ASU1 (SU1-1)
//#define ASD1 (SD1-1)
//#define ASD2 (SD2-1)
DeinterlaceLine_2<false,SHARP,TWOWAY,COLORSPACE, U2,U1,D1,D2, SU2-1,SU1-1,SD1-1,SD
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -