X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fvideo_output%2Fvideo_output.c;h=edb78f1ad0fd8b46e372c4390b7047f9501d607f;hb=4a19225407971ebbbd26840072d62ededc782d0e;hp=ae4a90fa87bf3bf827f28ec6c4fb2a1ea6ba0687;hpb=3b37b675e68032243656934c0b823d5910914eab;p=vlc diff --git a/src/video_output/video_output.c b/src/video_output/video_output.c index ae4a90fa87..edb78f1ad0 100644 --- a/src/video_output/video_output.c +++ b/src/video_output/video_output.c @@ -5,7 +5,7 @@ * It includes functions allowing to open a new thread, send pictures to a * thread, and destroy a previously oppened video output thread. ***************************************************************************** - * Copyright (C) 2000-2004 the VideoLAN team + * Copyright (C) 2000-2007 the VideoLAN team * $Id$ * * Authors: Vincent Seguin @@ -29,6 +29,10 @@ /***************************************************************************** * Preamble *****************************************************************************/ +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + #include #include /* free() */ @@ -53,6 +57,8 @@ * helpers */ #include "input/input_internal.h" +#include "modules/modules.h" + /***************************************************************************** * Local prototypes *****************************************************************************/ @@ -81,6 +87,9 @@ int vout_Snapshot( vout_thread_t *, picture_t * ); static int ParseVideoFilter2Chain( vout_thread_t *, char * ); static void RemoveVideoFilters2( vout_thread_t *p_vout ); +/* Display media title in OSD */ +static void DisplayTitleOnOSD( vout_thread_t *p_vout ); + /***************************************************************************** * Video Filter2 functions *****************************************************************************/ @@ -189,7 +198,6 @@ vout_thread_t *__vout_Request( vlc_object_t *p_this, vout_thread_t *p_vout, if( ( p_vout->fmt_render.i_width != p_fmt->i_width ) || ( p_vout->fmt_render.i_height != p_fmt->i_height ) || - ( p_vout->fmt_render.i_chroma != p_fmt->i_chroma ) || ( p_vout->fmt_render.i_aspect != p_fmt->i_aspect ) || p_vout->b_filter_change ) { @@ -203,6 +211,8 @@ vout_thread_t *__vout_Request( vlc_object_t *p_this, vout_thread_t *p_vout, /* This video output is cool! Hijack it. */ spu_Attach( p_vout->p_spu, p_this, VLC_TRUE ); vlc_object_attach( p_vout, p_this ); + if( p_vout->b_title_show ) + DisplayTitleOnOSD( p_vout ); vlc_object_release( p_vout ); } } @@ -351,13 +361,15 @@ vout_thread_t * __vout_Create( vlc_object_t *p_parent, video_format_t *p_fmt ) else { /* continue the parent's filter chain */ - char *psz_end; + char *psz_tmp; - /* FIXME: use config_ChainParse */ - psz_end = strchr( ((vout_thread_t *)p_parent)->psz_filter_chain, ':' ); - if( psz_end && *(psz_end+1) ) - p_vout->psz_filter_chain = strdup( psz_end+1 ); - else p_vout->psz_filter_chain = NULL; + /* Ugly hack to jump to our configuration chain */ + p_vout->psz_filter_chain + = ((vout_thread_t *)p_parent)->psz_filter_chain; + p_vout->psz_filter_chain + = config_ChainCreate( &psz_tmp, &p_cfg, p_vout->psz_filter_chain ); + config_ChainDestroy( p_cfg ); + free( psz_tmp ); /* Create a video filter2 var ... but don't inherit values */ var_Create( p_vout, "video-filter", VLC_VAR_STRING ); @@ -386,7 +398,8 @@ vout_thread_t * __vout_Create( vlc_object_t *p_parent, video_format_t *p_fmt ) p_vout->p_cfg = p_cfg; p_vout->p_module = module_Need( p_vout, ( p_vout->psz_filter_chain && *p_vout->psz_filter_chain ) ? - "video filter" : "video output", psz_name, 0 ); + "video filter" : "video output", psz_name, p_vout->psz_filter_chain && *p_vout->psz_filter_chain ); + free( psz_name ); if( p_vout->p_module == NULL ) { @@ -422,7 +435,6 @@ vout_thread_t * __vout_Create( vlc_object_t *p_parent, video_format_t *p_fmt ) } var_AddCallback( p_vout, "deinterlace", DeinterlaceCallback, NULL ); - var_Create( p_vout, "vout-filter", VLC_VAR_STRING | VLC_VAR_DOINHERIT ); text.psz_string = _("Filters"); var_Change( p_vout, "vout-filter", VLC_VAR_SETTEXT, &text, NULL ); @@ -456,8 +468,7 @@ vout_thread_t * __vout_Create( vlc_object_t *p_parent, video_format_t *p_fmt ) msg_Err( p_vout, "video output creation failed" ); /* Make sure the thread is destroyed */ - p_vout->b_die = VLC_TRUE; - + vlc_object_kill( p_vout ); vlc_thread_join( p_vout ); vlc_object_detach( p_vout ); @@ -482,7 +493,7 @@ void vout_Destroy( vout_thread_t *p_vout ) playlist_t *p_playlist = pl_Yield( p_vout ); /* Request thread destruction */ - p_vout->b_die = VLC_TRUE; + vlc_object_kill( p_vout ); vlc_thread_join( p_vout ); var_Destroy( p_vout, "intf-change" ); @@ -752,6 +763,9 @@ static void RunThread( vout_thread_t *p_vout) return; } + if( p_vout->b_title_show ) + DisplayTitleOnOSD( p_vout ); + /* * Main loop - it is not executed if an error occurred during * initialization @@ -970,7 +984,8 @@ static void RunThread( vout_thread_t *p_vout) p_vfilter->p_cfg = p_vout->p_vfilters_cfg[i]; p_vfilter->p_module = module_Need( p_vfilter, "video filter2", - p_vout->psz_vfilters[i], 0 ); + p_vout->psz_vfilters[i], + VLC_TRUE ); if( p_vfilter->p_module ) { @@ -1396,11 +1411,12 @@ static void MaskToShift( int *pi_left, int *pi_right, uint32_t i_mask ) * vout_VarCallback: generic callback for intf variables *****************************************************************************/ int vout_VarCallback( vlc_object_t * p_this, const char * psz_variable, - vlc_value_t old_value, vlc_value_t new_value, - void * unused ) + vlc_value_t oldval, vlc_value_t newval, + void *p_data ) { vout_thread_t * p_vout = (vout_thread_t *)p_this; vlc_value_t val; + (void)psz_variable; (void)newval; (void)oldval; (void)p_data; val.b_bool = VLC_TRUE; var_Set( p_vout, "intf-change", val ); return VLC_SUCCESS; @@ -1435,10 +1451,6 @@ static void SuxorRestartVideoES( suxor_thread_t *p_this ) vlc_object_release( p_this->p_input ); -#ifdef WIN32 - CloseHandle( p_this->thread_id ); -#endif - vlc_object_destroy( p_this ); } @@ -1455,6 +1467,7 @@ static int DeinterlaceCallback( vlc_object_t *p_this, char const *psz_cmd, char *psz_mode = newval.psz_string; char *psz_filter, *psz_deinterlace = NULL; + (void)psz_cmd; (void)oldval; (void)p_data; var_Get( p_vout, "vout-filter", &val ); psz_filter = val.psz_string; @@ -1506,6 +1519,7 @@ static int FilterCallback( vlc_object_t *p_this, char const *psz_cmd, vout_thread_t *p_vout = (vout_thread_t *)p_this; input_thread_t *p_input; vlc_value_t val; + (void)psz_cmd; (void)oldval; (void)p_data; p_input = (input_thread_t *)vlc_object_find( p_this, VLC_OBJECT_INPUT, FIND_PARENT ); @@ -1592,6 +1606,7 @@ static int VideoFilter2Callback( vlc_object_t *p_this, char const *psz_cmd, vlc_value_t oldval, vlc_value_t newval, void *p_data ) { vout_thread_t *p_vout = (vout_thread_t *)p_this; + (void)psz_cmd; (void)oldval; (void)p_data; vlc_mutex_lock( &p_vout->vfilter_lock ); ParseVideoFilter2Chain( p_vout, newval.psz_string ); @@ -1618,3 +1633,69 @@ static void RemoveVideoFilters2( vout_thread_t *p_vout ) } p_vout->i_vfilters = 0; } + +static void DisplayTitleOnOSD( vout_thread_t *p_vout ) +{ + input_thread_t *p_input; + mtime_t i_now, i_stop; + + p_input = (input_thread_t *)vlc_object_find( p_vout, + VLC_OBJECT_INPUT, FIND_ANYWHERE ); + if( p_input ) + { + i_now = mdate(); + i_stop = i_now + (mtime_t)(p_vout->i_title_timeout * 1000); + char *psz_nowplaying = + input_item_GetNowPlaying( input_GetItem( p_input ) ); + char *psz_artist = input_item_GetArtist( input_GetItem( p_input ) ); + char *psz_name = input_item_GetTitle( input_GetItem( p_input ) ); + if( EMPTY_STR( psz_name ) ) + { + free( psz_name ); + psz_name = input_item_GetName( input_GetItem( p_input ) ); + } + if( !EMPTY_STR( psz_nowplaying ) ) + { + vout_ShowTextAbsolute( p_vout, DEFAULT_CHAN, + psz_nowplaying, NULL, + p_vout->i_title_position, + 30 + p_vout->fmt_in.i_width + - p_vout->fmt_in.i_visible_width + - p_vout->fmt_in.i_x_offset, + 20 + p_vout->fmt_in.i_y_offset, + i_now, i_stop ); + } + else if( !EMPTY_STR( psz_artist ) ) + { + char *psz_string = NULL; + if( asprintf( &psz_string, "%s - %s", psz_name, psz_artist ) != -1 ) + { + vout_ShowTextAbsolute( p_vout, DEFAULT_CHAN, + psz_string, NULL, + p_vout->i_title_position, + 30 + p_vout->fmt_in.i_width + - p_vout->fmt_in.i_visible_width + - p_vout->fmt_in.i_x_offset, + 20 + p_vout->fmt_in.i_y_offset, + i_now, i_stop ); + free( psz_string ); + } + } + else + { + vout_ShowTextAbsolute( p_vout, DEFAULT_CHAN, + psz_name, NULL, + p_vout->i_title_position, + 30 + p_vout->fmt_in.i_width + - p_vout->fmt_in.i_visible_width + - p_vout->fmt_in.i_x_offset, + 20 + p_vout->fmt_in.i_y_offset, + i_now, i_stop ); + } + vlc_object_release( p_input ); + free( psz_artist ); + free( psz_name ); + free( psz_nowplaying ); + } +} +