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

📄 postprocess_template.c

📁 linux下的MPEG1
💻 C
📖 第 1 页 / 共 5 页
字号:
                "pminsw %%mm2, %%mm0                    \n\t"                "pminsw %%mm3, %%mm1                    \n\t"#else                "movq %%mm0, %%mm6                      \n\t"                "psubusw %%mm2, %%mm6                   \n\t"                "psubw %%mm6, %%mm0                     \n\t"                "movq %%mm1, %%mm6                      \n\t"                "psubusw %%mm3, %%mm6                   \n\t"                "psubw %%mm6, %%mm1                     \n\t"#endif                "movd %2, %%mm2                         \n\t" // QP                "punpcklbw %%mm7, %%mm2                 \n\t"                "movq %%mm7, %%mm6                      \n\t" // 0                "pcmpgtw %%mm4, %%mm6                   \n\t" // sign(2L2 - 5L3 + 5L4 - 2L5)                "pxor %%mm6, %%mm4                      \n\t"                "psubw %%mm6, %%mm4                     \n\t" // |2L2 - 5L3 + 5L4 - 2L5|                "pcmpgtw %%mm5, %%mm7                   \n\t" // sign(2H2 - 5H3 + 5H4 - 2H5)                "pxor %%mm7, %%mm5                      \n\t"                "psubw %%mm7, %%mm5                     \n\t" // |2H2 - 5H3 + 5H4 - 2H5|// 100 opcodes                "psllw $3, %%mm2                        \n\t" // 8QP                "movq %%mm2, %%mm3                      \n\t" // 8QP                "pcmpgtw %%mm4, %%mm2                   \n\t"                "pcmpgtw %%mm5, %%mm3                   \n\t"                "pand %%mm2, %%mm4                      \n\t"                "pand %%mm3, %%mm5                      \n\t"                "psubusw %%mm0, %%mm4                   \n\t" // hd                "psubusw %%mm1, %%mm5                   \n\t" // ld                "movq "MANGLE(w05)", %%mm2              \n\t" // 5                "pmullw %%mm2, %%mm4                    \n\t"                "pmullw %%mm2, %%mm5                    \n\t"                "movq "MANGLE(w20)", %%mm2              \n\t" // 32                "paddw %%mm2, %%mm4                     \n\t"                "paddw %%mm2, %%mm5                     \n\t"                "psrlw $6, %%mm4                        \n\t"                "psrlw $6, %%mm5                        \n\t"                "movq 16(%%"REG_c"), %%mm0              \n\t" // L3 - L4                "movq 24(%%"REG_c"), %%mm1              \n\t" // H3 - H4                "pxor %%mm2, %%mm2                      \n\t"                "pxor %%mm3, %%mm3                      \n\t"                "pcmpgtw %%mm0, %%mm2                   \n\t" // sign (L3-L4)                "pcmpgtw %%mm1, %%mm3                   \n\t" // sign (H3-H4)                "pxor %%mm2, %%mm0                      \n\t"                "pxor %%mm3, %%mm1                      \n\t"                "psubw %%mm2, %%mm0                     \n\t" // |L3-L4|                "psubw %%mm3, %%mm1                     \n\t" // |H3-H4|                "psrlw $1, %%mm0                        \n\t" // |L3 - L4|/2                "psrlw $1, %%mm1                        \n\t" // |H3 - H4|/2                "pxor %%mm6, %%mm2                      \n\t"                "pxor %%mm7, %%mm3                      \n\t"                "pand %%mm2, %%mm4                      \n\t"                "pand %%mm3, %%mm5                      \n\t"#ifdef HAVE_MMX2                "pminsw %%mm0, %%mm4                    \n\t"                "pminsw %%mm1, %%mm5                    \n\t"#else                "movq %%mm4, %%mm2                      \n\t"                "psubusw %%mm0, %%mm2                   \n\t"                "psubw %%mm2, %%mm4                     \n\t"                "movq %%mm5, %%mm2                      \n\t"                "psubusw %%mm1, %%mm2                   \n\t"                "psubw %%mm2, %%mm5                     \n\t"#endif                "pxor %%mm6, %%mm4                      \n\t"                "pxor %%mm7, %%mm5                      \n\t"                "psubw %%mm6, %%mm4                     \n\t"                "psubw %%mm7, %%mm5                     \n\t"                "packsswb %%mm5, %%mm4                  \n\t"                "movq (%0), %%mm0                       \n\t"                "paddb   %%mm4, %%mm0                   \n\t"                "movq %%mm0, (%0)                       \n\t"                "movq (%0, %1), %%mm0                   \n\t"                "psubb %%mm4, %%mm0                     \n\t"                "movq %%mm0, (%0, %1)                   \n\t"                : "+r" (src)                : "r" ((long)stride), "m" (c->pQPb)                : "%"REG_a, "%"REG_c        );#else //defined (HAVE_MMX2) || defined (HAVE_3DNOW)        const int l1= stride;        const int l2= stride + l1;        const int l3= stride + l2;        const int l4= stride + l3;        const int l5= stride + l4;        const int l6= stride + l5;        const int l7= stride + l6;        const int l8= stride + l7;//        const int l9= stride + l8;        int x;        src+= stride*3;        for(x=0; x<BLOCK_SIZE; x++)        {                const int middleEnergy= 5*(src[l5] - src[l4]) + 2*(src[l3] - src[l6]);                if(ABS(middleEnergy) < 8*c->QP)                {                        const int q=(src[l4] - src[l5])/2;                        const int leftEnergy=  5*(src[l3] - src[l2]) + 2*(src[l1] - src[l4]);                        const int rightEnergy= 5*(src[l7] - src[l6]) + 2*(src[l5] - src[l8]);                        int d= ABS(middleEnergy) - MIN( ABS(leftEnergy), ABS(rightEnergy) );                        d= MAX(d, 0);                        d= (5*d + 32) >> 6;                        d*= SIGN(-middleEnergy);                        if(q>0)                        {                                d= d<0 ? 0 : d;                                d= d>q ? q : d;                        }                        else                        {                                d= d>0 ? 0 : d;                                d= d<q ? q : d;                        }                        src[l4]-= d;                        src[l5]+= d;                }                src++;        }#endif //defined (HAVE_MMX2) || defined (HAVE_3DNOW)}#endif //HAVE_ALTIVEC#ifndef HAVE_ALTIVECstatic inline void RENAME(dering)(uint8_t src[], int stride, PPContext *c){#if defined (HAVE_MMX2) || defined (HAVE_3DNOW)        asm volatile(                "pxor %%mm6, %%mm6                      \n\t"                "pcmpeqb %%mm7, %%mm7                   \n\t"                "movq %2, %%mm0                         \n\t"                "punpcklbw %%mm6, %%mm0                 \n\t"                "psrlw $1, %%mm0                        \n\t"                "psubw %%mm7, %%mm0                     \n\t"                "packuswb %%mm0, %%mm0                  \n\t"                "movq %%mm0, %3                         \n\t"                "lea (%0, %1), %%"REG_a"                \n\t"                "lea (%%"REG_a", %1, 4), %%"REG_d"      \n\t"//        0        1        2        3        4        5        6        7        8        9//        %0        eax        eax+%1        eax+2%1        %0+4%1        edx        edx+%1        edx+2%1        %0+8%1        edx+4%1#undef FIND_MIN_MAX#ifdef HAVE_MMX2#define REAL_FIND_MIN_MAX(addr)\                "movq " #addr ", %%mm0                  \n\t"\                "pminub %%mm0, %%mm7                    \n\t"\                "pmaxub %%mm0, %%mm6                    \n\t"#else#define REAL_FIND_MIN_MAX(addr)\                "movq " #addr ", %%mm0                  \n\t"\                "movq %%mm7, %%mm1                      \n\t"\                "psubusb %%mm0, %%mm6                   \n\t"\                "paddb %%mm0, %%mm6                     \n\t"\                "psubusb %%mm0, %%mm1                   \n\t"\                "psubb %%mm1, %%mm7                     \n\t"#endif#define FIND_MIN_MAX(addr)  REAL_FIND_MIN_MAX(addr)FIND_MIN_MAX((%%REGa))FIND_MIN_MAX((%%REGa, %1))FIND_MIN_MAX((%%REGa, %1, 2))FIND_MIN_MAX((%0, %1, 4))FIND_MIN_MAX((%%REGd))FIND_MIN_MAX((%%REGd, %1))FIND_MIN_MAX((%%REGd, %1, 2))FIND_MIN_MAX((%0, %1, 8))                "movq %%mm7, %%mm4                      \n\t"                "psrlq $8, %%mm7                        \n\t"#ifdef HAVE_MMX2                "pminub %%mm4, %%mm7                    \n\t" // min of pixels                "pshufw $0xF9, %%mm7, %%mm4             \n\t"                "pminub %%mm4, %%mm7                    \n\t" // min of pixels                "pshufw $0xFE, %%mm7, %%mm4             \n\t"                "pminub %%mm4, %%mm7                    \n\t"#else                "movq %%mm7, %%mm1                      \n\t"                "psubusb %%mm4, %%mm1                   \n\t"                "psubb %%mm1, %%mm7                     \n\t"                "movq %%mm7, %%mm4                      \n\t"                "psrlq $16, %%mm7                       \n\t"                "movq %%mm7, %%mm1                      \n\t"                "psubusb %%mm4, %%mm1                   \n\t"                "psubb %%mm1, %%mm7                     \n\t"                "movq %%mm7, %%mm4                      \n\t"                "psrlq $32, %%mm7                       \n\t"                "movq %%mm7, %%mm1                      \n\t"                "psubusb %%mm4, %%mm1                   \n\t"                "psubb %%mm1, %%mm7                     \n\t"#endif                "movq %%mm6, %%mm4                      \n\t"                "psrlq $8, %%mm6                        \n\t"#ifdef HAVE_MMX2                "pmaxub %%mm4, %%mm6                    \n\t" // max of pixels                "pshufw $0xF9, %%mm6, %%mm4             \n\t"                "pmaxub %%mm4, %%mm6                    \n\t"                "pshufw $0xFE, %%mm6, %%mm4             \n\t"                "pmaxub %%mm4, %%mm6                    \n\t"#else                "psubusb %%mm4, %%mm6                   \n\t"                "paddb %%mm4, %%mm6                     \n\t"                "movq %%mm6, %%mm4                      \n\t"                "psrlq $16, %%mm6                       \n\t"                "psubusb %%mm4, %%mm6                   \n\t"                "paddb %%mm4, %%mm6                     \n\t"                "movq %%mm6, %%mm4                      \n\t"                "psrlq $32, %%mm6                       \n\t"                "psubusb %%mm4, %%mm6                   \n\t"                "paddb %%mm4, %%mm6                     \n\t"#endif                "movq %%mm6, %%mm0                      \n\t" // max                "psubb %%mm7, %%mm6                     \n\t" // max - min                "movd %%mm6, %%ecx                      \n\t"                "cmpb "MANGLE(deringThreshold)", %%cl   \n\t"                " jb 1f                                 \n\t"                "lea -24(%%"REG_SP"), %%"REG_c"         \n\t"                "and "ALIGN_MASK", %%"REG_c"            \n\t"                PAVGB(%%mm0, %%mm7)                           // a=(max + min)/2                "punpcklbw %%mm7, %%mm7                 \n\t"                "punpcklbw %%mm7, %%mm7                 \n\t"                "punpcklbw %%mm7, %%mm7                 \n\t"                "movq %%mm7, (%%"REG_c")                \n\t"                "movq (%0), %%mm0                       \n\t" // L10                "movq %%mm0, %%mm1                      \n\t" // L10                "movq %%mm0, %%mm2                      \n\t" // L10                "psllq $8, %%mm1                        \n\t"                "psrlq $8, %%mm2                        \n\t"                "movd -4(%0), %%mm3                     \n\t"                "movd 8(%0), %%mm4                      \n\t"                "psrlq $24, %%mm3                       \n\t"                "psllq $56, %%mm4                       \n\t"                "por %%mm3, %%mm1                       \n\t" // L00                "por %%mm4, %%mm2                       \n\t" // L20                "movq %%mm1, %%mm3                      \n\t" // L00                PAVGB(%%mm2, %%mm1)                           // (L20 + L00)/2                PAVGB(%%mm0, %%mm1)                           // (L20 + L00 + 2L10)/4                "psubusb %%mm7, %%mm0                   \n\t"                "psubusb %%mm7, %%mm2                   \n\t"                "psubusb %%mm7, %%mm3                   \n\t"                "pcmpeqb "MANGLE(b00

⌨️ 快捷键说明

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