X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fvideo_output%2Fx11%2Fxcommon.c;h=c3c686f3a1f85f32afd9e98b06363fde3da9fb93;hb=78e39f0d6ddac05f824b1beb6bfc712088b17fdc;hp=eec2afaedc848e162d0d05da6874f78a2d84cc08;hpb=b687f9e9cff90c72eb4f51332a314d098da4ffe6;p=vlc diff --git a/modules/video_output/x11/xcommon.c b/modules/video_output/x11/xcommon.c index eec2afaedc..c3c686f3a1 100644 --- a/modules/video_output/x11/xcommon.c +++ b/modules/video_output/x11/xcommon.c @@ -122,7 +122,7 @@ static IMAGE_TYPE *CreateImage ( vout_thread_t *, #ifdef HAVE_SYS_SHM_H #ifndef MODULE_NAME_IS_glx -static IMAGE_TYPE *CreateShmImage ( vout_thread_t *, +IMAGE_TYPE *CreateShmImage ( vout_thread_t *, Display *, EXTRA_ARGS_SHM, int, int ); #endif static int i_shm_major = 0; @@ -224,10 +224,10 @@ int E_(Activate) ( vlc_object_t *p_this ) msg_Err( p_vout, "cannot open display %s", XDisplayName( psz_display ) ); free( p_vout->p_sys ); - if( psz_display ) free( psz_display ); + free( psz_display ); return VLC_EGENERIC; } - if( psz_display ) free( psz_display ); + free( psz_display ); /* Replace error handler so we can intercept some non-fatal errors */ XSetErrorHandler( X11ErrorHandler ); @@ -342,6 +342,8 @@ int E_(Activate) ( vlc_object_t *p_this ) /* Create blank cursor (for mouse cursor autohiding) */ p_vout->p_sys->i_time_mouse_last_moved = mdate(); + p_vout->p_sys->i_mouse_hide_timeout = + var_GetInteger(p_vout, "mouse-hide-timeout") * 1000; p_vout->p_sys->b_mouse_pointer_visible = 1; CreateCursor( p_vout ); @@ -430,6 +432,7 @@ int E_(Activate) ( vlc_object_t *p_this ) E_(Deactivate)( p_vout ); return VLC_EGENERIC; } + subpicture_t sub_pic; sub_pic.p_sys = NULL; p_vout->p_sys->last_date = 0; #endif @@ -597,11 +600,11 @@ static void RenderVideo( vout_thread_t *p_vout, picture_t *p_pic ) return; } +#if 0 vlc_mutex_lock( &p_vout->lastsubtitle_lock ); - - if (p_vout->p_last_subtitle != NULL) + if (p_vout->p_sys->p_last_subtitle != NULL) { - if( p_vout->p_sys->p_last_subtitle_save != p_vout->p_last_subtitle ) + if( p_vout->p_sys->p_last_subtitle_save != p_vout->p_sys->p_last_subtitle ) { p_vout->p_sys->new_subpic = xxmc_xvmc_alloc_subpicture( p_vout, &p_vout->p_sys->context, @@ -755,6 +758,7 @@ static void RenderVideo( vout_thread_t *p_vout, picture_t *p_pic ) p_vout->p_sys->p_last_subtitle_save = p_vout->p_last_subtitle; vlc_mutex_unlock( &p_vout->lastsubtitle_lock ); +#endif xvmc_context_reader_unlock( &p_vout->p_sys->xvmc_lock ); vlc_mutex_unlock( &p_vout->p_sys->lock ); @@ -965,20 +969,21 @@ static void DisplayVideo( vout_thread_t *p_vout, picture_t *p_pic ) #ifdef MODULE_NAME_IS_xvmc xvmc_context_reader_lock( &p_vout->p_sys->xvmc_lock ); - vlc_xxmc_t *xxmc = &p_picture->p_sys->xxmc_data; + vlc_xxmc_t *xxmc = &p_pic->p_sys->xxmc_data; if( !xxmc->decoded || - !xxmc_xvmc_surface_valid( p_vout, p_picture->p_sys->xvmc_surf ) ) + !xxmc_xvmc_surface_valid( p_vout, p_pic->p_sys->xvmc_surf ) ) { msg_Dbg( p_vout, "DisplayVideo decoded=%d\tsurfacevalid=%d", xxmc->decoded, - xxmc_xvmc_surface_valid( p_vout, p_picture->p_sys->xvmc_surf ) ); + xxmc_xvmc_surface_valid( p_vout, p_pic->p_sys->xvmc_surf ) ); vlc_mutex_unlock( &p_vout->p_sys->lock ); xvmc_context_reader_unlock( &p_vout->p_sys->xvmc_lock ); return; } - src_width = p_vout->output.i_width; - src_height = p_vout->output.i_height; + int src_width = p_vout->output.i_width; + int src_height = p_vout->output.i_height; + int src_x, src_y; if( p_vout->p_sys->xvmc_crop_style == 1 ) { @@ -1007,17 +1012,18 @@ static void DisplayVideo( vout_thread_t *p_vout, picture_t *p_pic ) src_y = 0; } + int first_field; if( p_vout->p_sys->xvmc_deinterlace_method > 0 ) { /* BOB DEINTERLACE */ - if( (p_picture->p_sys->nb_display == 0) || + if( (p_pic->p_sys->nb_display == 0) || (p_vout->p_sys->xvmc_deinterlace_method == 1) ) { - first_field = (p_picture->b_top_field_first) ? + first_field = (p_pic->b_top_field_first) ? XVMC_BOTTOM_FIELD : XVMC_TOP_FIELD; } else { - first_field = (p_picture->b_top_field_first) ? + first_field = (p_pic->b_top_field_first) ? XVMC_TOP_FIELD : XVMC_BOTTOM_FIELD; } } @@ -1027,10 +1033,10 @@ static void DisplayVideo( vout_thread_t *p_vout, picture_t *p_pic ) } XVMCLOCKDISPLAY( p_vout->p_sys->p_display ); - XvMCFlushSurface( p_vout->p_sys->p_display, p_picture->p_sys->xvmc_surf ); + XvMCFlushSurface( p_vout->p_sys->p_display, p_pic->p_sys->xvmc_surf ); /* XvMCSyncSurface(p_vout->p_sys->p_display, p_picture->p_sys->xvmc_surf); */ XvMCPutSurface( p_vout->p_sys->p_display, - p_picture->p_sys->xvmc_surf, + p_pic->p_sys->xvmc_surf, p_vout->p_sys->p_win->video_window, src_x, src_y, @@ -1045,29 +1051,29 @@ static void DisplayVideo( vout_thread_t *p_vout, picture_t *p_pic ) XVMCUNLOCKDISPLAY( p_vout->p_sys->p_display ); if( p_vout->p_sys->xvmc_deinterlace_method == 2 ) { /* BOB DEINTERLACE */ - if( p_picture->p_sys->nb_display == 0 )/* && ((t2-t1) < 15000)) */ + if( p_pic->p_sys->nb_display == 0 )/* && ((t2-t1) < 15000)) */ { - mtime_t last_date = p_picture->date; + mtime_t last_date = p_pic->date; vlc_mutex_lock( &p_vout->picture_lock ); if( !p_vout->p_sys->last_date ) { - p_picture->date += 20000; + p_pic->date += 20000; } else { - p_picture->date = ((3 * p_picture->date - + p_pic->date = ((3 * p_pic->date - p_vout->p_sys->last_date) / 2 ); } p_vout->p_sys->last_date = last_date; - p_picture->b_force = 1; - p_picture->p_sys->nb_display = 1; + p_pic->b_force = 1; + p_pic->p_sys->nb_display = 1; vlc_mutex_unlock( &p_vout->picture_lock ); } else { - p_picture->p_sys->nb_display = 0; - p_picture->b_force = 0; + p_pic->p_sys->nb_display = 0; + p_pic->b_force = 0; } } xvmc_context_reader_unlock( &p_vout->p_sys->xvmc_lock ); @@ -1430,6 +1436,22 @@ static int ManageVideo( vout_thread_t *p_vout ) if( ((XExposeEvent *)&xevent)->count == 0 ) { /* (if this is the last a collection of expose events...) */ + +#if defined(MODULE_NAME_IS_xvideo) + x11_window_t *p_win = p_vout->p_sys->p_win; + + /* Paint the colour key if needed */ + if( p_vout->p_sys->b_paint_colourkey && + xevent.xexpose.window == p_win->video_window ) + { + XSetForeground( p_vout->p_sys->p_display, + p_win->gc, p_vout->p_sys->i_colourkey ); + XFillRectangle( p_vout->p_sys->p_display, + p_win->video_window, p_win->gc, 0, 0, + p_win->i_width, p_win->i_height ); + } +#endif + #if 0 if( p_vout->p_libvlc->p_input_bank->pp_input[0] != NULL ) { @@ -1533,7 +1555,8 @@ static int ManageVideo( vout_thread_t *p_vout ) } /* Autohide Cursour */ - if( mdate() - p_vout->p_sys->i_time_mouse_last_moved > 2000000 ) + if( mdate() - p_vout->p_sys->i_time_mouse_last_moved > + p_vout->p_sys->i_mouse_hide_timeout ) { /* Hide the mouse automatically */ if( p_vout->p_sys->b_mouse_pointer_visible ) @@ -1618,8 +1641,9 @@ static int CreateWindow( vout_thread_t *p_vout, x11_window_t *p_win ) if( !p_vout->b_fullscreen ) { - p_win->owner_window = (Window)vout_RequestWindow( p_vout, &p_win->i_x, &p_win->i_y, - &p_win->i_width, &p_win->i_height ); + p_win->owner_window = (Window) + vout_RequestWindow( p_vout, &p_win->i_x, &p_win->i_y, + &p_win->i_width, &p_win->i_height ); xsize_hints.base_width = xsize_hints.width = p_win->i_width; xsize_hints.base_height = xsize_hints.height = p_win->i_height; @@ -1677,17 +1701,18 @@ static int CreateWindow( vout_thread_t *p_vout, x11_window_t *p_win ) XStoreName( p_vout->p_sys->p_display, p_win->base_window, val.psz_string ); } - if( val.psz_string ) free( val.psz_string ); + free( val.psz_string ); if( !p_vout->b_fullscreen ) { + const char *argv[] = { "vlc", NULL }; + /* Set window manager hints and properties: size hints, command, * window's name, and accepted protocols */ XSetWMNormalHints( p_vout->p_sys->p_display, p_win->base_window, &xsize_hints ); XSetCommand( p_vout->p_sys->p_display, p_win->base_window, - (char**)p_vout->p_libvlc->ppsz_argv, - p_vout->p_libvlc->i_argc ); + (char**)argv, 1 ); if( !var_GetBool( p_vout, "video-deco") ) { @@ -1901,7 +1926,7 @@ static int NewPicture( vout_thread_t *p_vout, picture_t *p_pic ) p_pic->p_sys->xvmc_surf = NULL; p_pic->p_sys->xxmc_data.decoded = 0; p_pic->p_sys->xxmc_data.proc_xxmc_update_frame = xxmc_do_update_frame; - p_pic->p_accel_data = &p_pic->p_sys->xxmc_data; + // p_pic->p_accel_data = &p_pic->p_sys->xxmc_data; p_pic->p_sys->nb_display = 0; #endif @@ -2546,6 +2571,7 @@ static int XVideoGetPort( vout_thread_t *p_vout, { XvAttribute *p_attr; int i_attr, i_num_attributes; + Atom autopaint = None, colorkey = None; /* If this is not the format we want, or at least a * similar one, forget it */ @@ -2582,7 +2608,8 @@ static int XVideoGetPort( vout_thread_t *p_vout, ( p_formats[ i_format ].format == XvPacked ) ? "packed" : "planar" ); - /* Make sure XV_AUTOPAINT_COLORKEY is set */ + /* Use XV_AUTOPAINT_COLORKEY if supported, otherwise we will + * manually paint the colour key */ p_attr = XvQueryPortAttributes( p_vout->p_sys->p_display, i_selected_port, &i_num_attributes ); @@ -2591,14 +2618,23 @@ static int XVideoGetPort( vout_thread_t *p_vout, { if( !strcmp( p_attr[i_attr].name, "XV_AUTOPAINT_COLORKEY" ) ) { - const Atom autopaint = - XInternAtom( p_vout->p_sys->p_display, - "XV_AUTOPAINT_COLORKEY", False ); + autopaint = XInternAtom( p_vout->p_sys->p_display, + "XV_AUTOPAINT_COLORKEY", False ); XvSetPortAttribute( p_vout->p_sys->p_display, i_selected_port, autopaint, 1 ); - break; + } + if( !strcmp( p_attr[i_attr].name, "XV_COLORKEY" ) ) + { + /* Find out the default colour key */ + colorkey = XInternAtom( p_vout->p_sys->p_display, + "XV_COLORKEY", False ); + XvGetPortAttribute( p_vout->p_sys->p_display, + i_selected_port, colorkey, + &p_vout->p_sys->i_colourkey ); } } + p_vout->p_sys->b_paint_colourkey = + autopaint == None && colorkey != None; if( p_attr != NULL ) { @@ -2666,9 +2702,6 @@ static int InitDisplay( vout_thread_t *p_vout ) if( config_GetInt( p_vout, MODULE_STRING "-shm" ) ) { -# ifdef __APPLE__ - /* FIXME: As of 2001-03-16, XFree4 for MacOS X does not support Xshm */ -# else int major, evt, err; if( XQueryExtension( p_vout->p_sys->p_display, "MIT-SHM", &major, @@ -2688,22 +2721,11 @@ static int InitDisplay( vout_thread_t *p_vout ) major, minor, pixmaps ? "" : "out", p_vout->p_sys->i_shm_opcode ); } - -# endif - - if( !p_vout->p_sys->i_shm_opcode ) - { - msg_Warn( p_vout, "XShm video extension is unavailable" ); - } + else + msg_Warn( p_vout, "XShm video extension not available" ); } else - { - msg_Dbg( p_vout, "disabling XShm video extension" ); - } - -#else - msg_Warn( p_vout, "XShm video extension is unavailable" ); - + msg_Dbg( p_vout, "XShm video extension disabled" ); #endif #ifdef MODULE_NAME_IS_xvideo @@ -2819,7 +2841,7 @@ static int InitDisplay( vout_thread_t *p_vout ) * document by J.Corbet and K.Packard. Most of the parameters were copied from * there. See http://ftp.xfree86.org/pub/XFree86/4.0/doc/mit-shm.TXT *****************************************************************************/ -static IMAGE_TYPE * CreateShmImage( vout_thread_t *p_vout, +IMAGE_TYPE * CreateShmImage( vout_thread_t *p_vout, Display* p_display, EXTRA_ARGS_SHM, int i_width, int i_height ) { @@ -3094,6 +3116,7 @@ static int Control( vout_thread_t *p_vout, int i_query, va_list args ) vlc_mutex_lock( &p_vout->p_sys->lock ); if( i_query == VOUT_REPARENT ) d = (Drawable)va_arg( args, int ); if( !d ) + { #ifdef MODULE_NAME_IS_xvmc xvmc_context_reader_lock( &p_vout->p_sys->xvmc_lock ); #endif @@ -3101,6 +3124,7 @@ static int Control( vout_thread_t *p_vout, int i_query, va_list args ) p_vout->p_sys->original_window.base_window, DefaultRootWindow( p_vout->p_sys->p_display ), 0, 0 ); + } else XReparentWindow( p_vout->p_sys->p_display, p_vout->p_sys->original_window.base_window, @@ -3118,7 +3142,7 @@ static int Control( vout_thread_t *p_vout, int i_query, va_list args ) return vout_ControlWindow( p_vout, (void *)p_vout->p_sys->p_win->owner_window, i_query, args); - b_arg = va_arg( args, vlc_bool_t ); + b_arg = (bool) va_arg( args, int ); vlc_mutex_lock( &p_vout->p_sys->lock ); #ifdef MODULE_NAME_IS_xvmc xvmc_context_reader_lock( &p_vout->p_sys->xvmc_lock );