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

📄 postprocess_template.c

📁 mediastreamer2是开源的网络传输媒体流的库
💻 C
📖 第 1 页 / 共 5 页
字号:
/* * Copyright (C) 2001-2002 Michael Niedermayer (michaelni@gmx.at) * * This file is part of FFmpeg. * * FFmpeg is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * FFmpeg is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with FFmpeg; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA *//** * @file postprocess_template.c * mmx/mmx2/3dnow postprocess code. */#ifdef ARCH_X86_64#  define REGa  rax#  define REGc  rcx#  define REGd  rdx#  define REG_a  "rax"#  define REG_c  "rcx"#  define REG_d  "rdx"#  define REG_SP "rsp"#  define ALIGN_MASK "$0xFFFFFFFFFFFFFFF8"#else#  define REGa  eax#  define REGc  ecx#  define REGd  edx#  define REG_a  "eax"#  define REG_c  "ecx"#  define REG_d  "edx"#  define REG_SP "esp"#  define ALIGN_MASK "$0xFFFFFFF8"#endif#undef PAVGB#undef PMINUB#undef PMAXUB#ifdef HAVE_MMX2#define REAL_PAVGB(a,b) "pavgb " #a ", " #b " \n\t"#elif defined (HAVE_3DNOW)#define REAL_PAVGB(a,b) "pavgusb " #a ", " #b " \n\t"#endif#define PAVGB(a,b)  REAL_PAVGB(a,b)#ifdef HAVE_MMX2#define PMINUB(a,b,t) "pminub " #a ", " #b " \n\t"#elif defined (HAVE_MMX)#define PMINUB(b,a,t) \        "movq " #a ", " #t " \n\t"\        "psubusb " #b ", " #t " \n\t"\        "psubb " #t ", " #a " \n\t"#endif#ifdef HAVE_MMX2#define PMAXUB(a,b) "pmaxub " #a ", " #b " \n\t"#elif defined (HAVE_MMX)#define PMAXUB(a,b) \        "psubusb " #a ", " #b " \n\t"\        "paddb " #a ", " #b " \n\t"#endif//FIXME? |255-0| = 1 (should not be a problem ...)#ifdef HAVE_MMX/** * Check if the middle 8x8 Block in the given 8x16 block is flat */static inline int RENAME(vertClassify)(uint8_t src[], int stride, PPContext *c){        int numEq= 0, dcOk;        src+= stride*4; // src points to begin of the 8x8 Blockasm volatile(                "movq %0, %%mm7                         \n\t"                "movq %1, %%mm6                         \n\t"                : : "m" (c->mmxDcOffset[c->nonBQP]),  "m" (c->mmxDcThreshold[c->nonBQP])                );asm volatile(                "lea (%2, %3), %%"REG_a"                \n\t"//      0       1       2       3       4       5       6       7       8       9//      %1      eax     eax+%2  eax+2%2 %1+4%2  ecx     ecx+%2  ecx+2%2 %1+8%2  ecx+4%2                "movq (%2), %%mm0                       \n\t"                "movq (%%"REG_a"), %%mm1                \n\t"                "movq %%mm0, %%mm3                      \n\t"                "movq %%mm0, %%mm4                      \n\t"                PMAXUB(%%mm1, %%mm4)                PMINUB(%%mm1, %%mm3, %%mm5)                "psubb %%mm1, %%mm0                     \n\t" // mm0 = differnece                "paddb %%mm7, %%mm0                     \n\t"                "pcmpgtb %%mm6, %%mm0                   \n\t"                "movq (%%"REG_a",%3), %%mm2             \n\t"                PMAXUB(%%mm2, %%mm4)                PMINUB(%%mm2, %%mm3, %%mm5)                "psubb %%mm2, %%mm1                     \n\t"                "paddb %%mm7, %%mm1                     \n\t"                "pcmpgtb %%mm6, %%mm1                   \n\t"                "paddb %%mm1, %%mm0                     \n\t"                "movq (%%"REG_a", %3, 2), %%mm1         \n\t"                PMAXUB(%%mm1, %%mm4)                PMINUB(%%mm1, %%mm3, %%mm5)                "psubb %%mm1, %%mm2                     \n\t"                "paddb %%mm7, %%mm2                     \n\t"                "pcmpgtb %%mm6, %%mm2                   \n\t"                "paddb %%mm2, %%mm0                     \n\t"                "lea (%%"REG_a", %3, 4), %%"REG_a"      \n\t"                "movq (%2, %3, 4), %%mm2                \n\t"                PMAXUB(%%mm2, %%mm4)                PMINUB(%%mm2, %%mm3, %%mm5)                "psubb %%mm2, %%mm1                     \n\t"                "paddb %%mm7, %%mm1                     \n\t"                "pcmpgtb %%mm6, %%mm1                   \n\t"                "paddb %%mm1, %%mm0                     \n\t"                "movq (%%"REG_a"), %%mm1                \n\t"                PMAXUB(%%mm1, %%mm4)                PMINUB(%%mm1, %%mm3, %%mm5)                "psubb %%mm1, %%mm2                     \n\t"                "paddb %%mm7, %%mm2                     \n\t"                "pcmpgtb %%mm6, %%mm2                   \n\t"                "paddb %%mm2, %%mm0                     \n\t"                "movq (%%"REG_a", %3), %%mm2            \n\t"                PMAXUB(%%mm2, %%mm4)                PMINUB(%%mm2, %%mm3, %%mm5)                "psubb %%mm2, %%mm1                     \n\t"                "paddb %%mm7, %%mm1                     \n\t"                "pcmpgtb %%mm6, %%mm1                   \n\t"                "paddb %%mm1, %%mm0                     \n\t"                "movq (%%"REG_a", %3, 2), %%mm1         \n\t"                PMAXUB(%%mm1, %%mm4)                PMINUB(%%mm1, %%mm3, %%mm5)                "psubb %%mm1, %%mm2                     \n\t"                "paddb %%mm7, %%mm2                     \n\t"                "pcmpgtb %%mm6, %%mm2                   \n\t"                "paddb %%mm2, %%mm0                     \n\t"                "psubusb %%mm3, %%mm4                   \n\t"                "                                       \n\t"#ifdef HAVE_MMX2                "pxor %%mm7, %%mm7                      \n\t"                "psadbw %%mm7, %%mm0                    \n\t"#else                "movq %%mm0, %%mm1                      \n\t"                "psrlw $8, %%mm0                        \n\t"                "paddb %%mm1, %%mm0                     \n\t"                "movq %%mm0, %%mm1                      \n\t"                "psrlq $16, %%mm0                       \n\t"                "paddb %%mm1, %%mm0                     \n\t"                "movq %%mm0, %%mm1                      \n\t"                "psrlq $32, %%mm0                       \n\t"                "paddb %%mm1, %%mm0                     \n\t"#endif                "movq %4, %%mm7                         \n\t" // QP,..., QP                "paddusb %%mm7, %%mm7                   \n\t" // 2QP ... 2QP                "psubusb %%mm7, %%mm4                   \n\t" // Diff <= 2QP -> 0                "packssdw %%mm4, %%mm4                  \n\t"                "movd %%mm0, %0                         \n\t"                "movd %%mm4, %1                         \n\t"                : "=r" (numEq), "=r" (dcOk)                : "r" (src), "r" ((long)stride), "m" (c->pQPb)                : "%"REG_a                );        numEq= (-numEq) &0xFF;        if(numEq > c->ppMode.flatnessThreshold){            if(dcOk) return 0;            else     return 1;        }else{            return 2;        }}#endif //HAVE_MMX/** * Do a vertical low pass filter on the 8x16 block (only write to the 8x8 block in the middle) * using the 9-Tap Filter (1,1,2,2,4,2,2,1,1)/16 */#ifndef HAVE_ALTIVECstatic inline void RENAME(doVertLowPass)(uint8_t *src, int stride, PPContext *c){#if defined (HAVE_MMX2) || defined (HAVE_3DNOW)        src+= stride*3;        asm volatile(        //"movv %0 %1 %2\n\t"                "movq %2, %%mm0                         \n\t"  // QP,..., QP                "pxor %%mm4, %%mm4                      \n\t"                "movq (%0), %%mm6                       \n\t"                "movq (%0, %1), %%mm5                   \n\t"                "movq %%mm5, %%mm1                      \n\t"                "movq %%mm6, %%mm2                      \n\t"                "psubusb %%mm6, %%mm5                   \n\t"                "psubusb %%mm1, %%mm2                   \n\t"                "por %%mm5, %%mm2                       \n\t" // ABS Diff of lines                "psubusb %%mm0, %%mm2                   \n\t" // diff <= QP -> 0                "pcmpeqb %%mm4, %%mm2                   \n\t" // diff <= QP -> FF                "pand %%mm2, %%mm6                      \n\t"                "pandn %%mm1, %%mm2                     \n\t"                "por %%mm2, %%mm6                       \n\t"// First Line to Filter                "movq (%0, %1, 8), %%mm5                \n\t"                "lea (%0, %1, 4), %%"REG_a"             \n\t"                "lea (%0, %1, 8), %%"REG_c"             \n\t"                "sub %1, %%"REG_c"                      \n\t"                "add %1, %0                             \n\t" // %0 points to line 1 not 0                "movq (%0, %1, 8), %%mm7                \n\t"                "movq %%mm5, %%mm1                      \n\t"                "movq %%mm7, %%mm2                      \n\t"                "psubusb %%mm7, %%mm5                   \n\t"                "psubusb %%mm1, %%mm2                   \n\t"                "por %%mm5, %%mm2                       \n\t" // ABS Diff of lines                "psubusb %%mm0, %%mm2                   \n\t" // diff <= QP -> 0                "pcmpeqb %%mm4, %%mm2                   \n\t" // diff <= QP -> FF                "pand %%mm2, %%mm7                      \n\t"                "pandn %%mm1, %%mm2                     \n\t"                "por %%mm2, %%mm7                       \n\t" // First Line to Filter                //      1       2       3       4       5       6       7       8                //      %0      %0+%1   %0+2%1  eax     %0+4%1  eax+2%1 ecx     eax+4%1                // 6 4 2 2 1 1                // 6 4 4 2                // 6 8 2                "movq (%0, %1), %%mm0                   \n\t" //  1                "movq %%mm0, %%mm1                      \n\t" //  1                PAVGB(%%mm6, %%mm0)                           //1 1        /2                PAVGB(%%mm6, %%mm0)                           //3 1        /4                "movq (%0, %1, 4), %%mm2                \n\t" //     1                "movq %%mm2, %%mm5                      \n\t" //     1                PAVGB((%%REGa), %%mm2)                        //    11        /2                PAVGB((%0, %1, 2), %%mm2)                     //   211        /4                "movq %%mm2, %%mm3                      \n\t" //   211        /4                "movq (%0), %%mm4                       \n\t" // 1                PAVGB(%%mm4, %%mm3)                           // 4 211        /8                PAVGB(%%mm0, %%mm3)                           //642211        /16                "movq %%mm3, (%0)                       \n\t" // X                // mm1=2 mm2=3(211) mm4=1 mm5=5 mm6=0 mm7=9                "movq %%mm1, %%mm0                      \n\t" //  1                PAVGB(%%mm6, %%mm0)                           //1 1        /2

⌨️ 快捷键说明

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