# HG changeset patch # User reimar # Date 1233658809 0 # Node ID f7ba65621809b7e5bef6fc73aab35e83df0f0e1c # Parent 6284666d37946850cccf22627d060de28fdba5a6 Add checks that a D3D device is available before attempting rendering. We may have lost the device e.g. because it became uncooperative e.g. when using remote desktop or Vista's UAC is activated. Patch by Georgi Petrov [gogothebee gmail com] diff -r 6284666d3794 -r f7ba65621809 libvo/vo_direct3d.c --- a/libvo/vo_direct3d.c Tue Feb 03 10:54:27 2009 +0000 +++ b/libvo/vo_direct3d.c Tue Feb 03 11:00:09 2009 +0000 @@ -566,6 +566,11 @@ * if (mpi->flags & MP_IMGFLAG_DIRECT) ... */ + /* If the D3D device is uncooperative (not initialized), return success. + The device will be probed for reinitialization in the next flip_page() */ + if (!priv->d3d_device) + return VO_TRUE; + if (mpi->flags & MP_IMGFLAG_DRAW_CALLBACK) goto skip_upload; @@ -858,7 +863,8 @@ static void flip_page(void) { RECT rect = {0, 0, vo_dwidth, vo_dheight}; - if (FAILED(IDirect3DDevice9_Present(priv->d3d_device, &rect, 0, 0, 0))) { + if (!priv->d3d_device || + FAILED(IDirect3DDevice9_Present(priv->d3d_device, &rect, 0, 0, 0))) { mp_msg(MSGT_VO, MSGL_V, "Trying to reinitialize uncooperative video adapter.\n"); if (!reconfigure_d3d()) { @@ -909,6 +915,11 @@ char *dst; /**< Pointer to the destination image */ int uv_stride; /**< Stride of the U/V planes */ + /* If the D3D device is uncooperative (not initialized), return success. + The device will be probed for reinitialization in the next flip_page() */ + if (!priv->d3d_device) + return 0; + /* Lock the offscreen surface if it's not already locked. */ if (!priv->locked_rect.pBits) { if (FAILED(IDirect3DSurface9_LockRect(priv->d3d_surface, @@ -1017,6 +1028,10 @@ */ static void draw_osd(void) { + // we can not render OSD if we lost the device e.g. because it was uncooperative + if (!priv->d3d_device) + return; + if (vo_osd_changed(0)) { D3DLOCKED_RECT locked_rect; /**< Offscreen surface we lock in order to copy MPlayer's frame inside it.*/