/** @brief Query if movie colorspace is supported by the HW. * @return 0 on failure, device capabilities (not probed * currently) on success. */ static int query_format(uint32_t movie_fmt) { int i; for (i = 0; i < DISPLAY_FORMAT_TABLE_ENTRIES; i++) { if (fmt_table[i].mplayer_fmt == movie_fmt) { /* Test conversion from Movie colorspace to * display's target colorspace. */ if (FAILED(IDirect3D9_CheckDeviceFormatConversion(priv->d3d_handle, D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, fmt_table[i].fourcc, priv->desktop_fmt))) { mp_msg(MSGT_VO, MSGL_V, "<vo_direct3d>Rejected image format: %s\n", vo_format_name(fmt_table[i].mplayer_fmt)); return 0; } priv->movie_src_fmt = fmt_table[i].fourcc; mp_msg(MSGT_VO, MSGL_V, "<vo_direct3d>Accepted image format: %s\n", vo_format_name(fmt_table[i].mplayer_fmt)); return (VFCAP_CSP_SUPPORTED | VFCAP_CSP_SUPPORTED_BY_HW | VFCAP_OSD | VFCAP_HWSCALE_UP | VFCAP_HWSCALE_DOWN); } } return 0; }
/** * It tests if the conversion from src to dst is supported. */ static int Direct3DCheckConversion(vout_display_t *vd, D3DFORMAT src, D3DFORMAT dst) { vout_display_sys_t *sys = vd->sys; LPDIRECT3D9 d3dobj = sys->d3dobj; HRESULT hr; /* test whether device can create a surface of that format */ hr = IDirect3D9_CheckDeviceFormat(d3dobj, D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, dst, 0, D3DRTYPE_SURFACE, src); if (SUCCEEDED(hr)) { /* test whether device can perform color-conversion ** from that format to target format */ hr = IDirect3D9_CheckDeviceFormatConversion(d3dobj, D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, src, dst); } if (!SUCCEEDED(hr)) { if (D3DERR_NOTAVAILABLE != hr) msg_Err(vd, "Could not query adapter supported formats. (hr=0x%lX)", hr); return VLC_EGENERIC; } return VLC_SUCCESS; }
/** \fn changeZoom */ bool dxvaRender::init( GUI_WindowInfo * window, uint32_t w, uint32_t h,renderZoom zoom) { ADM_info("Initializing dxva2/D3D render\n"); info=*window; baseInit(w,h,zoom); windowId=(HWND)window->systemWindowId; if(!d3dHandle) { ADM_warning("No D3DHandle\n"); return false; } if (ADM_FAILED(IDirect3D9_GetAdapterDisplayMode(d3dHandle, D3DADAPTER_DEFAULT, &displayMode))) { ADM_warning("Dxv2/D3D Render: Cannot get display mode\n"); return 0; } D3DCAPS9 deviceCapabilities; ADM_info("D3D Checking device capabilities\n"); if (ADM_FAILED(IDirect3D9_GetDeviceCaps(d3dHandle, D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, &deviceCapabilities))) { ADM_warning("Cannot get device capabilities"); return false; } int texture = deviceCapabilities.TextureCaps; ADM_info("Power of 2 : %d\n", (texture & D3DPTEXTURECAPS_POW2) && !(texture & D3DPTEXTURECAPS_NONPOW2CONDITIONAL)); ADM_info("Square only: %d\n", (texture & D3DPTEXTURECAPS_SQUAREONLY)); // Check if we support YV12 D3DFORMAT fmt=displayMode.Format; D3DFORMAT yv12=(D3DFORMAT)MAKEFOURCC('Y','V','1','2'); if (ADM_FAILED(IDirect3D9_CheckDeviceFormatConversion( d3dHandle, // adapter D3DADAPTER_DEFAULT, // device type D3DDEVTYPE_HAL, // adapter format yv12, // render target format fmt))) // depth stencil format { useYV12=false; ADM_info("D3D YV12 not supported\n"); } else { useYV12=true; ADM_info("D3D YV12 is supported\n"); } if(!setup()) { ADM_warning("Dxva/D3D setup failed\n"); return false; } videoWidget=(ADM_Qvideo *)info.widget; videoWidget->useExternalRedraw(true); // deactivate Qt Double buffering videoWidget->setDrawer(this); ADM_info("Dxva (D3D) init successful, dxva render. w=%d, h=%d,zoom=%d, displayWidth=%d, displayHeight=%d\n",(int)w,(int)h,(int)zoom,(int)displayWidth,(int)displayHeight); return true; }