* modules/video_output/directx/directx.c: fixed to work with DirectDraw 3 (ie. with
authorGildas Bazin <gbazin@videolan.org>
Tue, 26 Nov 2002 19:31:50 +0000 (19:31 +0000)
committerGildas Bazin <gbazin@videolan.org>
Tue, 26 Nov 2002 19:31:50 +0000 (19:31 +0000)
NT4).

modules/video_output/directx/directx.c

index 89fba18..6abeb1a 100644 (file)
@@ -2,7 +2,7 @@
  * vout.c: Windows DirectX video output display method
  *****************************************************************************
  * Copyright (C) 2001 VideoLAN
- * $Id: directx.c,v 1.7 2002/11/26 10:55:19 gbazin Exp $
+ * $Id: directx.c,v 1.8 2002/11/26 19:31:50 gbazin Exp $
  *
  * Authors: Gildas Bazin <gbazin@netcourrier.com>
  *
@@ -1409,20 +1409,31 @@ static int DirectXGetSurfaceDesc( vout_thread_t *p_vout, picture_t *p_pic )
                                          NULL, &p_pic->p_sys->ddsd,
                                          DDLOCK_NOSYSLOCK | DDLOCK_WAIT,
                                          NULL );
-    if ( dxresult == DDERR_SURFACELOST )
-    {
-        /* Your surface can be lost so be sure
-         * to check this and restore it if needed */
-        dxresult = IDirectDrawSurface2_Restore( p_pic->p_sys->p_surface );
-        dxresult = IDirectDrawSurface2_Lock( p_pic->p_sys->p_surface, NULL,
-                                             &p_pic->p_sys->ddsd,
-                                             DDLOCK_NOSYSLOCK | DDLOCK_WAIT,
-                                             NULL);
-    }
     if( dxresult != DD_OK )
     {
-        msg_Err( p_vout, "DirectXGetSurfaceDesc cannot lock surface" );
-        return VLC_EGENERIC;
+        if( dxresult == DDERR_INVALIDPARAMS )
+        {
+            /* DirectX 3 doesn't support the DDLOCK_NOSYSLOCK flag, resulting
+             * in an invalid params error */
+            dxresult = IDirectDrawSurface2_Restore( p_pic->p_sys->p_surface );
+            dxresult = IDirectDrawSurface2_Lock( p_pic->p_sys->p_surface, NULL,
+                                             &p_pic->p_sys->ddsd,
+                                             DDLOCK_WAIT, NULL);
+        }
+        if( dxresult == DDERR_SURFACELOST )
+        {
+            /* Your surface can be lost so be sure
+             * to check this and restore it if needed */
+            dxresult = IDirectDrawSurface2_Restore( p_pic->p_sys->p_surface );
+            dxresult = IDirectDrawSurface2_Lock( p_pic->p_sys->p_surface, NULL,
+                                             &p_pic->p_sys->ddsd,
+                                             DDLOCK_WAIT, NULL);
+        }
+        if( dxresult != DD_OK )
+        {
+            msg_Err( p_vout, "DirectXGetSurfaceDesc cannot lock surface" );
+            return VLC_EGENERIC;
+        }
     }
 
     /* Unlock the Surface */