Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027 #include <stdio.h>
00028 #include <stdlib.h>
00029 #include <inttypes.h>
00030 #include <assert.h>
00031
00032 #include "config.h"
00033 #include "libswscale/rgb2rgb.h"
00034 #include "libswscale/swscale.h"
00035 #include "libswscale/swscale_internal.h"
00036 #include "libavutil/x86_cpu.h"
00037 #include "libavutil/cpu.h"
00038
00039 #define DITHER1XBPP // only for MMX
00040
00041
00042 DECLARE_ASM_CONST(8, uint64_t, mmx_00ffw) = 0x00ff00ff00ff00ffULL;
00043 DECLARE_ASM_CONST(8, uint64_t, mmx_redmask) = 0xf8f8f8f8f8f8f8f8ULL;
00044 DECLARE_ASM_CONST(8, uint64_t, mmx_grnmask) = 0xfcfcfcfcfcfcfcfcULL;
00045 DECLARE_ASM_CONST(8, uint64_t, pb_e0) = 0xe0e0e0e0e0e0e0e0ULL;
00046 DECLARE_ASM_CONST(8, uint64_t, pb_03) = 0x0303030303030303ULL;
00047 DECLARE_ASM_CONST(8, uint64_t, pb_07) = 0x0707070707070707ULL;
00048
00049
00050 #if HAVE_MMX
00051 #undef RENAME
00052 #undef COMPILE_TEMPLATE_MMX2
00053 #define COMPILE_TEMPLATE_MMX2 0
00054 #define RENAME(a) a ## _MMX
00055 #include "yuv2rgb_template.c"
00056 #endif
00057
00058
00059 #if HAVE_MMX2
00060 #undef RENAME
00061 #undef COMPILE_TEMPLATE_MMX2
00062 #define COMPILE_TEMPLATE_MMX2 1
00063 #define RENAME(a) a ## _MMX2
00064 #include "yuv2rgb_template.c"
00065 #endif
00066
00067 SwsFunc ff_yuv2rgb_init_mmx(SwsContext *c)
00068 {
00069 int cpu_flags = av_get_cpu_flags();
00070
00071 #if HAVE_MMX2
00072 if (cpu_flags & AV_CPU_FLAG_MMX2) {
00073 switch (c->dstFormat) {
00074 case PIX_FMT_RGB24: return yuv420_rgb24_MMX2;
00075 case PIX_FMT_BGR24: return yuv420_bgr24_MMX2;
00076 }
00077 }
00078 #endif
00079
00080 if (cpu_flags & AV_CPU_FLAG_MMX) {
00081 switch (c->dstFormat) {
00082 case PIX_FMT_RGB32:
00083 if (c->srcFormat == PIX_FMT_YUVA420P) {
00084 #if HAVE_7REGS && CONFIG_SWSCALE_ALPHA
00085 return yuva420_rgb32_MMX;
00086 #endif
00087 break;
00088 } else return yuv420_rgb32_MMX;
00089 case PIX_FMT_BGR32:
00090 if (c->srcFormat == PIX_FMT_YUVA420P) {
00091 #if HAVE_7REGS && CONFIG_SWSCALE_ALPHA
00092 return yuva420_bgr32_MMX;
00093 #endif
00094 break;
00095 } else return yuv420_bgr32_MMX;
00096 case PIX_FMT_RGB24: return yuv420_rgb24_MMX;
00097 case PIX_FMT_BGR24: return yuv420_bgr24_MMX;
00098 case PIX_FMT_RGB565: return yuv420_rgb16_MMX;
00099 case PIX_FMT_RGB555: return yuv420_rgb15_MMX;
00100 }
00101 }
00102
00103 return NULL;
00104 }