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

📄 vo_directx.c

📁 君正早期ucos系统(只有早期的才不没有打包成库),MPLAYER,文件系统,图片解码,浏览,电子书,录音,想学ucos,识货的人就下吧 russblock fmradio explore set
💻 C
📖 第 1 页 / 共 4 页
字号:
    //try to create an overlay surface using one of the pixel formats in our global list	i=0;    do     {   		ddsdOverlay.ddpfPixelFormat=g_ddpf[i].g_ddpfOverlay;        ddrval = g_lpdd->lpVtbl->CreateSurface(g_lpdd,&ddsdOverlay, &g_lpddsOverlay, NULL);        if (ddrval == DD_OK)		{			 mp_msg(MSGT_VO, MSGL_V ,"<vo_directx><FORMAT OVERLAY>%i %s supported\n",i,g_ddpf[i].img_format_name);			 g_ddpf[i].drv_caps = VFCAP_CSP_SUPPORTED |VFCAP_OSD |VFCAP_CSP_SUPPORTED_BY_HW | VFCAP_HWSCALE_UP;			 formatcount++;}	    else mp_msg(MSGT_VO, MSGL_V ,"<vo_directx><FORMAT OVERLAY>%i %s not supported\n",i,g_ddpf[i].img_format_name);		if (g_lpddsOverlay != NULL) {g_lpddsOverlay->lpVtbl->Release(g_lpddsOverlay);g_lpddsOverlay = NULL;}	} while( ++i < NUM_FORMATS );    mp_msg(MSGT_VO, MSGL_V ,"<vo_directx><INFO>Your card supports %i of %i overlayformats\n",formatcount, NUM_FORMATS);	if (formatcount == 0)	{		mp_msg(MSGT_VO, MSGL_V ,"<vo_directx><WARN>Your card supports overlay, but we couldn't create one\n");		mp_msg(MSGT_VO, MSGL_V ,"<vo_directx><INFO>This can have the following reasons:\n");		mp_msg(MSGT_VO, MSGL_V ,"<vo_directx><INFO>- you are already using an overlay with another app\n");		mp_msg(MSGT_VO, MSGL_V ,"<vo_directx><INFO>- you don't have enough videomemory\n");		mp_msg(MSGT_VO, MSGL_V ,"<vo_directx><INFO>- vo_directx doesn't support the cards overlay pixelformat\n");		return 1;	}    if(capsDrv.dwFXCaps & DDFXCAPS_OVERLAYMIRRORLEFTRIGHT)mp_msg(MSGT_VO, MSGL_V ,"<vo_directx><INFO>can mirror left right\n"); //I don't have hardware which    if(capsDrv.dwFXCaps & DDFXCAPS_OVERLAYMIRRORUPDOWN )mp_msg(MSGT_VO, MSGL_V ,"<vo_directx><INFO>can mirror up down\n");      //supports those send me one and I'll implement ;)	return 0;		}//find out the Pixelformat of the Primary Surfacestatic uint32_t Directx_CheckPrimaryPixelformat(){		uint32_t i=0;    uint32_t formatcount = 0;	DDPIXELFORMAT	ddpf;	DDSURFACEDESC2   ddsd;    HDC             hdc;    HRESULT         hres;	COLORREF        rgbT=RGB(0,0,0);	mp_msg(MSGT_VO, MSGL_V ,"<vo_directx><INFO>checking primary surface\n");	memset( &ddpf, 0, sizeof( DDPIXELFORMAT ));    ddpf.dwSize = sizeof( DDPIXELFORMAT );    //we have to create a primary surface first	if(Directx_CreatePrimarySurface()!=0)return 1;	if(g_lpddsPrimary->lpVtbl->GetPixelFormat( g_lpddsPrimary, &ddpf ) != DD_OK )	{		mp_msg(MSGT_VO, MSGL_FATAL ,"<vo_directx><FATAL ERROR>can't get pixelformat\n");		return 1;	}    while ( i < NUM_FORMATS )    {	   if (g_ddpf[i].g_ddpfOverlay.dwRGBBitCount == ddpf.dwRGBBitCount)	   {           if (g_ddpf[i].g_ddpfOverlay.dwRBitMask == ddpf.dwRBitMask)		   {			   mp_msg(MSGT_VO, MSGL_V ,"<vo_directx><FORMAT PRIMARY>%i %s supported\n",i,g_ddpf[i].img_format_name);			   g_ddpf[i].drv_caps = VFCAP_CSP_SUPPORTED |VFCAP_OSD;			   formatcount++;               primary_image_format=g_ddpf[i].img_format;     		   }	   }	   i++;    }    //get the colorkey for overlay mode	destcolorkey = CLR_INVALID;    if (windowcolor != CLR_INVALID && g_lpddsPrimary->lpVtbl->GetDC(g_lpddsPrimary,&hdc) == DD_OK)    {        rgbT = GetPixel(hdc, 0, 0);             SetPixel(hdc, 0, 0, windowcolor);          g_lpddsPrimary->lpVtbl->ReleaseDC(g_lpddsPrimary,hdc);    }    // read back the converted color    ddsd.dwSize = sizeof(ddsd);    while ((hres = g_lpddsPrimary->lpVtbl->Lock(g_lpddsPrimary,NULL, &ddsd, 0, NULL)) == DDERR_WASSTILLDRAWING)        ;    if (hres == DD_OK)    {        destcolorkey = *(DWORD *) ddsd.lpSurface;                        if (ddsd.ddpfPixelFormat.dwRGBBitCount < 32)            destcolorkey &= (1 << ddsd.ddpfPixelFormat.dwRGBBitCount) - 1;          g_lpddsPrimary->lpVtbl->Unlock(g_lpddsPrimary,NULL);    }    if (windowcolor != CLR_INVALID && g_lpddsPrimary->lpVtbl->GetDC(g_lpddsPrimary,&hdc) == DD_OK)    {        SetPixel(hdc, 0, 0, rgbT);        g_lpddsPrimary->lpVtbl->ReleaseDC(g_lpddsPrimary,hdc);    }	//release primary	g_lpddsPrimary->lpVtbl->Release(g_lpddsPrimary);	g_lpddsPrimary = NULL;	if(formatcount==0)	{		mp_msg(MSGT_VO, MSGL_FATAL ,"<vo_directx><FATAL ERROR>Unknown Pixelformat\n");		return 1;	}	return 0;}//function handles inputstatic LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam){	switch (message)    {        case WM_MOUSEACTIVATE:            return MA_ACTIVATEANDEAT;       	    case WM_NCACTIVATE:        {            if(vidmode && adapter_count > 2) //only disable if more than one adapter.			    return 0;			break;		}		case WM_DESTROY:		{			PostQuitMessage(0);			return 0;		}        case WM_CLOSE:		{			mplayer_put_key(KEY_CLOSE_WIN);			return 0;		}        case WM_WINDOWPOSCHANGED:		{			//printf("Windowposchange\n");			if(g_lpddsBack != NULL)  //or it will crash with -vm			{				Directx_ManageDisplay();			}		    break;		}        case WM_SYSCOMMAND:		{			switch (wParam)			{   //kill screensaver etc. 				//note: works only when the window is active				//you can workaround this by disabling the allow screensaver option in				//the link to the app				case SC_SCREENSAVE:                				case SC_MONITORPOWER:                mp_msg(MSGT_VO, MSGL_V ,"<vo_directx><INFO>killing screensaver\n" );                return 0;                      				case SC_MAXIMIZE:					if (!vo_fs) control(VOCTRL_FULLSCREEN, NULL);                return 0;                      			}			break;		}        case WM_KEYDOWN:		{			switch (wParam)			{				case VK_LEFT:					{mplayer_put_key(KEY_LEFT);break;}                      case VK_UP:					{mplayer_put_key(KEY_UP);break;}                 case VK_RIGHT:					{mplayer_put_key(KEY_RIGHT);break;} 	            case VK_DOWN:					{mplayer_put_key(KEY_DOWN);break;} 	            case VK_TAB:					{mplayer_put_key(KEY_TAB);break;}		        case VK_BACK:					{mplayer_put_key(KEY_BS);break;}		        case VK_DELETE:					{mplayer_put_key(KEY_DELETE);break;}		        case VK_INSERT:					{mplayer_put_key(KEY_INSERT);break;}		        case VK_HOME:					{mplayer_put_key(KEY_HOME);break;}		        case VK_END:					{mplayer_put_key(KEY_END);break;}		        case VK_PRIOR:			        {mplayer_put_key(KEY_PAGE_UP);break;}		        case VK_NEXT:			        {mplayer_put_key(KEY_PAGE_DOWN);break;}		        case VK_ESCAPE:					{mplayer_put_key(KEY_ESC);break;}			}            break;		}        case WM_CHAR:		{			mplayer_put_key(wParam);			break;		}        case WM_LBUTTONDOWN:		{			if (!vo_nomouse_input)				mplayer_put_key(MOUSE_BTN0);			break;		}        case WM_MBUTTONDOWN:		{			if (!vo_nomouse_input)				mplayer_put_key(MOUSE_BTN1);			break;		}        case WM_RBUTTONDOWN:		{			if (!vo_nomouse_input)				mplayer_put_key(MOUSE_BTN2);			break;		}		case WM_LBUTTONDBLCLK:		{			if(!vo_nomouse_input)				mplayer_put_key(MOUSE_BTN0_DBL);			break;		}		case WM_MBUTTONDBLCLK:		{			if(!vo_nomouse_input)				mplayer_put_key(MOUSE_BTN1_DBL);			break;		}		case WM_RBUTTONDBLCLK:		{			if(!vo_nomouse_input)				mplayer_put_key(MOUSE_BTN2_DBL);			break;		}        case WM_MOUSEWHEEL:		{			int x;			if (vo_nomouse_input)				break;			x = GET_WHEEL_DELTA_WPARAM(wParam);			if (x > 0)				mplayer_put_key(MOUSE_BTN3);			else				mplayer_put_key(MOUSE_BTN4);			break;		}        case WM_XBUTTONDOWN:		{			if (vo_nomouse_input)				break;			if (HIWORD(wParam) == 1)				mplayer_put_key(MOUSE_BTN5);			else				mplayer_put_key(MOUSE_BTN6);			break;		}        case WM_XBUTTONDBLCLK:		{			if (vo_nomouse_input)				break;			if (HIWORD(wParam) == 1)				mplayer_put_key(MOUSE_BTN5_DBL);			else				mplayer_put_key(MOUSE_BTN6_DBL);			break;		}		    }	return DefWindowProc(hWnd, message, wParam, lParam);}static int preinit(const char *arg){    HINSTANCE hInstance = GetModuleHandle(NULL);    char exedir[MAX_PATH];    WNDCLASS   wc;	if(arg)	{		if(strstr(arg,"noaccel"))		{			mp_msg(MSGT_VO,MSGL_V,"<vo_directx><INFO>disabled overlay\n");		    nooverlay = 1;		}	}	/*load icon from the main app*/    if(GetModuleFileName(NULL,exedir,MAX_PATH))    {        mplayericon = ExtractIcon( hInstance, exedir, 0 );  	}    if(!mplayericon)mplayericon=LoadIcon(NULL,IDI_APPLICATION);    mplayercursor = LoadCursor(NULL, IDC_ARROW);    monitor_rect.right=GetSystemMetrics(SM_CXSCREEN);    monitor_rect.bottom=GetSystemMetrics(SM_CYSCREEN);	    windowcolor = vo_colorkey;    colorbrush = CreateSolidBrush(windowcolor);    blackbrush = (HBRUSH)GetStockObject(BLACK_BRUSH);    wc.style         =  CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;    wc.lpfnWndProc   =  WndProc;    wc.cbClsExtra    =  0;    wc.cbWndExtra    =  0;    wc.hInstance     =  hInstance;    wc.hCursor       =  mplayercursor;    wc.hIcon         =  mplayericon;    wc.hbrBackground =  vidmode ? blackbrush : colorbrush;    wc.lpszClassName =  WNDCLASSNAME_WINDOWED;    wc.lpszMenuName  =  NULL;    RegisterClass(&wc);    if (WinID != -1) hWnd = WinID;    else    hWnd = CreateWindowEx(vidmode?WS_EX_TOPMOST:0,        WNDCLASSNAME_WINDOWED,"",(vidmode || !vo_border)?WS_POPUP:WNDSTYLE,        CW_USEDEFAULT, CW_USEDEFAULT, 100, 100,NULL,NULL,hInstance,NULL);    wc.hbrBackground = blackbrush;    wc.lpszClassName = WNDCLASSNAME_FULLSCREEN;    RegisterClass(&wc);		if (Directx_InitDirectDraw()!= 0)return 1;          //init DirectDraw	    if(!vidmode)hWndFS = CreateWindow(WNDCLASSNAME_FULLSCREEN,"MPlayer Fullscreen",WS_POPUP,monitor_rect.left,monitor_rect.top,monitor_rect.right-monitor_rect.left,monitor_rect.bottom-monitor_rect.top,hWnd,NULL,hInstance,NULL);			    mp_msg(MSGT_VO, MSGL_DBG3 ,"<vo_directx><INFO>initial mplayer windows created\n");        if (Directx_CheckPrimaryPixelformat()!=0)return 1;	if (!nooverlay && Directx_CheckOverlayPixelformats() == 0)        //check for supported hardware	{		mp_msg(MSGT_VO, MSGL_V ,"<vo_directx><INFO>hardware supports overlay\n");		nooverlay = 0; 	} 	else   //if we can't have overlay we create a backpuffer with the same imageformat as the primary surface	{       	mp_msg(MSGT_VO, MSGL_V ,"<vo_directx><INFO>using backpuffer\n");		nooverlay = 1;	} 	mp_msg(MSGT_VO, MSGL_DBG3 ,"<vo_directx><INFO>preinit succesfully finished\n");	return 0;}static int draw_slice(uint8_t *src[], int stride[], int w,int h,int x,int y ){	uint8_t *s;    uint8_t *d;    uint32_t i=0, uvstride=dstride/2;	// copy Y    d=image+dstride*y+x;                    s=src[0];                               mem2agpcpy_pic(d,s,w,h,dstride,stride[0]);    	w/=2;h/=2;x/=2;y/=2;		// copy U    d=image+dstride*image_height + uvstride*y+x;    if(image_format == IMGFMT_YV12)s=src[2];	else s=src[1];    mem2agpcpy_pic(d,s,w,h,uvstride,stride[1]);		// copy V    d=image+dstride*image_height +uvstride*(image_height/2) + uvstride*y+x;    if(image_format == IMGFMT_YV12)s=src[1];	else s=src[2];    mem2agpcpy_pic(d,s,w,h,uvstride,stride[2]);    return 0;}static void flip_page(void){   	HRESULT dxresult;	g_lpddsBack->lpVtbl->Unlock (g_lpddsBack,NULL);	if (vo_doublebuffering)     {		// flip to the next image in the sequence  		dxresult = g_lpddsOverlay->lpVtbl->Flip( g_lpddsOverlay,NULL, DDFLIP_WAIT);		if(dxresult == DDERR_SURFACELOST)		{			mp_msg(MSGT_VO, MSGL_ERR,"<vo_directx><ERROR><vo_directx><INFO>Restoring Surface\n");			g_lpddsBack->lpVtbl->Restore( g_lpddsBack );		    dxresult = g_lpddsOverlay->lpVtbl->Flip( g_lpddsOverlay,NULL, DDFLIP_WAIT);		}		if(dxresult != DD_OK)mp_msg(MSGT_VO, MSGL_ERR,"<vo_directx><ERROR>can't flip page\n");    }	if(nooverlay) 	{		DDBLTFX  ddbltfx;        // ask for the "NOTEARING" option	    memset( &ddbltfx, 0, sizeof(DDBLTFX) );        ddbltfx.dwSize = sizeof(DDBLTFX);        ddbltfx.dwDDFX = DDBLTFX_NOTEARING;        g_lpddsPrimary->lpVtbl->Blt(g_lpddsPrimary, &rd, g_lpddsBack, NULL, DDBLT_WAIT, &ddbltfx);    }		g_lpddsBack->lpVtbl->Lock(g_lpddsBack,NULL,&ddsdsf, DDLOCK_NOSYSLOCK | DDLOCK_WAIT , NULL);    if(vo_directrendering && (dstride != ddsdsf.lPitch)){      mp_msg(MSGT_VO,MSGL_WARN,"<vo_directx><WARN>stride changed !!!! disabling direct rendering\n");      vo_directrendering=0;    }	dstride = ddsdsf.lPitch;    image = ddsdsf.lpSurface;}static int draw_frame(uint8_t *src[]){  	fast_memcpy( image, *src, dstride * image_height );	return 0;}static uint32_t get_image(mp_image_t *mpi){    if(mpi->flags&MP_IMGFLAG_READABLE) {mp_msg(MSGT_VO, MSGL_V,"<vo_directx><ERROR>slow video ram\n");return VO_FALSE;}     if(mpi->type==MP_IMGTYPE_STATIC) {mp_msg(MSGT_VO, MSGL_V,"<vo_directx><ERROR>not static\n");return VO_FALSE;}    if((mpi->width==dstride) || (mpi->flags&(MP_IMGFLAG_ACCEPT_STRIDE|MP_IMGFLAG_ACCEPT_WIDTH)))	{

⌨️ 快捷键说明

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