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

📄 vo_directx.c.orig

📁 DawnLightPlayer,一个新的基于ffmpeg的全功能播放器
💻 ORIG
📖 第 1 页 / 共 4 页
字号:
		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 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 );			// restore overlay and primary before calling			// Directx_ManageDisplay() to avoid error messages			g_lpddsOverlay->lpVtbl->Restore( g_lpddsOverlay );			g_lpddsPrimary->lpVtbl->Restore( g_lpddsPrimary );			// update overlay in case we return from screensaver			Directx_ManageDisplay();			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);	}	if (g_lpddsBack->lpVtbl->Lock(g_lpddsBack,NULL,&ddsdsf, DDLOCK_NOSYSLOCK | DDLOCK_WAIT , NULL) == DD_OK)	{		if (vo_directrendering && (dstride != ddsdsf.lPitch))		{			mp_msg(MSGT_VO,MSGL_WARN,"<vo_directx><WARN>stride changed !!!! disabling direct rendering\n");			vo_directrendering=0;		}		if (tmp_image)			free(tmp_image);		tmp_image = NULL;		dstride = ddsdsf.lPitch;		image = ddsdsf.lpSurface;	}	else if (!tmp_image)	{		mp_msg(MSGT_VO, MSGL_WARN, "<vo_directx><WARN>Locking the surface failed, rendering to a hidden surface!\n");		tmp_image = image = calloc(1, image_height * dstride * 2);	}}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)))	{		if (mpi->flags&MP_IMGFLAG_PLANAR)		{			if (image_format == IMGFMT_YV12)			{				mpi->planes[2]= image + dstride*image_height;				mpi->planes[1]= image + dstride*image_height+ dstride*image_height/4;				mpi->stride[1]=mpi->stride[2]=dstride/2;			}			else if (image_format == IMGFMT_IYUV || image_format == IMGFMT_I420)			{				mpi->planes[1]= image + dstride*image_height;				mpi->planes[2]= image + dstride*image_height+ dstride*image_height/4;				mpi->stride[1]=mpi->stride[2]=dstride/2;			}			else if (image_format == IMGFMT_YVU9)			{				mpi->planes[2] = image + dstride*image_height;				mpi->planes[1] = image + dstride*image_height+ dstride*image_height/16;				mpi->stride[1]=mpi->stride[2]=dstride/4;			}		}		mpi->planes[0]=image;		mpi->stride[0]=dstride;		mpi->width=image_width;		mpi->height=image_height;		mpi->flags|=MP_IMGFLAG_DIRECT;

⌨️ 快捷键说明

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