X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libswscale%2Fx86%2Fyuv2rgb.c;h=47f45bd7c2c24732baec66bd349859f8d5452091;hb=f34521266ec5816eefa4c10db6098cb91e03c695;hp=5e2f77c20f018206ae24924d4ee4e531c81f16a3;hpb=94346ab593f3fc0822f11d3e3f378f9944ad2d40;p=ffmpeg diff --git a/libswscale/x86/yuv2rgb.c b/libswscale/x86/yuv2rgb.c index 5e2f77c20f0..47f45bd7c2c 100644 --- a/libswscale/x86/yuv2rgb.c +++ b/libswscale/x86/yuv2rgb.c @@ -37,45 +37,70 @@ #include "libavutil/x86/cpu.h" #include "libavutil/cpu.h" -#if HAVE_INLINE_ASM +#if HAVE_X86ASM #define DITHER1XBPP // only for MMX -/* hope these constant values are cache line aligned */ -DECLARE_ASM_CONST(8, uint64_t, mmx_00ffw) = 0x00ff00ff00ff00ffULL; -DECLARE_ASM_CONST(8, uint64_t, mmx_redmask) = 0xf8f8f8f8f8f8f8f8ULL; -DECLARE_ASM_CONST(8, uint64_t, mmx_grnmask) = 0xfcfcfcfcfcfcfcfcULL; -DECLARE_ASM_CONST(8, uint64_t, pb_e0) = 0xe0e0e0e0e0e0e0e0ULL; -DECLARE_ASM_CONST(8, uint64_t, pb_03) = 0x0303030303030303ULL; -DECLARE_ASM_CONST(8, uint64_t, pb_07) = 0x0707070707070707ULL; - //MMX versions -#if HAVE_MMX_INLINE && HAVE_6REGS +#if HAVE_MMX #undef RENAME #undef COMPILE_TEMPLATE_MMXEXT #define COMPILE_TEMPLATE_MMXEXT 0 #define RENAME(a) a ## _mmx #include "yuv2rgb_template.c" -#endif /* HAVE_MMX_INLINE && HAVE_6REGS */ +#endif /* HAVE_MMX */ // MMXEXT versions -#if HAVE_MMXEXT_INLINE && HAVE_6REGS #undef RENAME #undef COMPILE_TEMPLATE_MMXEXT #define COMPILE_TEMPLATE_MMXEXT 1 #define RENAME(a) a ## _mmxext #include "yuv2rgb_template.c" -#endif /* HAVE_MMXEXT_INLINE && HAVE_6REGS */ -#endif /* HAVE_INLINE_ASM */ +//SSSE3 versions +#undef RENAME +#undef COMPILE_TEMPLATE_MMXEXT +#define COMPILE_TEMPLATE_MMXEXT 0 +#define RENAME(a) a ## _ssse3 +#include "yuv2rgb_template.c" + +#endif /* HAVE_X86ASM */ av_cold SwsFunc ff_yuv2rgb_init_x86(SwsContext *c) { -#if HAVE_MMX_INLINE && HAVE_6REGS +#if HAVE_X86ASM int cpu_flags = av_get_cpu_flags(); -#if HAVE_MMXEXT_INLINE - if (INLINE_MMXEXT(cpu_flags)) { + if (EXTERNAL_SSSE3(cpu_flags)) { + switch (c->dstFormat) { + case AV_PIX_FMT_RGB32: + if (c->srcFormat == AV_PIX_FMT_YUVA420P) { +#if CONFIG_SWSCALE_ALPHA + return yuva420_rgb32_ssse3; +#endif + break; + } else + return yuv420_rgb32_ssse3; + case AV_PIX_FMT_BGR32: + if (c->srcFormat == AV_PIX_FMT_YUVA420P) { +#if CONFIG_SWSCALE_ALPHA + return yuva420_bgr32_ssse3; +#endif + break; + } else + return yuv420_bgr32_ssse3; + case AV_PIX_FMT_RGB24: + return yuv420_rgb24_ssse3; + case AV_PIX_FMT_BGR24: + return yuv420_bgr24_ssse3; + case AV_PIX_FMT_RGB565: + return yuv420_rgb16_ssse3; + case AV_PIX_FMT_RGB555: + return yuv420_rgb15_ssse3; + } + } + + if (EXTERNAL_MMXEXT(cpu_flags)) { switch (c->dstFormat) { case AV_PIX_FMT_RGB24: return yuv420_rgb24_mmxext; @@ -83,13 +108,12 @@ av_cold SwsFunc ff_yuv2rgb_init_x86(SwsContext *c) return yuv420_bgr24_mmxext; } } -#endif - if (INLINE_MMX(cpu_flags)) { + if (EXTERNAL_MMX(cpu_flags)) { switch (c->dstFormat) { case AV_PIX_FMT_RGB32: if (c->srcFormat == AV_PIX_FMT_YUVA420P) { -#if HAVE_7REGS && CONFIG_SWSCALE_ALPHA +#if CONFIG_SWSCALE_ALPHA return yuva420_rgb32_mmx; #endif break; @@ -97,7 +121,7 @@ av_cold SwsFunc ff_yuv2rgb_init_x86(SwsContext *c) return yuv420_rgb32_mmx; case AV_PIX_FMT_BGR32: if (c->srcFormat == AV_PIX_FMT_YUVA420P) { -#if HAVE_7REGS && CONFIG_SWSCALE_ALPHA +#if CONFIG_SWSCALE_ALPHA return yuva420_bgr32_mmx; #endif break; @@ -113,7 +137,7 @@ av_cold SwsFunc ff_yuv2rgb_init_x86(SwsContext *c) return yuv420_rgb15_mmx; } } -#endif /* HAVE_MMX_INLINE && HAVE_6REGS */ +#endif /* HAVE_X86ASM */ return NULL; }