static gboolean gst_dx9screencapsrc_start (GstBaseSrc * bsrc) { GstDX9ScreenCapSrc *src = GST_DX9SCREENCAPSRC (bsrc); D3DPRESENT_PARAMETERS d3dpp; HMONITOR monitor; HRESULT res; src->frame_number = -1; ZeroMemory (&d3dpp, sizeof (D3DPRESENT_PARAMETERS)); d3dpp.Windowed = TRUE; d3dpp.Flags = D3DPRESENTFLAG_LOCKABLE_BACKBUFFER; d3dpp.BackBufferFormat = src->disp_mode.Format; d3dpp.BackBufferHeight = src->disp_mode.Height; d3dpp.BackBufferWidth = src->disp_mode.Width; d3dpp.BackBufferCount = 1; d3dpp.MultiSampleType = D3DMULTISAMPLE_NONE; d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; d3dpp.hDeviceWindow = GetDesktopWindow (); d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_DEFAULT; d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT; if (src->monitor >= IDirect3D9_GetAdapterCount (g_d3d9)) { GST_ELEMENT_ERROR (src, RESOURCE, NOT_FOUND, ("Specified monitor with index %d not found", src->monitor), (NULL)); return FALSE; } res = IDirect3D9_CreateDevice (g_d3d9, src->monitor, D3DDEVTYPE_HAL, GetDesktopWindow (), D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &src->d3d9_device); if (FAILED (res)) return FALSE; monitor = IDirect3D9_GetAdapterMonitor (g_d3d9, src->monitor); GetMonitorInfo (monitor, &src->monitor_info); return SUCCEEDED (IDirect3DDevice9_CreateOffscreenPlainSurface (src->d3d9_device, src->disp_mode.Width, src->disp_mode.Height, D3DFMT_A8R8G8B8, D3DPOOL_SYSTEMMEM, &src->surface, NULL)); }
static HMONITOR get_adapter_monitor(base *d3dptr, UINT adapter) { IDirect3D9 *d3d9 = (IDirect3D9 *)d3dptr->d3dobj; return IDirect3D9_GetAdapterMonitor(d3d9, adapter); }