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

📄 ff_kerneldeint.cpp

📁 从FFMPEG转换而来的H264解码程序,VC下编译..
💻 CPP
📖 第 1 页 / 共 5 页
字号:
                        //#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 + -