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

📄 osd.c

📁 君正早期ucos系统(只有早期的才不没有打包成库),MPLAYER,文件系统,图片解码,浏览,电子书,录音,想学ucos,识货的人就下吧 russblock fmradio explore set
💻 C
字号:
// Generic alpha renderers for all YUV modes and RGB depths.// These are "reference implementations", should be optimized later (MMX, etc)// Templating Code from Michael Niedermayer (michaelni@gmx.at) is under GPL//#define FAST_OSD//#define FAST_OSD_TABLE#include "config.h"#include "osd.h"#include "mp_msg.h"#include <inttypes.h>#include "cpudetect.h"#include "mangle.h"#ifdef ARCH_X86#define CAN_COMPILE_X86_ASM#endif#ifdef CAN_COMPILE_X86_ASMstatic const uint64_t bFF attribute_used __attribute__((aligned(8))) = 0xFFFFFFFFFFFFFFFFULL;static const unsigned long long mask24lh  __attribute__((aligned(8))) = 0xFFFF000000000000ULL;static const unsigned long long mask24hl  __attribute__((aligned(8))) = 0x0000FFFFFFFFFFFFULL;#endif//Note: we have C, X86-nommx, MMX, MMX2, 3DNOW version therse no 3DNOW+MMX2 one//Plain C versions#if !defined (HAVE_MMX) || defined (RUNTIME_CPUDETECT)#define COMPILE_C#endif#ifdef CAN_COMPILE_X86_ASM#if (defined (HAVE_MMX) && !defined (HAVE_3DNOW) && !defined (HAVE_MMX2)) || defined (RUNTIME_CPUDETECT)#define COMPILE_MMX#endif#if defined (HAVE_MMX2) || defined (RUNTIME_CPUDETECT)#define COMPILE_MMX2#endif#if (defined (HAVE_3DNOW) && !defined (HAVE_MMX2)) || defined (RUNTIME_CPUDETECT)#define COMPILE_3DNOW#endif#endif //CAN_COMPILE_X86_ASM#undef HAVE_MMX#undef HAVE_MMX2#undef HAVE_3DNOW#ifndef CAN_COMPILE_X86_ASM#ifdef COMPILE_C#undef HAVE_MMX#undef HAVE_MMX2#undef HAVE_3DNOW#define RENAME(a) a ## _C#include "osd_template.c"#endif#else//X86 noMMX versions#ifdef COMPILE_C#undef RENAME#undef HAVE_MMX#undef HAVE_MMX2#undef HAVE_3DNOW#define RENAME(a) a ## _X86#include "osd_template.c"#endif//MMX versions#ifdef COMPILE_MMX#undef RENAME#define HAVE_MMX#undef HAVE_MMX2#undef HAVE_3DNOW#define RENAME(a) a ## _MMX#include "osd_template.c"#endif//MMX2 versions#ifdef COMPILE_MMX2#undef RENAME#define HAVE_MMX#define HAVE_MMX2#undef HAVE_3DNOW#define RENAME(a) a ## _MMX2#include "osd_template.c"#endif//3DNOW versions#ifdef COMPILE_3DNOW#undef RENAME#define HAVE_MMX#undef HAVE_MMX2#define HAVE_3DNOW#define RENAME(a) a ## _3DNow#include "osd_template.c"#endif#endif //CAN_COMPILE_X86_ASMvoid vo_draw_alpha_yv12(int w,int h, unsigned char* src, unsigned char *srca, int srcstride, unsigned char* dstbase,int dststride){#ifdef RUNTIME_CPUDETECT#ifdef CAN_COMPILE_X86_ASM	// ordered by speed / fastest first	if(gCpuCaps.hasMMX2)		vo_draw_alpha_yv12_MMX2(w, h, src, srca, srcstride, dstbase, dststride);	else if(gCpuCaps.has3DNow)		vo_draw_alpha_yv12_3DNow(w, h, src, srca, srcstride, dstbase, dststride);	else if(gCpuCaps.hasMMX)		vo_draw_alpha_yv12_MMX(w, h, src, srca, srcstride, dstbase, dststride);	else		vo_draw_alpha_yv12_X86(w, h, src, srca, srcstride, dstbase, dststride);#else		vo_draw_alpha_yv12_C(w, h, src, srca, srcstride, dstbase, dststride);#endif#else //RUNTIME_CPUDETECT#ifdef HAVE_MMX2		vo_draw_alpha_yv12_MMX2(w, h, src, srca, srcstride, dstbase, dststride);#elif defined (HAVE_3DNOW)		vo_draw_alpha_yv12_3DNow(w, h, src, srca, srcstride, dstbase, dststride);#elif defined (HAVE_MMX)		vo_draw_alpha_yv12_MMX(w, h, src, srca, srcstride, dstbase, dststride);#elif defined(ARCH_X86)		vo_draw_alpha_yv12_X86(w, h, src, srca, srcstride, dstbase, dststride);#else		vo_draw_alpha_yv12_C(w, h, src, srca, srcstride, dstbase, dststride);#endif#endif //!RUNTIME_CPUDETECT}void vo_draw_alpha_yuy2(int w,int h, unsigned char* src, unsigned char *srca, int srcstride, unsigned char* dstbase,int dststride){#ifdef RUNTIME_CPUDETECT#ifdef CAN_COMPILE_X86_ASM	// ordered by speed / fastest first	if(gCpuCaps.hasMMX2)		vo_draw_alpha_yuy2_MMX2(w, h, src, srca, srcstride, dstbase, dststride);	else if(gCpuCaps.has3DNow)		vo_draw_alpha_yuy2_3DNow(w, h, src, srca, srcstride, dstbase, dststride);	else if(gCpuCaps.hasMMX)		vo_draw_alpha_yuy2_MMX(w, h, src, srca, srcstride, dstbase, dststride);	else		vo_draw_alpha_yuy2_X86(w, h, src, srca, srcstride, dstbase, dststride);#else		vo_draw_alpha_yuy2_C(w, h, src, srca, srcstride, dstbase, dststride);#endif#else //RUNTIME_CPUDETECT#ifdef HAVE_MMX2		vo_draw_alpha_yuy2_MMX2(w, h, src, srca, srcstride, dstbase, dststride);#elif defined (HAVE_3DNOW)		vo_draw_alpha_yuy2_3DNow(w, h, src, srca, srcstride, dstbase, dststride);#elif defined (HAVE_MMX)		vo_draw_alpha_yuy2_MMX(w, h, src, srca, srcstride, dstbase, dststride);#elif defined(ARCH_X86)		vo_draw_alpha_yuy2_X86(w, h, src, srca, srcstride, dstbase, dststride);#else		vo_draw_alpha_yuy2_C(w, h, src, srca, srcstride, dstbase, dststride);#endif#endif //!RUNTIME_CPUDETECT}void vo_draw_alpha_uyvy(int w,int h, unsigned char* src, unsigned char *srca, int srcstride, unsigned char* dstbase,int dststride){#ifdef RUNTIME_CPUDETECT#ifdef CAN_COMPILE_X86_ASM	// ordered by speed / fastest first	if(gCpuCaps.hasMMX2)		vo_draw_alpha_uyvy_MMX2(w, h, src, srca, srcstride, dstbase, dststride);	else if(gCpuCaps.has3DNow)		vo_draw_alpha_uyvy_3DNow(w, h, src, srca, srcstride, dstbase, dststride);	else if(gCpuCaps.hasMMX)		vo_draw_alpha_uyvy_MMX(w, h, src, srca, srcstride, dstbase, dststride);	else		vo_draw_alpha_uyvy_X86(w, h, src, srca, srcstride, dstbase, dststride);#else		vo_draw_alpha_uyvy_C(w, h, src, srca, srcstride, dstbase, dststride);#endif#else //RUNTIME_CPUDETECT#ifdef HAVE_MMX2		vo_draw_alpha_uyvy_MMX2(w, h, src, srca, srcstride, dstbase, dststride);#elif defined (HAVE_3DNOW)		vo_draw_alpha_uyvy_3DNow(w, h, src, srca, srcstride, dstbase, dststride);#elif defined (HAVE_MMX)		vo_draw_alpha_uyvy_MMX(w, h, src, srca, srcstride, dstbase, dststride);#elif defined(ARCH_X86)		vo_draw_alpha_uyvy_X86(w, h, src, srca, srcstride, dstbase, dststride);#else		vo_draw_alpha_uyvy_C(w, h, src, srca, srcstride, dstbase, dststride);#endif#endif //!RUNTIME_CPUDETECT}void vo_draw_alpha_rgb24(int w,int h, unsigned char* src, unsigned char *srca, int srcstride, unsigned char* dstbase,int dststride){#ifdef RUNTIME_CPUDETECT#ifdef CAN_COMPILE_X86_ASM	// ordered by speed / fastest first	if(gCpuCaps.hasMMX2)		vo_draw_alpha_rgb24_MMX2(w, h, src, srca, srcstride, dstbase, dststride);	else if(gCpuCaps.has3DNow)		vo_draw_alpha_rgb24_3DNow(w, h, src, srca, srcstride, dstbase, dststride);	else if(gCpuCaps.hasMMX)		vo_draw_alpha_rgb24_MMX(w, h, src, srca, srcstride, dstbase, dststride);	else		vo_draw_alpha_rgb24_X86(w, h, src, srca, srcstride, dstbase, dststride);#else		vo_draw_alpha_rgb24_C(w, h, src, srca, srcstride, dstbase, dststride);#endif#else //RUNTIME_CPUDETECT#ifdef HAVE_MMX2		vo_draw_alpha_rgb24_MMX2(w, h, src, srca, srcstride, dstbase, dststride);#elif defined (HAVE_3DNOW)		vo_draw_alpha_rgb24_3DNow(w, h, src, srca, srcstride, dstbase, dststride);#elif defined (HAVE_MMX)		vo_draw_alpha_rgb24_MMX(w, h, src, srca, srcstride, dstbase, dststride);#elif defined(ARCH_X86)		vo_draw_alpha_rgb24_X86(w, h, src, srca, srcstride, dstbase, dststride);#else		vo_draw_alpha_rgb24_C(w, h, src, srca, srcstride, dstbase, dststride);#endif#endif //!RUNTIME_CPUDETECT}void vo_draw_alpha_rgb32(int w,int h, unsigned char* src, unsigned char *srca, int srcstride, unsigned char* dstbase,int dststride){#ifdef RUNTIME_CPUDETECT#ifdef CAN_COMPILE_X86_ASM	// ordered by speed / fastest first	if(gCpuCaps.hasMMX2)		vo_draw_alpha_rgb32_MMX2(w, h, src, srca, srcstride, dstbase, dststride);	else if(gCpuCaps.has3DNow)		vo_draw_alpha_rgb32_3DNow(w, h, src, srca, srcstride, dstbase, dststride);	else if(gCpuCaps.hasMMX)		vo_draw_alpha_rgb32_MMX(w, h, src, srca, srcstride, dstbase, dststride);	else		vo_draw_alpha_rgb32_X86(w, h, src, srca, srcstride, dstbase, dststride);#else		vo_draw_alpha_rgb32_C(w, h, src, srca, srcstride, dstbase, dststride);#endif#else //RUNTIME_CPUDETECT#ifdef HAVE_MMX2		vo_draw_alpha_rgb32_MMX2(w, h, src, srca, srcstride, dstbase, dststride);#elif defined (HAVE_3DNOW)		vo_draw_alpha_rgb32_3DNow(w, h, src, srca, srcstride, dstbase, dststride);#elif defined (HAVE_MMX)		vo_draw_alpha_rgb32_MMX(w, h, src, srca, srcstride, dstbase, dststride);#elif defined(ARCH_X86)		vo_draw_alpha_rgb32_X86(w, h, src, srca, srcstride, dstbase, dststride);#else		vo_draw_alpha_rgb32_C(w, h, src, srca, srcstride, dstbase, dststride);#endif#endif //!RUNTIME_CPUDETECT}#ifdef FAST_OSD_TABLEstatic unsigned short fast_osd_15bpp_table[256];static unsigned short fast_osd_16bpp_table[256];#endifvoid vo_draw_alpha_init(void){#ifdef FAST_OSD_TABLE    int i;    for(i=0;i<256;i++){        fast_osd_15bpp_table[i]=((i>>3)<<10)|((i>>3)<<5)|(i>>3);        fast_osd_16bpp_table[i]=((i>>3)<<11)|((i>>2)<<5)|(i>>3);    }#endif//FIXME the optimized stuff is a lie for 15/16bpp as they aren't optimized yet	if( mp_msg_test(MSGT_OSD,MSGL_V) )	{#ifdef RUNTIME_CPUDETECT#ifdef CAN_COMPILE_X86_ASM		// ordered per speed fasterst first		if(gCpuCaps.hasMMX2)			mp_msg(MSGT_OSD,MSGL_INFO,"Using MMX (with tiny bit MMX2) Optimized OnScreenDisplay\n");		else if(gCpuCaps.has3DNow)			mp_msg(MSGT_OSD,MSGL_INFO,"Using MMX (with tiny bit 3DNow) Optimized OnScreenDisplay\n");		else if(gCpuCaps.hasMMX)			mp_msg(MSGT_OSD,MSGL_INFO,"Using MMX Optimized OnScreenDisplay\n");		else			mp_msg(MSGT_OSD,MSGL_INFO,"Using X86 Optimized OnScreenDisplay\n");#else			mp_msg(MSGT_OSD,MSGL_INFO,"Using Unoptimized OnScreenDisplay\n");#endif#else //RUNTIME_CPUDETECT#ifdef HAVE_MMX2			mp_msg(MSGT_OSD,MSGL_INFO,"Using MMX (with tiny bit MMX2) Optimized OnScreenDisplay\n");#elif defined (HAVE_3DNOW)			mp_msg(MSGT_OSD,MSGL_INFO,"Using MMX (with tiny bit 3DNow) Optimized OnScreenDisplay\n");#elif defined (HAVE_MMX)			mp_msg(MSGT_OSD,MSGL_INFO,"Using MMX Optimized OnScreenDisplay\n");#elif defined(ARCH_X86)			mp_msg(MSGT_OSD,MSGL_INFO,"Using X86 Optimized OnScreenDisplay\n");#else			mp_msg(MSGT_OSD,MSGL_INFO,"Using Unoptimized OnScreenDisplay\n");#endif#endif //!RUNTIME_CPUDETECT	}}void vo_draw_alpha_rgb15(int w,int h, unsigned char* src, unsigned char *srca, int srcstride, unsigned char* dstbase,int dststride){    int y;    for(y=0;y<h;y++){        register unsigned short *dst = (unsigned short*) dstbase;        register int x;        for(x=0;x<w;x++){            if(srca[x]){#ifdef FAST_OSD#ifdef FAST_OSD_TABLE                dst[x]=fast_osd_15bpp_table[src[x]];#else		register unsigned int a=src[x]>>3;                dst[x]=(a<<10)|(a<<5)|a;#endif#else                unsigned char r=dst[x]&0x1F;                unsigned char g=(dst[x]>>5)&0x1F;                unsigned char b=(dst[x]>>10)&0x1F;                r=(((r*srca[x])>>5)+src[x])>>3;                g=(((g*srca[x])>>5)+src[x])>>3;                b=(((b*srca[x])>>5)+src[x])>>3;                dst[x]=(b<<10)|(g<<5)|r;#endif            }        }        src+=srcstride;        srca+=srcstride;        dstbase+=dststride;    }    return;}void vo_draw_alpha_rgb16(int w,int h, unsigned char* src, unsigned char *srca, int srcstride, unsigned char* dstbase,int dststride){    int y;    for(y=0;y<h;y++){        register unsigned short *dst = (unsigned short*) dstbase;        register int x;        for(x=0;x<w;x++){            if(srca[x]){#ifdef FAST_OSD#ifdef FAST_OSD_TABLE                dst[x]=fast_osd_16bpp_table[src[x]];#else                dst[x]=((src[x]>>3)<<11)|((src[x]>>2)<<5)|(src[x]>>3);#endif#else                unsigned char r=dst[x]&0x1F;                unsigned char g=(dst[x]>>5)&0x3F;                unsigned char b=(dst[x]>>11)&0x1F;                r=(((r*srca[x])>>5)+src[x])>>3;                g=(((g*srca[x])>>6)+src[x])>>2;                b=(((b*srca[x])>>5)+src[x])>>3;                dst[x]=(b<<11)|(g<<5)|r;#endif            }        }        src+=srcstride;        srca+=srcstride;        dstbase+=dststride;    }    return;}

⌨️ 快捷键说明

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