Commit b2fa8fea authored by Laurent Aimar's avatar Laurent Aimar

Improved osd title display in vout.

It fixes title display with vout recycling.
It removes one vlc_object_find.
parent 0780928c
...@@ -35,6 +35,7 @@ ...@@ -35,6 +35,7 @@
#include "../libvlc.h" #include "../libvlc.h"
#include "../stream_output/stream_output.h" #include "../stream_output/stream_output.h"
#include "../audio_output/aout_internal.h" #include "../audio_output/aout_internal.h"
#include "../video_output/vout_control.h"
#include "input_interface.h" #include "input_interface.h"
#include "ressource.h" #include "ressource.h"
...@@ -121,6 +122,48 @@ static void DestroyVout( input_ressource_t *p_ressource ) ...@@ -121,6 +122,48 @@ static void DestroyVout( input_ressource_t *p_ressource )
p_ressource->p_vout_free = NULL; p_ressource->p_vout_free = NULL;
} }
static void DisplayVoutTitle( input_ressource_t *p_ressource,
vout_thread_t *p_vout )
{
assert( p_ressource->p_input );
/* TODO display the title only one time for the same input ? */
input_item_t *p_item = input_GetItem( p_ressource->p_input );
char *psz_nowplaying = input_item_GetNowPlaying( p_item );
if( psz_nowplaying && *psz_nowplaying )
{
vout_DisplayTitle( p_vout, psz_nowplaying );
}
else
{
char *psz_artist = input_item_GetArtist( p_item );
char *psz_name = input_item_GetTitle( p_item );
if( !psz_name || *psz_name == '\0' )
{
free( psz_name );
psz_name = input_item_GetName( p_item );
}
if( psz_artist && *psz_artist )
{
char *psz_string;
if( asprintf( &psz_string, "%s - %s", psz_name, psz_artist ) != -1 )
{
vout_DisplayTitle( p_vout, psz_string );
free( psz_string );
}
}
else if( psz_name )
{
vout_DisplayTitle( p_vout, psz_name );
}
free( psz_name );
free( psz_artist );
}
free( psz_nowplaying );
}
static vout_thread_t *RequestVout( input_ressource_t *p_ressource, static vout_thread_t *RequestVout( input_ressource_t *p_ressource,
vout_thread_t *p_vout, video_format_t *p_fmt ) vout_thread_t *p_vout, video_format_t *p_fmt )
{ {
...@@ -157,6 +200,7 @@ static vout_thread_t *RequestVout( input_ressource_t *p_ressource, ...@@ -157,6 +200,7 @@ static vout_thread_t *RequestVout( input_ressource_t *p_ressource,
if( !p_vout ) if( !p_vout )
return NULL; return NULL;
DisplayVoutTitle( p_ressource, p_vout );
TAB_APPEND( p_ressource->i_vout, p_ressource->pp_vout, p_vout ); TAB_APPEND( p_ressource->i_vout, p_ressource->pp_vout, p_vout );
return p_vout; return p_vout;
} }
......
...@@ -153,7 +153,6 @@ static int video_filter_buffer_allocation_init( filter_t *p_filter, void *p_data ...@@ -153,7 +153,6 @@ static int video_filter_buffer_allocation_init( filter_t *p_filter, void *p_data
vout_thread_t *__vout_Request( vlc_object_t *p_this, vout_thread_t *p_vout, vout_thread_t *__vout_Request( vlc_object_t *p_this, vout_thread_t *p_vout,
video_format_t *p_fmt ) video_format_t *p_fmt )
{ {
const bool b_vout_provided = p_vout != NULL;
if( !p_fmt ) if( !p_fmt )
{ {
/* Video output is no longer used. /* Video output is no longer used.
...@@ -273,11 +272,6 @@ vout_thread_t *__vout_Request( vlc_object_t *p_this, vout_thread_t *p_vout, ...@@ -273,11 +272,6 @@ vout_thread_t *__vout_Request( vlc_object_t *p_this, vout_thread_t *p_vout,
vlc_object_detach( p_vout ); vlc_object_detach( p_vout );
vlc_object_attach( p_vout, p_this ); vlc_object_attach( p_vout, p_this );
/* Display title if we are not using the vout given to vout_Request.
* XXX for now b_vout_provided is always true at this stage */
if( p_vout->p->b_title_show && !b_vout_provided )
DisplayTitleOnOSD( p_vout );
} }
} }
...@@ -579,6 +573,7 @@ static void vout_Destructor( vlc_object_t * p_this ) ...@@ -579,6 +573,7 @@ static void vout_Destructor( vlc_object_t * p_this )
vlc_mutex_destroy( &p_vout->p->vfilter_lock ); vlc_mutex_destroy( &p_vout->p->vfilter_lock );
free( p_vout->p->psz_filter_chain ); free( p_vout->p->psz_filter_chain );
free( p_vout->p->psz_title );
config_ChainDestroy( p_vout->p_cfg ); config_ChainDestroy( p_vout->p_cfg );
...@@ -744,6 +739,18 @@ void vout_NextPicture( vout_thread_t *p_vout, mtime_t *pi_duration ) ...@@ -744,6 +739,18 @@ void vout_NextPicture( vout_thread_t *p_vout, mtime_t *pi_duration )
vlc_mutex_unlock( &p_vout->picture_lock ); vlc_mutex_unlock( &p_vout->picture_lock );
} }
void vout_DisplayTitle( vout_thread_t *p_vout, const char *psz_title )
{
assert( psz_title );
if( !config_GetInt( p_vout, "osd" ) )
return;
vlc_object_lock( p_vout );
free( p_vout->p->psz_title );
p_vout->p->psz_title = strdup( psz_title );
vlc_object_unlock( p_vout );
}
/***************************************************************************** /*****************************************************************************
* InitThread: initialize video output thread * InitThread: initialize video output thread
...@@ -977,9 +984,6 @@ static void* RunThread( vlc_object_t *p_this ) ...@@ -977,9 +984,6 @@ static void* RunThread( vlc_object_t *p_this )
vlc_object_lock( p_vout ); vlc_object_lock( p_vout );
if( p_vout->p->b_title_show )
DisplayTitleOnOSD( p_vout );
/* /*
* Main loop - it is not executed if an error occurred during * Main loop - it is not executed if an error occurred during
* initialization * initialization
...@@ -994,6 +998,9 @@ static void* RunThread( vlc_object_t *p_this ) ...@@ -994,6 +998,9 @@ static void* RunThread( vlc_object_t *p_this )
picture_t *p_directbuffer; picture_t *p_directbuffer;
int i_index; int i_index;
if( p_vout->p->b_title_show && p_vout->p->psz_title )
DisplayTitleOnOSD( p_vout );
vlc_mutex_lock( &p_vout->picture_lock ); vlc_mutex_lock( &p_vout->picture_lock );
/* Look for the earliest picture but after the last displayed one */ /* Look for the earliest picture but after the last displayed one */
...@@ -1693,68 +1700,22 @@ static int VideoFilter2Callback( vlc_object_t *p_this, char const *psz_cmd, ...@@ -1693,68 +1700,22 @@ static int VideoFilter2Callback( vlc_object_t *p_this, char const *psz_cmd,
static void DisplayTitleOnOSD( vout_thread_t *p_vout ) static void DisplayTitleOnOSD( vout_thread_t *p_vout )
{ {
input_thread_t *p_input; const mtime_t i_start = mdate();
mtime_t i_now, i_stop; const mtime_t i_stop = i_start + INT64_C(1000) * p_vout->p->i_title_timeout;
if( !config_GetInt( p_vout, "osd" ) ) return; vlc_object_assert_locked( p_vout );
p_input = (input_thread_t *)vlc_object_find( p_vout, vout_ShowTextAbsolute( p_vout, DEFAULT_CHAN,
VLC_OBJECT_INPUT, FIND_ANYWHERE ); p_vout->p->psz_title, NULL,
if( p_input ) p_vout->p->i_title_position,
{ 30 + p_vout->fmt_in.i_width
i_now = mdate(); - p_vout->fmt_in.i_visible_width
i_stop = i_now + (mtime_t)(p_vout->p->i_title_timeout * 1000); - p_vout->fmt_in.i_x_offset,
char *psz_nowplaying = 20 + p_vout->fmt_in.i_y_offset,
input_item_GetNowPlaying( input_GetItem( p_input ) ); i_start, i_stop );
char *psz_artist = input_item_GetArtist( input_GetItem( p_input ) );
char *psz_name = input_item_GetTitle( input_GetItem( p_input ) ); free( p_vout->p->psz_title );
if( EMPTY_STR( psz_name ) )
{ p_vout->p->psz_title = NULL;
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->p->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->p->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->p->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 );
}
} }
...@@ -73,5 +73,10 @@ void vout_DropPicture( vout_thread_t *p_vout, picture_t * ); ...@@ -73,5 +73,10 @@ void vout_DropPicture( vout_thread_t *p_vout, picture_t * );
*/ */
void vout_NextPicture( vout_thread_t *p_vout, mtime_t *pi_duration ); void vout_NextPicture( vout_thread_t *p_vout, mtime_t *pi_duration );
/**
* This function will ask the display of the input title
*/
void vout_DisplayTitle( vout_thread_t *p_vout, const char *psz_title );
#endif #endif
...@@ -86,6 +86,8 @@ struct vout_thread_sys_t ...@@ -86,6 +86,8 @@ struct vout_thread_sys_t
bool b_title_show; bool b_title_show;
mtime_t i_title_timeout; mtime_t i_title_timeout;
int i_title_position; int i_title_position;
char *psz_title;
}; };
/* DO NOT use vout_RenderPicture unless you are in src/video_ouput */ /* DO NOT use vout_RenderPicture unless you are in src/video_ouput */
......
...@@ -264,6 +264,7 @@ void vout_IntfInit( vout_thread_t *p_vout ) ...@@ -264,6 +264,7 @@ void vout_IntfInit( vout_thread_t *p_vout )
(mtime_t)var_CreateGetInteger( p_vout, "video-title-timeout" ); (mtime_t)var_CreateGetInteger( p_vout, "video-title-timeout" );
p_vout->p->i_title_position = p_vout->p->i_title_position =
var_CreateGetInteger( p_vout, "video-title-position" ); var_CreateGetInteger( p_vout, "video-title-position" );
p_vout->p->psz_title = NULL;
var_AddCallback( p_vout, "video-title-show", TitleShowCallback, NULL ); var_AddCallback( p_vout, "video-title-show", TitleShowCallback, NULL );
var_AddCallback( p_vout, "video-title-timeout", TitleTimeoutCallback, NULL ); var_AddCallback( p_vout, "video-title-timeout", TitleTimeoutCallback, NULL );
......
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