Commit 9d5044b7 authored by Gildas Bazin's avatar Gildas Bazin

* modules/video_output/x11/xcommon.c: try to detect XShmAttach() failure (eg....

* modules/video_output/x11/xcommon.c: try to detect XShmAttach() failure (eg. when running on an exported display).
parent 76ed22f1
...@@ -103,6 +103,7 @@ static IMAGE_TYPE *CreateImage ( vout_thread_t *, ...@@ -103,6 +103,7 @@ static IMAGE_TYPE *CreateImage ( vout_thread_t *,
#ifdef HAVE_SYS_SHM_H #ifdef HAVE_SYS_SHM_H
static IMAGE_TYPE *CreateShmImage ( vout_thread_t *, static IMAGE_TYPE *CreateShmImage ( vout_thread_t *,
Display *, EXTRA_ARGS_SHM, int, int ); Display *, EXTRA_ARGS_SHM, int, int );
static vlc_bool_t b_shm = VLC_TRUE;
#endif #endif
static void ToggleFullScreen ( vout_thread_t * ); static void ToggleFullScreen ( vout_thread_t * );
...@@ -1222,7 +1223,8 @@ static int NewPicture( vout_thread_t *p_vout, picture_t *p_pic ) ...@@ -1222,7 +1223,8 @@ static int NewPicture( vout_thread_t *p_vout, picture_t *p_pic )
&p_pic->p_sys->shminfo, &p_pic->p_sys->shminfo,
p_vout->output.i_width, p_vout->output.i_height ); p_vout->output.i_width, p_vout->output.i_height );
} }
else
if( !p_vout->p_sys->b_shm || !p_pic->p_sys->p_image )
#endif /* HAVE_SYS_SHM_H */ #endif /* HAVE_SYS_SHM_H */
{ {
/* Create image without XShm extension */ /* Create image without XShm extension */
...@@ -1238,6 +1240,14 @@ static int NewPicture( vout_thread_t *p_vout, picture_t *p_pic ) ...@@ -1238,6 +1240,14 @@ static int NewPicture( vout_thread_t *p_vout, picture_t *p_pic )
p_vout->p_sys->i_bytes_per_pixel, p_vout->p_sys->i_bytes_per_pixel,
#endif #endif
p_vout->output.i_width, p_vout->output.i_height ); p_vout->output.i_width, p_vout->output.i_height );
#ifdef HAVE_SYS_SHM_H
if( p_pic->p_sys->p_image && p_vout->p_sys->b_shm )
{
msg_Warn( p_vout, "couldn't create SHM image, disabling SHM." );
p_vout->p_sys->b_shm = VLC_FALSE;
}
#endif /* HAVE_SYS_SHM_H */
} }
if( p_pic->p_sys->p_image == NULL ) if( p_pic->p_sys->p_image == NULL )
...@@ -2006,6 +2016,7 @@ static IMAGE_TYPE * CreateShmImage( vout_thread_t *p_vout, ...@@ -2006,6 +2016,7 @@ static IMAGE_TYPE * CreateShmImage( vout_thread_t *p_vout,
int i_width, int i_height ) int i_width, int i_height )
{ {
IMAGE_TYPE *p_image; IMAGE_TYPE *p_image;
Status result;
/* Create XImage / XvImage */ /* Create XImage / XvImage */
#ifdef MODULE_NAME_IS_xvideo #ifdef MODULE_NAME_IS_xvideo
...@@ -2047,7 +2058,10 @@ static IMAGE_TYPE * CreateShmImage( vout_thread_t *p_vout, ...@@ -2047,7 +2058,10 @@ static IMAGE_TYPE * CreateShmImage( vout_thread_t *p_vout,
p_shm->readOnly = True; p_shm->readOnly = True;
/* Attach shared memory segment to X server */ /* Attach shared memory segment to X server */
if( XShmAttach( p_display, p_shm ) == False ) XSynchronize( p_display, True );
b_shm = VLC_TRUE;
result = XShmAttach( p_display, p_shm );
if( result == False || !b_shm )
{ {
msg_Err( p_vout, "cannot attach shared memory to X server" ); msg_Err( p_vout, "cannot attach shared memory to X server" );
IMAGE_FREE( p_image ); IMAGE_FREE( p_image );
...@@ -2055,6 +2069,7 @@ static IMAGE_TYPE * CreateShmImage( vout_thread_t *p_vout, ...@@ -2055,6 +2069,7 @@ static IMAGE_TYPE * CreateShmImage( vout_thread_t *p_vout,
shmdt( p_shm->shmaddr ); shmdt( p_shm->shmaddr );
return NULL; return NULL;
} }
XSynchronize( p_display, False );
/* Send image to X server. This instruction is required, since having /* Send image to X server. This instruction is required, since having
* built a Shm XImage and not using it causes an error on XCloseDisplay, * built a Shm XImage and not using it causes an error on XCloseDisplay,
...@@ -2148,6 +2163,14 @@ static int X11ErrorHandler( Display * display, XErrorEvent * event ) ...@@ -2148,6 +2163,14 @@ static int X11ErrorHandler( Display * display, XErrorEvent * event )
return 0; return 0;
} }
if( event->request_code == 150 /* MIT-SHM */ &&
event->minor_code == X_ShmAttach )
{
fprintf(stderr, "XShmAttach failed\n");
b_shm = VLC_FALSE;
return 0;
}
XSetErrorHandler(NULL); XSetErrorHandler(NULL);
return (XSetErrorHandler(X11ErrorHandler))( display, event ); return (XSetErrorHandler(X11ErrorHandler))( display, event );
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment