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

📄 postprocess_template.c

📁 ffmpeg的完整源代码和作者自己写的文档。不但有在Linux的工程哦
💻 C
📖 第 1 页 / 共 5 页
字号:
                "psubusb %%mm0, %%mm4                   \n\t" //d = MAX(0, |l4-l5| - (|l2-l3| + |l5-l6|)/2)
                "movq %%mm4, %%mm3                      \n\t" // d
                "movq %2, %%mm0                         \n\t"
                "paddusb %%mm0, %%mm0                   \n\t"
                "psubusb %%mm0, %%mm4                   \n\t"
                "pcmpeqb %%mm7, %%mm4                   \n\t" // d <= QP ? -1 : 0
                "psubusb "MANGLE(b01)", %%mm3           \n\t"
                "pand %%mm4, %%mm3                      \n\t" // d <= QP ? d : 0

                PAVGB(%%mm7, %%mm3)                           // d/2
                "movq %%mm3, %%mm1                      \n\t" // d/2
                PAVGB(%%mm7, %%mm3)                           // d/4
                PAVGB(%%mm1, %%mm3)                           // 3*d/8

                "movq (%0, %1, 4), %%mm0                \n\t" // line 4
                "pxor %%mm2, %%mm0                      \n\t" //(l4 - l5) <= 0 ? -l4-1 : l4
                "psubusb %%mm3, %%mm0                   \n\t"
                "pxor %%mm2, %%mm0                      \n\t"
                "movq %%mm0, (%0, %1, 4)                \n\t" // line 4

                "movq (%%"REG_c"), %%mm0                \n\t" // line 5
                "pxor %%mm2, %%mm0                      \n\t" //(l4 - l5) <= 0 ? -l5-1 : l5
                "paddusb %%mm3, %%mm0                   \n\t"
                "pxor %%mm2, %%mm0                      \n\t"
                "movq %%mm0, (%%"REG_c")                \n\t" // line 5

                PAVGB(%%mm7, %%mm1)                           // d/4

                "movq (%%"REG_a", %1, 2), %%mm0         \n\t" // line 3
                "pxor %%mm2, %%mm0                      \n\t" //(l4 - l5) <= 0 ? -l4-1 : l4
                "psubusb %%mm1, %%mm0                   \n\t"
                "pxor %%mm2, %%mm0                      \n\t"
                "movq %%mm0, (%%"REG_a", %1, 2)         \n\t" // line 3

                "movq (%%"REG_c", %1), %%mm0            \n\t" // line 6
                "pxor %%mm2, %%mm0                      \n\t" //(l4 - l5) <= 0 ? -l5-1 : l5
                "paddusb %%mm1, %%mm0                   \n\t"
                "pxor %%mm2, %%mm0                      \n\t"
                "movq %%mm0, (%%"REG_c", %1)            \n\t" // line 6

                PAVGB(%%mm7, %%mm1)                           // d/8

                "movq (%%"REG_a", %1), %%mm0            \n\t" // line 2
                "pxor %%mm2, %%mm0                      \n\t" //(l4 - l5) <= 0 ? -l2-1 : l2
                "psubusb %%mm1, %%mm0                   \n\t"
                "pxor %%mm2, %%mm0                      \n\t"
                "movq %%mm0, (%%"REG_a", %1)            \n\t" // line 2

                "movq (%%"REG_c", %1, 2), %%mm0         \n\t" // line 7
                "pxor %%mm2, %%mm0                      \n\t" //(l4 - l5) <= 0 ? -l7-1 : l7
                "paddusb %%mm1, %%mm0                   \n\t"
                "pxor %%mm2, %%mm0                      \n\t"
                "movq %%mm0, (%%"REG_c", %1, 2)         \n\t" // line 7

                :
                : "r" (src), "r" ((long)stride), "m" (co->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++)
        {
                int a= src[l3] - src[l4];
                int b= src[l4] - src[l5];
                int c= src[l5] - src[l6];

                int d= FFABS(b) - ((FFABS(a) + FFABS(c))>>1);
                d= FFMAX(d, 0);

                if(d < co->QP*2)
                {
                        int v = d * FFSIGN(-b);

                        src[l2] +=v>>3;
                        src[l3] +=v>>2;
                        src[l4] +=(3*v)>>3;
                        src[l5] -=(3*v)>>3;
                        src[l6] -=v>>2;
                        src[l7] -=v>>3;

                }
                src++;
        }
#endif //defined (HAVE_MMX2) || defined (HAVE_3DNOW)
}

