* vout.c: Windows DirectX video output display method
*****************************************************************************
* Copyright (C) 2001 VideoLAN
- * $Id: directx.c,v 1.6 2002/10/28 22:25:16 gbazin Exp $
+ * $Id: directx.c,v 1.7 2002/11/26 10:55:19 gbazin Exp $
*
* Authors: Gildas Bazin <gbazin@netcourrier.com>
*
LPDIRECTDRAWSURFACE2 );
static int DirectXCreateClipper ( vout_thread_t *p_vout );
static void DirectXGetDDrawCaps ( vout_thread_t *p_vout );
-static int DirectXGetSurfaceDesc ( picture_t *p_pic );
+static int DirectXGetSurfaceDesc ( vout_thread_t *p_vout, picture_t *p_pic );
/*****************************************************************************
* Module descriptor
if( !I_OUTPUTPICTURES )
{
/* hmmm, it didn't work! Let's try commonly supported chromas */
- p_vout->output.i_chroma = VLC_FOURCC('Y','V','1','2');
- NewPictureVec( p_vout, p_vout->p_picture, MAX_DIRECTBUFFERS );
+ if( p_vout->output.i_chroma != VLC_FOURCC('Y','V','1','2') )
+ {
+ p_vout->output.i_chroma = VLC_FOURCC('Y','V','1','2');
+ NewPictureVec( p_vout, p_vout->p_picture, MAX_DIRECTBUFFERS );
+ }
if( !I_OUTPUTPICTURES )
{
- /* hmmm, it didn't work! Let's try commonly supported chromas */
+ /* hmmm, it still didn't work! Let's try another one */
p_vout->output.i_chroma = VLC_FOURCC('Y','U','Y','2');
NewPictureVec( p_vout, p_vout->p_picture, MAX_DIRECTBUFFERS );
}
msg_Warn( p_vout, "could not flip overlay (error %i)", dxresult );
}
- if( DirectXGetSurfaceDesc( p_pic ) )
+ if( DirectXGetSurfaceDesc( p_vout, p_pic ) )
{
/* AAARRGG */
msg_Err( p_vout, "cannot get surface desc" );
int i_ret = VLC_SUCCESS;
LPDIRECTDRAWSURFACE2 p_surface;
- msg_Dbg( p_vout, "NewPictureVec" );
+ msg_Dbg( p_vout, "NewPictureVec overlay:%s chroma:%.4s",
+ p_vout->p_sys->b_using_overlay ? "yes" : "no",
+ (char *)&p_vout->output.i_chroma );
I_OUTPUTPICTURES = 0;
p_pic[0].p_sys->p_front_surface;
/* Reset the front buffer memory */
- if( !DirectXGetSurfaceDesc( &front_pic ) &&
+ if( !DirectXGetSurfaceDesc( p_vout, &front_pic ) &&
!UpdatePictureStruct( p_vout, &front_pic,
p_vout->output.i_chroma ) )
{
DirectXUpdateOverlay( p_vout );
I_OUTPUTPICTURES = 1;
- msg_Dbg( p_vout, "DirectX YUV overlay created successfully" );
+ msg_Dbg( p_vout, "YUV overlay created successfully" );
}
}
{
i_ret = DirectXCreateSurface( p_vout, &p_surface,
p_vout->output.i_chroma,
- p_vout->p_sys->b_using_overlay,
+ 0 /* no overlay */,
0 /* no back buffers */ );
}
i_ret = DirectXCreateSurface( p_vout, &p_surface,
p_vout->output.i_chroma,
- p_vout->p_sys->b_using_overlay,
+ 0 /* no overlay */,
0 /* no back buffers */ );
+
+ if( i_ret && !p_vout->p_sys->b_use_sysmem )
+ {
+ /* Give it a last try with b_use_sysmem enabled */
+ p_vout->p_sys->b_use_sysmem = 1;
+
+ i_ret = DirectXCreateSurface( p_vout, &p_surface,
+ p_vout->output.i_chroma,
+ 0 /* no overlay */,
+ 0 /* no back buffers */ );
+ }
}
if( i_ret == VLC_SUCCESS )
I_OUTPUTPICTURES = 1;
- msg_Dbg( p_vout, "DirectX plain surface created successfully" );
+ msg_Dbg( p_vout, "created plain surface of chroma:%.4s",
+ (char *)&p_vout->output.i_chroma );
}
}
p_pic[i].i_type = DIRECT_PICTURE;
PP_OUTPUTPICTURE[i] = &p_pic[i];
- if( DirectXGetSurfaceDesc( &p_pic[i] ) )
+ if( DirectXGetSurfaceDesc( p_vout, &p_pic[i] ) )
{
/* AAARRGG */
FreePictureVec( p_vout, p_pic, I_OUTPUTPICTURES );
}
}
- msg_Dbg( p_vout, "End NewPictureVec");
+ msg_Dbg( p_vout, "End NewPictureVec (%s)",
+ I_OUTPUTPICTURES ? "succeeded" : "failed" );
+
return VLC_SUCCESS;
}
* This function get and stores the surface descriptor which among things
* has the pointer to the picture data.
*****************************************************************************/
-static int DirectXGetSurfaceDesc( picture_t *p_pic )
+static int DirectXGetSurfaceDesc( vout_thread_t *p_vout, picture_t *p_pic )
{
HRESULT dxresult;
}
if( dxresult != DD_OK )
{
-//X msg_Err( p_vout, "DirectXGetSurfaceDesc cannot lock surface" );
+ msg_Err( p_vout, "DirectXGetSurfaceDesc cannot lock surface" );
return VLC_EGENERIC;
}