X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;ds=sidebyside;f=modules%2Fvideo_output%2Fx11%2Fxcommon.c;h=20567c3eacf04e7d8ae0c4dd9f076a5239f2f572;hb=6ee1e193fd896ab9a4729fde14f009d9ce629815;hp=094c4344343944941d2d5c27350c7f41dac3ada3;hpb=4a0090f442f99e1c76cd69ac1a30d0740535e8a3;p=vlc diff --git a/modules/video_output/x11/xcommon.c b/modules/video_output/x11/xcommon.c index 094c434434..20567c3eac 100644 --- a/modules/video_output/x11/xcommon.c +++ b/modules/video_output/x11/xcommon.c @@ -27,16 +27,14 @@ /***************************************************************************** * Preamble *****************************************************************************/ -#include /* ENOMEM */ -#include /* free() */ -#include /* strerror() */ - #include #include #include #include #include +#include /* ENOMEM */ + #ifdef HAVE_MACHINE_PARAM_H /* BSD */ # include @@ -290,6 +288,47 @@ int E_(Activate) ( vlc_object_t *p_this ) } } p_vout->output.i_chroma = X112VLC_FOURCC(p_vout->output.i_chroma); +#elif defined(MODULE_NAME_IS_glx) + { + int i_opcode, i_evt, i_err = 0; + int i_maj, i_min = 0; + + /* Check for GLX extension */ + if( !XQueryExtension( p_vout->p_sys->p_display, "GLX", + &i_opcode, &i_evt, &i_err ) ) + { + msg_Err( p_this, "GLX extension not supported" ); + XCloseDisplay( p_vout->p_sys->p_display ); + free( p_vout->p_sys ); + return VLC_EGENERIC; + } + if( !glXQueryExtension( p_vout->p_sys->p_display, &i_err, &i_evt ) ) + { + msg_Err( p_this, "glXQueryExtension failed" ); + XCloseDisplay( p_vout->p_sys->p_display ); + free( p_vout->p_sys ); + return VLC_EGENERIC; + } + + /* Check GLX version */ + if (!glXQueryVersion( p_vout->p_sys->p_display, &i_maj, &i_min ) ) + { + msg_Err( p_this, "glXQueryVersion failed" ); + XCloseDisplay( p_vout->p_sys->p_display ); + free( p_vout->p_sys ); + return VLC_EGENERIC; + } + if( i_maj <= 0 || ((i_maj == 1) && (i_min < 3)) ) + { + p_vout->p_sys->b_glx13 = VLC_FALSE; + msg_Dbg( p_this, "using GLX 1.2 API" ); + } + else + { + p_vout->p_sys->b_glx13 = VLC_TRUE; + msg_Dbg( p_this, "using GLX 1.3 API" ); + } + } #endif /* Create blank cursor (for mouse cursor autohiding) */ @@ -391,7 +430,7 @@ int E_(Activate) ( vlc_object_t *p_this ) #endif #ifdef HAVE_OSSO - p_vout->p_sys->i_backlight_on_counter = i_backlight_on_interval; + p_vout->p_sys->i_backlight_on_counter = i_backlight_on_interval; p_vout->p_sys->p_octx = osso_initialize( "vlc", VERSION, 0, NULL ); if ( p_vout->p_sys->p_octx == NULL ) { msg_Err( p_vout, "Could not get osso context" ); @@ -460,7 +499,7 @@ void E_(Deactivate) ( vlc_object_t *p_this ) #ifdef HAVE_XSP DisablePixelDoubling(p_vout); #endif - + DestroyCursor( p_vout ); EnableXScreenSaver( p_vout ); DestroyWindow( p_vout, &p_vout->p_sys->original_window ); @@ -995,7 +1034,7 @@ static void DisplayVideo( vout_thread_t *p_vout, picture_t *p_pic ) first_field); XVMCUNLOCKDISPLAY( p_vout->p_sys->p_display ); - if( p_vout->p_sys->xvmc_deinterlace_method == 2 ) + if( p_vout->p_sys->xvmc_deinterlace_method == 2 ) { /* BOB DEINTERLACE */ if( p_picture->p_sys->nb_display == 0 )/* && ((t2-t1) < 15000)) */ { @@ -1406,41 +1445,17 @@ static int ManageVideo( vout_thread_t *p_vout ) */ if ( p_vout->i_changes & VOUT_FULLSCREEN_CHANGE ) { - vlc_value_t val; + vlc_value_t val_fs, val_ontop; /* Update the object variable and trigger callback */ - val.b_bool = !p_vout->b_fullscreen; + val_fs.b_bool = !p_vout->b_fullscreen; - /* - * FIXME FIXME FIXME FIXME: EXPLICIT HACK. - * On the one hand, we cannot hold the lock while triggering a - * callback, as it causes a deadlock with video-on-top handling. - * On the other hand, we have to lock while triggering the - * callback to: - * 1/ make sure video-on-top remains in sync with fullscreen - * (i.e. unlocking creates a race condition if fullscreen is - * switched on and off VERY FAST). - * 2/ avoid possible corruption bugs if another thread gets the - * mutex and modifies our data in-between. - * - * This is obviously contradictory. Correct solutions may include: - * - putting the fullscreen NAND video-on-top logic out of libvlc, - * back into the video output plugins (ugly code duplication...), - * - serializing fullscreen and video-on-top handling properly - * instead of doing it via the fullscreen callback. That's got to - * be the correct one. - */ -#ifdef MODULE_NAME_IS_xvmc - xvmc_context_reader_unlock( &p_vout->p_sys->xvmc_lock ); -#endif - vlc_mutex_unlock( &p_vout->p_sys->lock ); - - var_Set( p_vout, "fullscreen", val ); + var_Set( p_vout, "fullscreen", val_fs ); - vlc_mutex_lock( &p_vout->p_sys->lock ); -#ifdef MODULE_NAME_IS_xvmc - xvmc_context_reader_lock( &p_vout->p_sys->xvmc_lock ); -#endif + /* Disable "always on top" in fullscreen mode */ + var_Get( p_vout, "video-on-top", &val_ontop ); + if( val_ontop.b_bool ) + WindowOnTop( p_vout, val_fs.b_bool ); ToggleFullScreen( p_vout ); p_vout->i_changes &= ~VOUT_FULLSCREEN_CHANGE; @@ -1504,13 +1519,13 @@ static int ManageVideo( vout_thread_t *p_vout ) #ifdef MODULE_NAME_IS_xvmc xvmc_context_reader_unlock( &p_vout->p_sys->xvmc_lock ); #endif - + #ifdef HAVE_OSSO if ( p_vout->p_sys->p_octx != NULL ) { if ( p_vout->p_sys->i_backlight_on_counter == i_backlight_on_interval ) { if ( osso_display_blanking_pause( p_vout->p_sys->p_octx ) != OSSO_OK ) { msg_Err( p_vout, "Could not disable backlight blanking" ); - } else { + } else { msg_Dbg( p_vout, "Backlight blanking disabled" ); } p_vout->p_sys->i_backlight_on_counter = 0; @@ -1519,7 +1534,7 @@ static int ManageVideo( vout_thread_t *p_vout ) } } #endif - + vlc_mutex_unlock( &p_vout->p_sys->lock ); return 0; } @@ -1893,7 +1908,7 @@ static int NewPicture( vout_thread_t *p_vout, picture_t *p_pic ) p_pic->p_sys->p_image = CreateImage( p_vout, p_vout->p_sys->p_display, #if defined(MODULE_NAME_IS_xvideo) || defined(MODULE_NAME_IS_xvmc) - p_vout->p_sys->i_xvport, + p_vout->p_sys->i_xvport, VLC2X11_FOURCC(p_vout->output.i_chroma), p_pic->format.i_bits_per_pixel, #else @@ -2217,7 +2232,7 @@ static void ToggleFullScreen ( vout_thread_t *p_vout ) #ifdef HAVE_XSP EnablePixelDoubling( p_vout ); #endif - + } else {