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

📄 deringopt.cpp

📁 从FFMPEG转换而来的H264解码程序,VC下编译..
💻 CPP
📖 第 1 页 / 共 5 页
字号:


        /* Right Mod */
        movq      (  mm3,    esi         );/* read 8 pixels p  */
        movq      (  mm4,    esi+1       );/* Pixels on top pu */

        movq      (  mm5,    mm3                     );/* make a copy of p */
        psubusb   (  mm3,    mm4                     );/* p-pu */

        psubusb   (  mm4,    mm5                     );/* pu-p */
        por       (  mm3,    mm4                     );/* abs(p-pu) */

        movq      (  mm6,    mm0                     );/* 32+QValues */

        movq           ( mm4,    mm0                                             );/* 32+QValues */
                psubusb(         mm6,    mm3                     );/* zero clampled TmpMod */

                movq   (         mm5,    eight128s                               );/* 80 80 80 80 80 80 80 80 */
                paddb  (         mm4,    eight64s                                );/* 32+QValues + 64 */

                pxor   (         mm4,    mm5                                             );/* convert to a sign number */
                pxor   (         mm3,    mm5                                             );/* convert to a sign number */

                pcmpgtb(         mm3,    mm4                                             );/* 32+QValue- 2*abs(p-pu) <-64 ? */
                pand   (         mm3,    mm2                                             );/* use sharpen */

        paddsb         ( mm6,    mm1                                             );/* clamping to high */
                psubsb (         mm6,    mm1                                             );/* offset back */

                por    (                 mm6,    mm3                                             );/* Mod value to be stored */
                pxor   (         mm5,    mm5                                             );/* clear mm5 */

                pxor        (    mm4,    mm4                                             );/* clear mm4 */
                punpcklbw   (    mm5,    mm6                                             );/* 03 xx 02 xx 01 xx 00 xx */

                psraw      (     mm5,    8                                               );/* sign extended */
                movq       ( eax+128, mm5            );/* writeout UDmod, low four */

                punpckhbw  (     mm4,    mm6);
                psraw      (     mm4,    8);

        movq      (  eax+136, mm4          );/* writeout UDmod, high four */
        esi+=    ecx;


        edi+=    16                  ;
        eax+=    16      ;

        if (esi!=ebx)//cmp         esi,    ebx
         goto /*jne         */FillModLoop1;

        /* last UDMod */

        movq      (  mm3,    esi         );/* read 8 pixels p  */
        movq      (  mm4,    esi+edx     );/* Pixels on top pu */

        movq      (  mm5,    mm3                     );/* make a copy of p */
        psubusb   (  mm3,    mm4                     );/* p-pu */

        psubusb   (  mm4,    mm5                     );/* pu-p */
        por       (  mm3,    mm4                     );/* abs(p-pu) */

        movq      (  mm6,    mm0                     );/* 32+QValues */

        movq           ( mm4,    mm0                                             );/* 32+QValues */
                psubusb(         mm6,    mm3                     );/* zero clampled TmpMod */

                movq   (         mm5,    eight128s                               );/* 80 80 80 80 80 80 80 80 */
                paddb  (         mm4,    eight64s                                );/* 32+QValues + 64 */

                pxor   (         mm4,    mm5                                             );/* convert to a sign number */
                pxor   (         mm3,    mm5                                             );/* convert to a sign number */

                pcmpgtb(         mm3,    mm4                                             );/* 32+QValue- 2*abs(p-pu) <-64 ? */
                pand   (         mm3,    mm2                                             );/* use sharpen */

        paddsb         ( mm6,    mm1                                             );/* clamping to high */
                psubsb (         mm6,    mm1                                             );/* offset back */

                por    (                 mm6,    mm3                                             );/* Mod value to be stored */
                pxor   (         mm5,    mm5                                             );/* clear mm5 */

                pxor      (      mm4,    mm4                                             );/* clear mm4 */
                punpcklbw (      mm5,    mm6                                             );/* 03 xx 02 xx 01 xx 00 xx */

                psraw     (      mm5,    8                                               );/* sign extended */
                movq      (  edi, mm5            );/* writeout UDmod, low four */

                punpckhbw (      mm4,    mm6);
                psraw     (      mm4,    8);

        movq      (  edi+8, mm4          );/* writeout UDmod, high four */

                esi=    Src;
                edi=    Des;

                eax=    (uint8_t*)UDPointer;
                ebx=    (const uint8_t*)LRPointer;

                /* First Row */
                movq      (      mm0,    esi+edx               );/* mm0 = Pixels above */
                pxor      (      mm7,    mm7                             );/* clear mm7 */

                movq      (      mm1,    mm0                             );/* make a copy of mm0 */
                punpcklbw (      mm0,    mm7                             );/* lower four pixels */

                movq      (      mm4,    eax                   );/* au */
                punpckhbw (      mm1,    mm7                             );/* high four pixels */

                movq      (      mm5,    eax+8                 );/* au */

                pmullw    (      mm0,    mm4                             );/* pu*au */
                movq      (      mm2,    esi+ecx               );/* mm2 = pixels below */

                pmullw    (      mm1,    mm5                             );/* pu*au */
                movq      (      mm3,    mm2                             );/* make a copy of mm2 */

                punpcklbw (      mm2,    mm7                             );/* lower four */
                movq      (      mm6,    eax+16                );/* ad */

                punpckhbw (      mm3,    mm7                             );/* higher four */
                paddw     (      mm4,    mm6                             );/* au+ad */

                pmullw    (      mm2,    mm6                             );/* au*pu+ad*pd */
                movq      (      mm6,    eax+24                );/* ad */

                paddw     (      mm0,    mm2                     );
                paddw     (      mm5,    mm6                             );/* au+ad */

                pmullw    (      mm3,    mm6                             );/* ad*pd */
                movq      (      mm2,    esi-1                 );/* pixel to the left */

                paddw     (      mm1,    mm3                             );/* au*pu+ad*pd */
                movq      (      mm3,    mm2                             );/* make a copy of mm2 */

                punpcklbw (      mm2,    mm7                             );/* four left pixels */
                movq      (      mm6,    ebx                   );/* al */

                punpckhbw (      mm3,    mm7                             );/* four right pixels */
                paddw     (      mm4,    mm6                             );/* au + ad + al */

                pmullw    (      mm2,    mm6                             );/* pl * al */
                movq      (      mm6,    ebx+8                 );/* al */

                paddw     (      mm0,    mm2                             );/* au*pu+ad*pd+al*pl */
                paddw     (      mm5,    mm6                             );/* au+ad+al */

                pmullw    (      mm3,    mm6                             );/* al*pl */
                movq      (      mm2,    esi+1                 );/* pixel to the right */

                paddw     (      mm1,    mm3                             );/* au*pu+ad*pd+al*pl */
                movq      (      mm3,    mm2                             );/* make a copy of mm2 */

                punpcklbw (      mm2,    mm7                             );/* four left pixels */
                movq      (      mm6,    ebx+128                       );/* ar */

                punpckhbw (      mm3,    mm7                             );/* four right pixels */
                paddw     (      mm4,    mm6                             );/* au + ad + al + ar */

                pmullw    (      mm2,    mm6                             );/* pr * ar */
                movq      (      mm6,    ebx+136               );/* ar */

                paddw     (      mm0,    mm2                             );/* au*pu+ad*pd+al*pl+pr*ar */
                paddw     (      mm5,    mm6                             );/* au+ad+al+ar */

                pmullw    (      mm3,    mm6                             );/* ar*pr */
                movq      (      mm2,    esi                   );/* p */

                paddw     (      mm1,    mm3                             );/* au*pu+ad*pd+al*pl+ar*pr */
                movq      (      mm3,    mm2                             );/* make a copy of the pixel */

                /* mm0, mm1 ---  au*pu+ad*pd+al*pl+ar*pr */
                /* mm4, mm5     ---      au + ad + al + ar */

                punpcklbw  (     mm2,    mm7                             );/* left four pixels */
                movq       (     mm6,    Four128s                );/* 0080  0080 0080 0080 */

                punpckhbw  (     mm3,    mm7                             );/* right four pixels */
                psubw      (     mm6,    mm4                             );/* 128-(au+ad+al+ar) */

                pmullw     (     mm2,    mm6                             );/* p*(128-(au+ad+al+ar)) */
                movq       (     mm6,    Four128s                );/* 0080  0080 0080 0080 */

                paddw      (     mm0,    mm2                             );/* sum */
                psubw      (     mm6,    mm5                             );/* 128-(au+ad+al+ar) */

                pmullw     (     mm3,    mm6                             );/* p*(128-(au+ad+al+ar)) */
                movq       (     mm6,    Four64s                 );/* {64, 64, 64, 64 } */

                movq       (     mm7,    mm6                             );/* {64, 64, 64, 64} */
                paddw      (     mm0,    mm6                             );/* sum+B */

                paddw      (     mm1,    mm3                             );/* sum */
                psllw      (     mm7,    8                               );/* {16384, .. } */

                paddw      (     mm0,    mm7                             );/* clamping */
                paddw      (     mm1,    mm6                             );/* sum+B */

                paddw      (     mm1,    mm7                             );/* clamping */
                psubusw    (     mm0,    mm7                             );/* clamping */

                psubusw    (     mm1,    mm7                             );/* clamping */
                psrlw      (     mm0,    7                               );/* (sum+B)>>7 */

                psrlw      (     mm1,    7                               );/* (sum+B)>>7 */
                packuswb   (     mm0,    mm1                             );/* pack to 8 bytes */

                movq       (     edi,  mm0                             );/* write to destination */

                esi+=    ecx;/* Src += Pitch */
                edi+=    ecx;/* Des += Pitch */

                eax+=    16;/* UDPointer += 8 */
                ebx+=    16;/* LPointer +=8 */


                /* Second Row */
                movq           ( mm0,    esi+edx               );/* mm0 = Pixels above */
                pxor           ( mm7,    mm7                             );/* clear mm7 */

                movq           ( mm1,    mm0                             );/* make a copy of mm0 */
                punpcklbw      ( mm0,    mm7                             );/* lower four pixels */

                movq           ( mm4,    eax                   );/* au */
                punpckhbw      ( mm1,    mm7                             );/* high four pixels */

                movq           ( mm5,    eax+8                 );/* au */

                pmullw         ( mm0,    mm4                             );/* pu*au */
                movq           ( mm2,    esi+ecx               );/* mm2 = pixels below */

                pmullw         ( mm1,    mm5                             );/* pu*au */
                movq           ( mm3,    mm2                             );/* make a copy of mm2 */

⌨️ 快捷键说明

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