📄 vo_directx.c.orig
字号:
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 + -