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

📄 swscale_template.c

📁 mediastreamer2是开源的网络传输媒体流的库
💻 C
📖 第 1 页 / 共 5 页
字号:
/* * Copyright (C) 2001-2003 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 * * the C code (not assembly, mmx, ...) of this file can be used * under the LGPL license too */#undef REAL_MOVNTQ#undef MOVNTQ#undef PAVGB#undef PREFETCH#undef PREFETCHW#undef EMMS#undef SFENCE#ifdef HAVE_3DNOW/* On K6 femms is faster of emms. On K7 femms is directly mapped on emms. */#define EMMS     "femms"#else#define EMMS     "emms"#endif#ifdef HAVE_3DNOW#define PREFETCH  "prefetch"#define PREFETCHW "prefetchw"#elif defined (HAVE_MMX2)#define PREFETCH "prefetchnta"#define PREFETCHW "prefetcht0"#else#define PREFETCH  " # nop"#define PREFETCHW " # nop"#endif#ifdef HAVE_MMX2#define SFENCE "sfence"#else#define SFENCE " # nop"#endif#ifdef HAVE_MMX2#define PAVGB(a,b) "pavgb " #a ", " #b " \n\t"#elif defined (HAVE_3DNOW)#define PAVGB(a,b) "pavgusb " #a ", " #b " \n\t"#endif#ifdef HAVE_MMX2#define REAL_MOVNTQ(a,b) "movntq " #a ", " #b " \n\t"#else#define REAL_MOVNTQ(a,b) "movq " #a ", " #b " \n\t"#endif#define MOVNTQ(a,b)  REAL_MOVNTQ(a,b)#ifdef HAVE_ALTIVEC#include "swscale_altivec_template.c"#endif#define YSCALEYUV2YV12X(x, offset, dest, width) \    asm volatile(\    "xor                          %%"REG_a", %%"REG_a"  \n\t"\    "movq             "VROUNDER_OFFSET"(%0), %%mm3      \n\t"\    "movq                             %%mm3, %%mm4      \n\t"\    "lea                     " offset "(%0), %%"REG_d"  \n\t"\    "mov                        (%%"REG_d"), %%"REG_S"  \n\t"\    ASMALIGN(4) /* FIXME Unroll? */\    "1:                                                 \n\t"\    "movq                      8(%%"REG_d"), %%mm0      \n\t" /* filterCoeff */\    "movq   " #x "(%%"REG_S", %%"REG_a", 2), %%mm2      \n\t" /* srcData */\    "movq 8+" #x "(%%"REG_S", %%"REG_a", 2), %%mm5      \n\t" /* srcData */\    "add                                $16, %%"REG_d"  \n\t"\    "mov                        (%%"REG_d"), %%"REG_S"  \n\t"\    "test                         %%"REG_S", %%"REG_S"  \n\t"\    "pmulhw                           %%mm0, %%mm2      \n\t"\    "pmulhw                           %%mm0, %%mm5      \n\t"\    "paddw                            %%mm2, %%mm3      \n\t"\    "paddw                            %%mm5, %%mm4      \n\t"\    " jnz                                1b             \n\t"\    "psraw                               $3, %%mm3      \n\t"\    "psraw                               $3, %%mm4      \n\t"\    "packuswb                         %%mm4, %%mm3      \n\t"\    MOVNTQ(%%mm3, (%1, %%REGa))\    "add                                 $8, %%"REG_a"  \n\t"\    "cmp                                 %2, %%"REG_a"  \n\t"\    "movq             "VROUNDER_OFFSET"(%0), %%mm3      \n\t"\    "movq                             %%mm3, %%mm4      \n\t"\    "lea                     " offset "(%0), %%"REG_d"  \n\t"\    "mov                        (%%"REG_d"), %%"REG_S"  \n\t"\    "jb                                  1b             \n\t"\    :: "r" (&c->redDither),\    "r" (dest), "g" (width)\    : "%"REG_a, "%"REG_d, "%"REG_S\    );#define YSCALEYUV2YV12X_ACCURATE(x, offset, dest, width) \    asm volatile(\    "lea                     " offset "(%0), %%"REG_d"  \n\t"\    "xor                          %%"REG_a", %%"REG_a"  \n\t"\    "pxor                             %%mm4, %%mm4      \n\t"\    "pxor                             %%mm5, %%mm5      \n\t"\    "pxor                             %%mm6, %%mm6      \n\t"\    "pxor                             %%mm7, %%mm7      \n\t"\    "mov                        (%%"REG_d"), %%"REG_S"  \n\t"\    ASMALIGN(4) \    "1:                                                 \n\t"\    "movq   " #x "(%%"REG_S", %%"REG_a", 2), %%mm0      \n\t" /* srcData */\    "movq 8+" #x "(%%"REG_S", %%"REG_a", 2), %%mm2      \n\t" /* srcData */\    "mov                       4(%%"REG_d"), %%"REG_S"  \n\t"\    "movq   " #x "(%%"REG_S", %%"REG_a", 2), %%mm1      \n\t" /* srcData */\    "movq                             %%mm0, %%mm3      \n\t"\    "punpcklwd                        %%mm1, %%mm0      \n\t"\    "punpckhwd                        %%mm1, %%mm3      \n\t"\    "movq                      8(%%"REG_d"), %%mm1      \n\t" /* filterCoeff */\    "pmaddwd                          %%mm1, %%mm0      \n\t"\    "pmaddwd                          %%mm1, %%mm3      \n\t"\    "paddd                            %%mm0, %%mm4      \n\t"\    "paddd                            %%mm3, %%mm5      \n\t"\    "movq 8+" #x "(%%"REG_S", %%"REG_a", 2), %%mm3      \n\t" /* srcData */\    "mov                      16(%%"REG_d"), %%"REG_S"  \n\t"\    "add                                $16, %%"REG_d"  \n\t"\    "test                         %%"REG_S", %%"REG_S"  \n\t"\    "movq                             %%mm2, %%mm0      \n\t"\    "punpcklwd                        %%mm3, %%mm2      \n\t"\    "punpckhwd                        %%mm3, %%mm0      \n\t"\    "pmaddwd                          %%mm1, %%mm2      \n\t"\    "pmaddwd                          %%mm1, %%mm0      \n\t"\    "paddd                            %%mm2, %%mm6      \n\t"\    "paddd                            %%mm0, %%mm7      \n\t"\    " jnz                                1b             \n\t"\    "psrad                              $16, %%mm4      \n\t"\    "psrad                              $16, %%mm5      \n\t"\    "psrad                              $16, %%mm6      \n\t"\    "psrad                              $16, %%mm7      \n\t"\    "movq             "VROUNDER_OFFSET"(%0), %%mm0      \n\t"\    "packssdw                         %%mm5, %%mm4      \n\t"\    "packssdw                         %%mm7, %%mm6      \n\t"\    "paddw                            %%mm0, %%mm4      \n\t"\    "paddw                            %%mm0, %%mm6      \n\t"\    "psraw                               $3, %%mm4      \n\t"\    "psraw                               $3, %%mm6      \n\t"\    "packuswb                         %%mm6, %%mm4      \n\t"\    MOVNTQ(%%mm4, (%1, %%REGa))\    "add                                 $8, %%"REG_a"  \n\t"\    "cmp                                 %2, %%"REG_a"  \n\t"\    "lea                     " offset "(%0), %%"REG_d"  \n\t"\    "pxor                             %%mm4, %%mm4      \n\t"\    "pxor                             %%mm5, %%mm5      \n\t"\    "pxor                             %%mm6, %%mm6      \n\t"\    "pxor                             %%mm7, %%mm7      \n\t"\    "mov                        (%%"REG_d"), %%"REG_S"  \n\t"\    "jb                                  1b             \n\t"\    :: "r" (&c->redDither),\    "r" (dest), "g" (width)\    : "%"REG_a, "%"REG_d, "%"REG_S\    );#define YSCALEYUV2YV121 \    "mov %2, %%"REG_a"                    \n\t"\    ASMALIGN(4) /* FIXME Unroll? */\    "1:                                   \n\t"\    "movq  (%0, %%"REG_a", 2), %%mm0      \n\t"\    "movq 8(%0, %%"REG_a", 2), %%mm1      \n\t"\    "psraw                 $7, %%mm0      \n\t"\    "psraw                 $7, %%mm1      \n\t"\    "packuswb           %%mm1, %%mm0      \n\t"\    MOVNTQ(%%mm0, (%1, %%REGa))\    "add                   $8, %%"REG_a"  \n\t"\    "jnc                   1b             \n\t"/*    :: "m" (-lumFilterSize), "m" (-chrFilterSize),       "m" (lumMmxFilter+lumFilterSize*4), "m" (chrMmxFilter+chrFilterSize*4),       "r" (dest), "m" (dstW),       "m" (lumSrc+lumFilterSize), "m" (chrSrc+chrFilterSize)    : "%eax", "%ebx", "%ecx", "%edx", "%esi"*/#define YSCALEYUV2PACKEDX \    asm volatile(\    "xor                   %%"REG_a", %%"REG_a"     \n\t"\    ASMALIGN(4)\    "nop                                            \n\t"\    "1:                                             \n\t"\    "lea "CHR_MMX_FILTER_OFFSET"(%0), %%"REG_d"     \n\t"\    "mov                 (%%"REG_d"), %%"REG_S"     \n\t"\    "movq      "VROUNDER_OFFSET"(%0), %%mm3         \n\t"\    "movq                      %%mm3, %%mm4         \n\t"\    ASMALIGN(4)\    "2:                                             \n\t"\    "movq               8(%%"REG_d"), %%mm0         \n\t" /* filterCoeff */\    "movq     (%%"REG_S", %%"REG_a"), %%mm2         \n\t" /* UsrcData */\    "movq 4096(%%"REG_S", %%"REG_a"), %%mm5         \n\t" /* VsrcData */\    "add                         $16, %%"REG_d"     \n\t"\    "mov                 (%%"REG_d"), %%"REG_S"     \n\t"\    "pmulhw                    %%mm0, %%mm2         \n\t"\    "pmulhw                    %%mm0, %%mm5         \n\t"\    "paddw                     %%mm2, %%mm3         \n\t"\    "paddw                     %%mm5, %%mm4         \n\t"\    "test                  %%"REG_S", %%"REG_S"     \n\t"\    " jnz                         2b                \n\t"\\    "lea "LUM_MMX_FILTER_OFFSET"(%0), %%"REG_d"     \n\t"\    "mov                 (%%"REG_d"), %%"REG_S"     \n\t"\    "movq      "VROUNDER_OFFSET"(%0), %%mm1         \n\t"\    "movq                      %%mm1, %%mm7         \n\t"\    ASMALIGN(4)\    "2:                                             \n\t"\    "movq               8(%%"REG_d"), %%mm0         \n\t" /* filterCoeff */\    "movq  (%%"REG_S", %%"REG_a", 2), %%mm2         \n\t" /* Y1srcData */\    "movq 8(%%"REG_S", %%"REG_a", 2), %%mm5         \n\t" /* Y2srcData */\    "add                         $16, %%"REG_d"            \n\t"\    "mov                 (%%"REG_d"), %%"REG_S"     \n\t"\    "pmulhw                    %%mm0, %%mm2         \n\t"\    "pmulhw                    %%mm0, %%mm5         \n\t"\    "paddw                     %%mm2, %%mm1         \n\t"\    "paddw                     %%mm5, %%mm7         \n\t"\    "test                  %%"REG_S", %%"REG_S"     \n\t"\    " jnz                         2b                \n\t"\#define YSCALEYUV2PACKEDX_END                 \    :: "r" (&c->redDither),                   \        "m" (dummy), "m" (dummy), "m" (dummy),\        "r" (dest), "m" (dstW)                \    : "%"REG_a, "%"REG_d, "%"REG_S            \    );#define YSCALEYUV2PACKEDX_ACCURATE \    asm volatile(\    "xor %%"REG_a", %%"REG_a"                       \n\t"\    ASMALIGN(4)\    "nop                                            \n\t"\    "1:                                             \n\t"\    "lea "CHR_MMX_FILTER_OFFSET"(%0), %%"REG_d"     \n\t"\    "mov                 (%%"REG_d"), %%"REG_S"     \n\t"\    "pxor                      %%mm4, %%mm4         \n\t"\    "pxor                      %%mm5, %%mm5         \n\t"\    "pxor                      %%mm6, %%mm6         \n\t"\    "pxor                      %%mm7, %%mm7         \n\t"\    ASMALIGN(4)\    "2:                                             \n\t"\    "movq     (%%"REG_S", %%"REG_a"), %%mm0         \n\t" /* UsrcData */\    "movq 4096(%%"REG_S", %%"REG_a"), %%mm2         \n\t" /* VsrcData */\    "mov                4(%%"REG_d"), %%"REG_S"     \n\t"\    "movq     (%%"REG_S", %%"REG_a"), %%mm1         \n\t" /* UsrcData */\    "movq                      %%mm0, %%mm3         \n\t"\    "punpcklwd                 %%mm1, %%mm0         \n\t"\    "punpckhwd                 %%mm1, %%mm3         \n\t"\    "movq               8(%%"REG_d"), %%mm1         \n\t" /* filterCoeff */\    "pmaddwd                   %%mm1, %%mm0         \n\t"\    "pmaddwd                   %%mm1, %%mm3         \n\t"\    "paddd                     %%mm0, %%mm4         \n\t"\    "paddd                     %%mm3, %%mm5         \n\t"\    "movq 4096(%%"REG_S", %%"REG_a"), %%mm3         \n\t" /* VsrcData */\    "mov               16(%%"REG_d"), %%"REG_S"     \n\t"\    "add                         $16, %%"REG_d"     \n\t"\    "test                  %%"REG_S", %%"REG_S"     \n\t"\    "movq                      %%mm2, %%mm0         \n\t"\    "punpcklwd                 %%mm3, %%mm2         \n\t"\    "punpckhwd                 %%mm3, %%mm0         \n\t"\    "pmaddwd                   %%mm1, %%mm2         \n\t"\    "pmaddwd                   %%mm1, %%mm0         \n\t"\    "paddd                     %%mm2, %%mm6         \n\t"\    "paddd                     %%mm0, %%mm7         \n\t"\    " jnz                         2b                \n\t"\    "psrad                       $16, %%mm4         \n\t"\    "psrad                       $16, %%mm5         \n\t"\    "psrad                       $16, %%mm6         \n\t"\    "psrad                       $16, %%mm7         \n\t"\    "movq      "VROUNDER_OFFSET"(%0), %%mm0         \n\t"\    "packssdw                  %%mm5, %%mm4         \n\t"\    "packssdw                  %%mm7, %%mm6         \n\t"\    "paddw                     %%mm0, %%mm4         \n\t"\    "paddw                     %%mm0, %%mm6         \n\t"\    "movq                      %%mm4, "U_TEMP"(%0)  \n\t"\    "movq                      %%mm6, "V_TEMP"(%0)  \n\t"\\    "lea "LUM_MMX_FILTER_OFFSET"(%0), %%"REG_d"     \n\t"\    "mov                 (%%"REG_d"), %%"REG_S"     \n\t"\    "pxor                      %%mm1, %%mm1         \n\t"\    "pxor                      %%mm5, %%mm5         \n\t"\    "pxor                      %%mm7, %%mm7         \n\t"\    "pxor                      %%mm6, %%mm6         \n\t"\

⌨️ 快捷键说明

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