Ticket #4693: bgr32.patch

File bgr32.patch, 2.2 KB (added by kcoyle, 11 years ago)

Patch to add accelerated YUV->BGR for x86

  • libswscale/x86/swscale_template.c

    diff -rupN ffmpeg-2.7.1/libswscale/x86/swscale_template.c ffmpeg-2.7.1-patched/libswscale/x86/swscale_template.c
    old new static void RENAME(yuv2rgb32_X)(SwsConte  
    399399    }
    400400}
    401401
     402static void RENAME(yuv2bgr32_X)(SwsContext *c, const int16_t *lumFilter,
     403                                const int16_t **lumSrc, int lumFilterSize,
     404                                const int16_t *chrFilter, const int16_t **chrUSrc,
     405                                const int16_t **chrVSrc,
     406                                int chrFilterSize, const int16_t **alpSrc,
     407                                uint8_t *dest, int dstW, int dstY)
     408{
     409    x86_reg dummy=0;
     410    x86_reg dstW_reg = dstW;
     411    x86_reg uv_off = c->uv_offx2;
     412
     413    if (CONFIG_SWSCALE_ALPHA && c->alpPixBuf) {
     414        YSCALEYUV2PACKEDX
     415        YSCALEYUV2RGBX
     416        YSCALEYUV2PACKEDX_YA(ALP_MMX_FILTER_OFFSET, %%mm0, %%mm3, %%mm6, %%mm1, %%mm7)
     417        "psraw                        $3, %%mm1         \n\t"
     418        "psraw                        $3, %%mm7         \n\t"
     419        "packuswb                  %%mm7, %%mm1         \n\t"
     420        WRITEBGR32(%4, "%5", %%REGa, %%mm5, %%mm4, %%mm2, %%mm7, %%mm0, %%mm1, %%mm3, %%mm6)
     421        YSCALEYUV2PACKEDX_END
     422    } else {
     423        YSCALEYUV2PACKEDX
     424        YSCALEYUV2RGBX
     425        "pcmpeqd %%mm7, %%mm7 \n\t"
     426        WRITEBGR32(%4, "%5", %%REGa, %%mm5, %%mm4, %%mm2, %%mm7, %%mm0, %%mm1, %%mm3, %%mm6)
     427        YSCALEYUV2PACKEDX_END
     428    }
     429}
     430
    402431#define REAL_WRITERGB16(dst, dstw, index) \
    403432    "pand "MANGLE(bF8)", %%mm2  \n\t" /* B */\
    404433    "pand "MANGLE(bFC)", %%mm4  \n\t" /* G */\
    static av_cold void RENAME(sws_init_swsc  
    14911520                if (!(c->flags & SWS_FULL_CHR_H_INT)) {
    14921521                    switch (c->dstFormat) {
    14931522                    case AV_PIX_FMT_RGB32:   c->yuv2packedX = RENAME(yuv2rgb32_X);   break;
     1523                    case AV_PIX_FMT_BGR32:   c->yuv2packedX = RENAME(yuv2bgr32_X);   break;
    14941524#if HAVE_6REGS
    14951525                    case AV_PIX_FMT_BGR24:   c->yuv2packedX = RENAME(yuv2bgr24_X);   break;
    14961526#endif