X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fvideo_output%2Fvideo_output.c;h=d7a92f8e8d87bd0b4477aa1a8a1b729257894b7b;hb=6ee1e193fd896ab9a4729fde14f009d9ce629815;hp=7b763f13a3e4ebdb482dd65bb4922d166dbda561;hpb=15267bb4333428263003294f960623e63cb6da03;p=vlc diff --git a/src/video_output/video_output.c b/src/video_output/video_output.c index 7b763f13a3..d7a92f8e8d 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 @@ -53,6 +53,8 @@ * helpers */ #include "input/input_internal.h" +#include "modules/modules.h" + /***************************************************************************** * Local prototypes *****************************************************************************/ @@ -81,6 +83,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 *****************************************************************************/ @@ -203,6 +208,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 ); } } @@ -228,7 +235,6 @@ vout_thread_t * __vout_Create( vlc_object_t *p_parent, video_format_t *p_fmt ) vout_thread_t * p_vout; /* thread descriptor */ input_thread_t * p_input_thread; int i_index; /* loop variable */ - char * psz_plugin = NULL; vlc_value_t val, text; unsigned int i_width = p_fmt->i_width; @@ -352,12 +358,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; - 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 ); @@ -373,34 +382,22 @@ vout_thread_t * __vout_Create( vlc_object_t *p_parent, video_format_t *p_fmt ) { var_Create( p_vout, "vout", VLC_VAR_STRING | VLC_VAR_DOINHERIT ); var_Get( p_vout, "vout", &val ); - psz_plugin = val.psz_string; + psz_parser = val.psz_string; } -#if 0 else { - /* the filter chain is a string list of filters separated by double - * colons */ - char *psz_end; - - psz_end = strchr( p_vout->psz_filter_chain, ':' ); - if( psz_end ) - psz_plugin = strndup( p_vout->psz_filter_chain, - psz_end - p_vout->psz_filter_chain ); - else psz_plugin = strdup( p_vout->psz_filter_chain ); + psz_parser = strdup( p_vout->psz_filter_chain ); } -#endif /* Create the vout thread */ - psz_parser = p_vout->psz_filter_chain; - printf("psz_parser: %s\n", psz_parser ); - psz_parser = config_ChainCreate( &psz_name, &p_cfg, psz_parser ); - printf("psz_parser: %s\n", psz_parser ); + config_ChainCreate( &psz_name, &p_cfg, psz_parser ); + free( psz_parser ); 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 ); + free( psz_name ); - if( psz_plugin ) free( psz_plugin ); if( p_vout->p_module == NULL ) { msg_Err( p_vout, "no suitable vout module" ); @@ -435,7 +432,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 ); @@ -469,8 +465,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 ); @@ -495,7 +490,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" ); @@ -765,6 +760,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 @@ -983,7 +981,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 ) { @@ -1409,11 +1408,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; @@ -1448,10 +1448,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 ); } @@ -1468,6 +1464,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; @@ -1519,6 +1516,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 ); @@ -1605,6 +1603,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 ); @@ -1631,3 +1630,72 @@ 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; + + psz_string = malloc( strlen( psz_name ) + strlen( psz_artist ) ); + if( psz_string ) + { + sprintf( psz_string, "%s - %s", psz_name, psz_artist ); + + 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 ); + } +}