#ifndef HAVE_ALTIVEC
static inline void RENAME(doVertDefFilter)(uint8_t src[], int stride, PPContext *c)
{
#if defined (HAVE_MMX2) || defined (HAVE_3DNOW)
/*
        uint8_t tmp[16];
        const int l1= stride;
        const int l2= stride + l1;
        const int l3= stride + l2;
        const int l4= (int)tmp - (int)src - stride*3;
        const int l5= (int)tmp - (int)src - stride*3 + 8;
        const int l6= stride*3 + l3;
        const int l7= stride + l6;
        const int l8= stride + l7;

        memcpy(tmp, src+stride*7, 8);
        memcpy(tmp+8, src+stride*8, 8);
*/
        src+= stride*4;
        asm volatile(

#if 0 //sligtly more accurate and slightly slower
                "pxor %%mm7, %%mm7                      \n\t" // 0
                "lea (%0, %1), %%"REG_a"                \n\t"
                "lea (%%"REG_a", %1, 4), %%"REG_c"      \n\t"
//      0       1       2       3       4       5       6       7
//      %0      %0+%1   %0+2%1  eax+2%1 %0+4%1  eax+4%1 ecx+%1  ecx+2%1
//      %0      eax     eax+%1  eax+2%1 %0+4%1  ecx     ecx+%1  ecx+2%1


                "movq (%0, %1, 2), %%mm0                \n\t" // l2
                "movq (%0), %%mm1                       \n\t" // l0
                "movq %%mm0, %%mm2                      \n\t" // l2
                PAVGB(%%mm7, %%mm0)                           // ~l2/2
                PAVGB(%%mm1, %%mm0)                           // ~(l2 + 2l0)/4
                PAVGB(%%mm2, %%mm0)                           // ~(5l2 + 2l0)/8

                "movq (%%"REG_a"), %%mm1                \n\t" // l1
                "movq (%%"REG_a", %1, 2), %%mm3         \n\t" // l3
                "movq %%mm1, %%mm4                      \n\t" // l1
                PAVGB(%%mm7, %%mm1)                           // ~l1/2
                PAVGB(%%mm3, %%mm1)                           // ~(l1 + 2l3)/4
                PAVGB(%%mm4, %%mm1)                           // ~(5l1 + 2l3)/8

                "movq %%mm0, %%mm4                      \n\t" // ~(5l2 + 2l0)/8
                "psubusb %%mm1, %%mm0                   \n\t"
                "psubusb %%mm4, %%mm1                   \n\t"
                "por %%mm0, %%mm1                       \n\t" // ~|2l0 - 5l1 + 5l2 - 2l3|/8
// mm1= |lenergy|, mm2= l2, mm3= l3, mm7=0

                "movq (%0, %1, 4), %%mm0                \n\t" // l4
                "movq %%mm0, %%mm4                      \n\t" // l4
                PAVGB(%%mm7, %%mm0)                           // ~l4/2
                PAVGB(%%mm2, %%mm0)                           // ~(l4 + 2l2)/4
                PAVGB(%%mm4, %%mm0)                           // ~(5l4 + 2l2)/8

                "movq (%%"REG_c"), %%mm2                \n\t" // l5
                "movq %%mm3, %%mm5                      \n\t" // l3
                PAVGB(%%mm7, %%mm3)                           // ~l3/2
                PAVGB(%%mm2, %%mm3)                           // ~(l3 + 2l5)/4
                PAVGB(%%mm5, %%mm3)                           // ~(5l3 + 2l5)/8

                "movq %%mm0, %%mm6                      \n\t" // ~(5l4 + 2l2)/8
                "psubusb %%mm3, %%mm0                   \n\t"
                "psubusb %%mm6, %%mm3                   \n\t"
                "por %%mm0, %%mm3                       \n\t" // ~|2l2 - 5l3 + 5l4 - 2l5|/8
                "pcmpeqb %%mm7, %%mm0                   \n\t" // SIGN(2l2 - 5l3 + 5l4 - 2l5)
// mm0= SIGN(menergy), mm1= |lenergy|, mm2= l5, mm3= |menergy|, mm4=l4, mm5= l3, mm7=0

                "movq (%%"REG_c", %1), %%mm6            \n\t" // l6
                "movq %%mm6, %%mm5                      \n\t" // l6
                PAVGB(%%mm7, %%mm6)                           // ~l6/2
                PAVGB(%%mm4, %%mm6)                           // ~(l6 + 2l4)/4
                PAVGB(%%mm5, %%mm6)                           // ~(5l6 + 2l4)/8

                "movq (%%"REG_c", %1, 2), %%mm5         \n\t" // l7
                "movq %%mm2, %%mm4                      \n\t" // l5
                PAVGB(%%mm7, %%mm2)                           // ~l5/2
                PAVGB(%%mm5, %%mm2)                           // ~(l5 + 2l7)/4
                PAVGB(%%mm4, %%mm2)                           // ~(5l5 + 2l7)/8

                "movq %%mm6, %%mm4                      \n\t" // ~(5l6 + 2l4)/8
                "psubusb %%mm2, %%mm6                   \n\t"
                "psubusb %%mm4, %%mm2                   \n\t"
                "por %%mm6, %%mm2                       \n\t" // ~|2l4 - 5l5 + 5l6 - 2l7|/8
// mm0= SIGN(menergy), mm1= |lenergy|/8, mm2= |renergy|/8, mm3= |menergy|/8, mm7=0


                PMINUB(%%mm2, %%mm1, %%mm4)                   // MIN(|lenergy|,|renergy|)/8
                "movq %2, %%mm4                         \n\t" // QP //FIXME QP+1 ?
                "paddusb "MANGLE(b01)", %%mm4           \n\t"
                "pcmpgtb %%mm3, %%mm4                   \n\t" // |menergy|/8 < QP
                "psubusb %%mm1, %%mm3                   \n\t" // d=|menergy|/8-MIN(|lenergy|,|renergy|)/8
                "pand %%mm4, %%mm3                      \n\t"

                "movq %%mm3, %%mm1                      \n\t"
//                "psubusb "MANGLE(b01)", %%mm3           \n\t"
                PAVGB(%%mm7, %%mm3)
                PAVGB(%%mm7, %%mm3)
                "paddusb %%mm1, %%mm3                   \n\t"
//                "paddusb "MANGLE(b01)", %%mm3           \n\t"

                "movq (%%"REG_a", %1, 2), %%mm6         \n\t" //l3
                "movq (%0, %1, 4), %%mm5                \n\t" //l4
                "movq (%0, %1, 4), %%mm4                \n\t" //l4
                "psubusb %%mm6, %%mm5                   \n\t"
                "psubusb %%mm4, %%mm6                   \n\t"
                "por %%mm6, %%mm5                       \n\t" // |l3-l4|
                "pcmpeqb %%mm7, %%mm6                   \n\t" // SIGN(l3-l4)
                "pxor %%mm6, %%mm0                      \n\t"
                "pand %%mm0, %%mm3                      \n\t"
                PMINUB(%%mm5, %%mm3, %%mm0)

                "psubusb "MANGLE(b01)", %%mm3           \n\t"
                PAVGB(%%mm7, %%mm3)

                "movq (%%"REG_a", %1, 2), %%mm0         \n\t"
                "movq (%0, %1, 4), %%mm2                \n\t"
                "pxor %%mm6, %%mm0                      \n\t"
                "pxor %%mm6, %%mm2                      \n\t"
                "psubb %%mm3, %%mm0                     \n\t"
                "paddb %%mm3, %%mm2                     \n\t"
                "pxor %%mm6, %%mm0                      \n\t"
                "pxor %%mm6, %%mm2                      \n\t"
                "movq %%mm0, (%%"REG_a", %1, 2)         \n\t"
                "movq %%mm2, (%0, %1, 4)                \n\t"
#endif //0

                "lea (%0, %1), %%"REG_a"                \n\t"
                "pcmpeqb %%mm6, %%mm6                   \n\t" // -1
//      0       1       2       3       4       5       6       7
//      %0      %0+%1   %0+2%1  eax+2%1 %0+4%1  eax+4%1 ecx+%1  ecx+2%1
//      %0      eax     eax+%1  eax+2%1 %0+4%1  ecx     ecx+%1  ecx+2%1


                "movq (%%"REG_a", %1, 2), %%mm1         \n\t" // l3
                "movq (%0, %1, 4), %%mm0                \n\t" // l4
                "pxor %%mm6, %%mm1                      \n\t" // -l3-1
                PAVGB(%%mm1, %%mm0)                           // -q+128 = (l4-l3+256)/2
// mm1=-l3-1, mm0=128-q

                "movq (%%"REG_a", %1, 4), %%mm2         \n\t" // l5
                "movq (%%"REG_a", %1), %%mm3            \n\t" // l2
                "pxor %%mm6, %%mm2                      \n\t" // -l5-1
                "movq %%mm2, %%mm5                      \n\t" // -l5-1
                "movq "MANGLE(b80)", %%mm4              \n\t" // 128
                "lea (%%"REG_a", %1, 4), %%"REG_c"      \n\t"
                PAVGB(%%mm3, %%mm2)                           // (l2-l5+256)/2
                PAVGB(%%mm0, %%mm4)                           // ~(l4-l3)/4 + 128
                PAVGB(%%mm2, %%mm4)                           // ~(l2-l5)/4 +(l4-l3)/8 + 128
                PAVGB(%%mm0, %%mm4)                           // ~(l2-l5)/8 +5(l4-l3)/16 + 128
// mm1=-l3-1, mm0=128-q, mm3=l2, mm4=menergy/16 + 128, mm5= -l5-1

                "movq (%%"REG_a"), %%mm2                \n\t" // l1
                "pxor %%mm6, %%mm2                      \n\t" // -l1-1
                PAVGB(%%mm3, %%mm2)                           // (l2-l1+256)/2
                PAVGB((%0), %%mm1)                            // (l0-l3+256)/2
                "movq "MANGLE(b80)", %%mm3              \n\t" // 128
                PAVGB(%%mm2, %%mm3)                           // ~(l2-l1)/4 + 128

⌨️ 快捷键说明

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