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 (c->srcFormat != PIX_FMT_YUV420P &&
00072 c->srcFormat != PIX_FMT_YUVA420P)
00073 return NULL;
00074
00075 #if HAVE_MMX2
00076 if (cpu_flags & AV_CPU_FLAG_MMX2) {
00077 switch (c->dstFormat) {
00078 case PIX_FMT_RGB24: return yuv420_rgb24_MMX2;
00079 case PIX_FMT_BGR24: return yuv420_bgr24_MMX2;
00080 }
00081 }
00082 #endif
00083
00084 if (cpu_flags & AV_CPU_FLAG_MMX) {
00085 switch (c->dstFormat) {
00086 case PIX_FMT_RGB32:
00087 if (c->srcFormat == PIX_FMT_YUVA420P) {
00088 #if HAVE_7REGS && CONFIG_SWSCALE_ALPHA
00089 return yuva420_rgb32_MMX;
00090 #endif
00091 break;
00092 } else return yuv420_rgb32_MMX;
00093 case PIX_FMT_BGR32:
00094 if (c->srcFormat == PIX_FMT_YUVA420P) {
00095 #if HAVE_7REGS && CONFIG_SWSCALE_ALPHA
00096 return yuva420_bgr32_MMX;
00097 #endif
00098 break;
00099 } else return yuv420_bgr32_MMX;
00100 case PIX_FMT_RGB24: return yuv420_rgb24_MMX;
00101 case PIX_FMT_BGR24: return yuv420_bgr24_MMX;
00102 case PIX_FMT_RGB565: return yuv420_rgb16_MMX;
00103 case PIX_FMT_RGB555: return yuv420_rgb15_MMX;
00104 }
00105 }
00106
00107 return NULL;
00108 }