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

📄 swscale_template.c

📁 mediastreamer2是开源的网络传输媒体流的库
💻 C
📖 第 1 页 / 共 5 页
字号:
    "pshufw $0xFF, %%mm2, %%mm1 \n\t" /* B7 B6 B7 B6  B7 B6 B6 B7 */\    "pshufw $0xFA, %%mm4, %%mm3 \n\t" /* 00 G7 00 G7  G6 G5 G6 G5 */\    "pshufw $0xFA, %%mm5, %%mm6 \n\t" /* R7 R6 R7 R6  R5 R4 R5 R4 */\\    "pand   %%mm7, %%mm1        \n\t" /*       B7        B6       */\    "pand   %%mm0, %%mm3        \n\t" /*    G7        G6       G5 */\    "pand "MANGLE(ff_M24B)", %%mm6 \n\t" /* R7       R6        R5    */\\    "por    %%mm1, %%mm3        \n\t"\    "por    %%mm3, %%mm6        \n\t"\    MOVNTQ(%%mm6, 16(dst))\\    "add      $24, "#dst"       \n\t"\\    "add       $8, "#index"     \n\t"\    "cmp  "#dstw", "#index"     \n\t"\    " jb       1b               \n\t"#ifdef HAVE_MMX2#undef WRITEBGR24#define WRITEBGR24(dst, dstw, index)  WRITEBGR24MMX2(dst, dstw, index)#else#undef WRITEBGR24#define WRITEBGR24(dst, dstw, index)  WRITEBGR24MMX(dst, dstw, index)#endif#define REAL_WRITEYUY2(dst, dstw, index) \    "packuswb  %%mm3, %%mm3     \n\t"\    "packuswb  %%mm4, %%mm4     \n\t"\    "packuswb  %%mm7, %%mm1     \n\t"\    "punpcklbw %%mm4, %%mm3     \n\t"\    "movq      %%mm1, %%mm7     \n\t"\    "punpcklbw %%mm3, %%mm1     \n\t"\    "punpckhbw %%mm3, %%mm7     \n\t"\\    MOVNTQ(%%mm1, (dst, index, 2))\    MOVNTQ(%%mm7, 8(dst, index, 2))\\    "add          $8, "#index"  \n\t"\    "cmp     "#dstw", "#index"  \n\t"\    " jb          1b            \n\t"#define WRITEYUY2(dst, dstw, index)  REAL_WRITEYUY2(dst, dstw, index)static inline void RENAME(yuv2yuvX)(SwsContext *c, int16_t *lumFilter, int16_t **lumSrc, int lumFilterSize,                                    int16_t *chrFilter, int16_t **chrSrc, int chrFilterSize,                                    uint8_t *dest, uint8_t *uDest, uint8_t *vDest, long dstW, long chrDstW){#ifdef HAVE_MMX    if (c->flags & SWS_ACCURATE_RND){        if (uDest){            YSCALEYUV2YV12X_ACCURATE(   0, CHR_MMX_FILTER_OFFSET, uDest, chrDstW)            YSCALEYUV2YV12X_ACCURATE(4096, CHR_MMX_FILTER_OFFSET, vDest, chrDstW)        }        YSCALEYUV2YV12X_ACCURATE(0, LUM_MMX_FILTER_OFFSET, dest, dstW)    }else{        if (uDest){            YSCALEYUV2YV12X(   0, CHR_MMX_FILTER_OFFSET, uDest, chrDstW)            YSCALEYUV2YV12X(4096, CHR_MMX_FILTER_OFFSET, vDest, chrDstW)        }        YSCALEYUV2YV12X(0, LUM_MMX_FILTER_OFFSET, dest, dstW)    }#else#ifdef HAVE_ALTIVECyuv2yuvX_altivec_real(lumFilter, lumSrc, lumFilterSize,                      chrFilter, chrSrc, chrFilterSize,                      dest, uDest, vDest, dstW, chrDstW);#else //HAVE_ALTIVECyuv2yuvXinC(lumFilter, lumSrc, lumFilterSize,            chrFilter, chrSrc, chrFilterSize,            dest, uDest, vDest, dstW, chrDstW);#endif //!HAVE_ALTIVEC#endif /* HAVE_MMX */}static inline void RENAME(yuv2nv12X)(SwsContext *c, int16_t *lumFilter, int16_t **lumSrc, int lumFilterSize,                                     int16_t *chrFilter, int16_t **chrSrc, int chrFilterSize,                                     uint8_t *dest, uint8_t *uDest, int dstW, int chrDstW, int dstFormat){yuv2nv12XinC(lumFilter, lumSrc, lumFilterSize,             chrFilter, chrSrc, chrFilterSize,             dest, uDest, dstW, chrDstW, dstFormat);}static inline void RENAME(yuv2yuv1)(int16_t *lumSrc, int16_t *chrSrc,                                    uint8_t *dest, uint8_t *uDest, uint8_t *vDest, long dstW, long chrDstW){#ifdef HAVE_MMX    if (uDest)    {        asm volatile(            YSCALEYUV2YV121            :: "r" (chrSrc + chrDstW), "r" (uDest + chrDstW),            "g" (-chrDstW)            : "%"REG_a        );        asm volatile(            YSCALEYUV2YV121            :: "r" (chrSrc + 2048 + chrDstW), "r" (vDest + chrDstW),            "g" (-chrDstW)            : "%"REG_a        );    }    asm volatile(        YSCALEYUV2YV121        :: "r" (lumSrc + dstW), "r" (dest + dstW),        "g" (-dstW)        : "%"REG_a    );#else    int i;    for (i=0; i<dstW; i++)    {        int val= lumSrc[i]>>7;        if (val&256){            if (val<0) val=0;            else       val=255;        }        dest[i]= val;    }    if (uDest)        for (i=0; i<chrDstW; i++)        {            int u=chrSrc[i]>>7;            int v=chrSrc[i + 2048]>>7;            if ((u|v)&256){                if (u<0)        u=0;                else if (u>255) u=255;                if (v<0)        v=0;                else if (v>255) v=255;            }            uDest[i]= u;            vDest[i]= v;        }#endif}/** * vertical scale YV12 to RGB */static inline void RENAME(yuv2packedX)(SwsContext *c, int16_t *lumFilter, int16_t **lumSrc, int lumFilterSize,                                       int16_t *chrFilter, int16_t **chrSrc, int chrFilterSize,                                       uint8_t *dest, long dstW, long dstY){#ifdef HAVE_MMX    long dummy=0;    if (c->flags & SWS_ACCURATE_RND){        switch(c->dstFormat){        case PIX_FMT_RGB32:            YSCALEYUV2PACKEDX_ACCURATE            YSCALEYUV2RGBX            WRITEBGR32(%4, %5, %%REGa)            YSCALEYUV2PACKEDX_END            return;        case PIX_FMT_BGR24:            YSCALEYUV2PACKEDX_ACCURATE            YSCALEYUV2RGBX            "lea (%%"REG_a", %%"REG_a", 2), %%"REG_c"\n\t" //FIXME optimize            "add %4, %%"REG_c"                        \n\t"            WRITEBGR24(%%REGc, %5, %%REGa)            :: "r" (&c->redDither),               "m" (dummy), "m" (dummy), "m" (dummy),               "r" (dest), "m" (dstW)            : "%"REG_a, "%"REG_c, "%"REG_d, "%"REG_S            );            return;        case PIX_FMT_BGR555:            YSCALEYUV2PACKEDX_ACCURATE            YSCALEYUV2RGBX            /* mm2=B, %%mm4=G, %%mm5=R, %%mm7=0 */#ifdef DITHER1XBPP            "paddusb "MANGLE(b5Dither)", %%mm2\n\t"            "paddusb "MANGLE(g5Dither)", %%mm4\n\t"            "paddusb "MANGLE(r5Dither)", %%mm5\n\t"#endif            WRITEBGR15(%4, %5, %%REGa)            YSCALEYUV2PACKEDX_END            return;        case PIX_FMT_BGR565:            YSCALEYUV2PACKEDX_ACCURATE            YSCALEYUV2RGBX            /* mm2=B, %%mm4=G, %%mm5=R, %%mm7=0 */#ifdef DITHER1XBPP            "paddusb "MANGLE(b5Dither)", %%mm2\n\t"            "paddusb "MANGLE(g6Dither)", %%mm4\n\t"            "paddusb "MANGLE(r5Dither)", %%mm5\n\t"#endif            WRITEBGR16(%4, %5, %%REGa)            YSCALEYUV2PACKEDX_END            return;        case PIX_FMT_YUYV422:            YSCALEYUV2PACKEDX_ACCURATE            /* mm2=B, %%mm4=G, %%mm5=R, %%mm7=0 */            "psraw $3, %%mm3    \n\t"            "psraw $3, %%mm4    \n\t"            "psraw $3, %%mm1    \n\t"            "psraw $3, %%mm7    \n\t"            WRITEYUY2(%4, %5, %%REGa)            YSCALEYUV2PACKEDX_END            return;    }    }else{        switch(c->dstFormat)        {        case PIX_FMT_RGB32:            YSCALEYUV2PACKEDX            YSCALEYUV2RGBX            WRITEBGR32(%4, %5, %%REGa)            YSCALEYUV2PACKEDX_END            return;        case PIX_FMT_BGR24:            YSCALEYUV2PACKEDX            YSCALEYUV2RGBX            "lea (%%"REG_a", %%"REG_a", 2), %%"REG_c"   \n\t" //FIXME optimize            "add                        %4, %%"REG_c"   \n\t"            WRITEBGR24(%%REGc, %5, %%REGa)            :: "r" (&c->redDither),               "m" (dummy), "m" (dummy), "m" (dummy),               "r" (dest),  "m" (dstW)            : "%"REG_a, "%"REG_c, "%"REG_d, "%"REG_S            );            return;        case PIX_FMT_BGR555:            YSCALEYUV2PACKEDX            YSCALEYUV2RGBX            /* mm2=B, %%mm4=G, %%mm5=R, %%mm7=0 */#ifdef DITHER1XBPP            "paddusb "MANGLE(b5Dither)", %%mm2  \n\t"            "paddusb "MANGLE(g5Dither)", %%mm4  \n\t"            "paddusb "MANGLE(r5Dither)", %%mm5  \n\t"#endif            WRITEBGR15(%4, %5, %%REGa)            YSCALEYUV2PACKEDX_END            return;        case PIX_FMT_BGR565:            YSCALEYUV2PACKEDX            YSCALEYUV2RGBX            /* mm2=B, %%mm4=G, %%mm5=R, %%mm7=0 */#ifdef DITHER1XBPP            "paddusb "MANGLE(b5Dither)", %%mm2  \n\t"            "paddusb "MANGLE(g6Dither)", %%mm4  \n\t"            "paddusb "MANGLE(r5Dither)", %%mm5  \n\t"#endif            WRITEBGR16(%4, %5, %%REGa)            YSCALEYUV2PACKEDX_END            return;        case PIX_FMT_YUYV422:            YSCALEYUV2PACKEDX            /* mm2=B, %%mm4=G, %%mm5=R, %%mm7=0 */            "psraw $3, %%mm3    \n\t"            "psraw $3, %%mm4    \n\t"            "psraw $3, %%mm1    \n\t"            "psraw $3, %%mm7    \n\t"            WRITEYUY2(%4, %5, %%REGa)            YSCALEYUV2PACKEDX_END            return;        }    }#endif /* HAVE_MMX */#ifdef HAVE_ALTIVEC    /* The following list of supported dstFormat values should       match what's found in the body of altivec_yuv2packedX() */    if (c->dstFormat==PIX_FMT_ABGR  || c->dstFormat==PIX_FMT_BGRA  ||        c->dstFormat==PIX_FMT_BGR24 || c->dstFormat==PIX_FMT_RGB24 ||        c->dstFormat==PIX_FMT_RGBA  || c->dstFormat==PIX_FMT_ARGB)            altivec_yuv2packedX (c, lumFilter, lumSrc, lumFilterSize,                                 chrFilter, chrSrc, chrFilterSize,                                 dest, dstW, dstY);    else#endif        yuv2packedXinC(c, lumFilter, lumSrc, lumFilterSize,                       chrFilter, chrSrc, chrFilterSize,                       dest, dstW, dstY);}

⌨️ 快捷键说明

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