[vlc-devel] commit: Improved osd title display in vout. (Laurent Aimar )
git version control
git at videolan.org
Mon Jan 5 21:26:47 CET 2009
vlc | branch: master | Laurent Aimar <fenrir at videolan.org> | Sun Jan 4 11:39:24 2009 +0100| [b2fa8fea83dd007cb7612c93fb7f698035a462c8] | committer: Laurent Aimar
Improved osd title display in vout.
It fixes title display with vout recycling.
It removes one vlc_object_find.
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=b2fa8fea83dd007cb7612c93fb7f698035a462c8
---
src/input/ressource.c | 44 ++++++++++++++++
src/video_output/video_output.c | 101 ++++++++++++--------------------------
src/video_output/vout_control.h | 5 ++
src/video_output/vout_internal.h | 2 +
src/video_output/vout_intf.c | 1 +
5 files changed, 83 insertions(+), 70 deletions(-)
diff --git a/src/input/ressource.c b/src/input/ressource.c
index d7b8e06..147a2c5 100644
--- a/src/input/ressource.c
+++ b/src/input/ressource.c
@@ -35,6 +35,7 @@
#include "../libvlc.h"
#include "../stream_output/stream_output.h"
#include "../audio_output/aout_internal.h"
+#include "../video_output/vout_control.h"
#include "input_interface.h"
#include "ressource.h"
@@ -121,6 +122,48 @@ static void DestroyVout( input_ressource_t *p_ressource )
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,
vout_thread_t *p_vout, video_format_t *p_fmt )
{
@@ -157,6 +200,7 @@ static vout_thread_t *RequestVout( input_ressource_t *p_ressource,
if( !p_vout )
return NULL;
+ DisplayVoutTitle( p_ressource, p_vout );
TAB_APPEND( p_ressource->i_vout, p_ressource->pp_vout, p_vout );
return p_vout;
}
diff --git a/src/video_output/video_output.c b/src/video_output/video_output.c
index 42bfa90..34e6c2a 100644
--- a/src/video_output/video_output.c
+++ b/src/video_output/video_output.c
@@ -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,
video_format_t *p_fmt )
{
- const bool b_vout_provided = p_vout != NULL;
if( !p_fmt )
{
/* 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,
vlc_object_detach( p_vout );
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 )
vlc_mutex_destroy( &p_vout->p->vfilter_lock );
free( p_vout->p->psz_filter_chain );
+ free( p_vout->p->psz_title );
config_ChainDestroy( p_vout->p_cfg );
@@ -744,6 +739,18 @@ void vout_NextPicture( vout_thread_t *p_vout, mtime_t *pi_duration )
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
@@ -977,9 +984,6 @@ static void* RunThread( vlc_object_t *p_this )
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
* initialization
@@ -994,6 +998,9 @@ static void* RunThread( vlc_object_t *p_this )
picture_t *p_directbuffer;
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 );
/* 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,
static void DisplayTitleOnOSD( vout_thread_t *p_vout )
{
- input_thread_t *p_input;
- mtime_t i_now, i_stop;
+ const mtime_t i_start = mdate();
+ 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,
- VLC_OBJECT_INPUT, FIND_ANYWHERE );
- if( p_input )
- {
- i_now = mdate();
- i_stop = i_now + (mtime_t)(p_vout->p->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->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 );
- }
+ vout_ShowTextAbsolute( p_vout, DEFAULT_CHAN,
+ p_vout->p->psz_title, 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_start, i_stop );
+
+ free( p_vout->p->psz_title );
+
+ p_vout->p->psz_title = NULL;
}
diff --git a/src/video_output/vout_control.h b/src/video_output/vout_control.h
index ab899ec..d44b06d 100644
--- a/src/video_output/vout_control.h
+++ b/src/video_output/vout_control.h
@@ -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 );
+/**
+ * This function will ask the display of the input title
+ */
+void vout_DisplayTitle( vout_thread_t *p_vout, const char *psz_title );
+
#endif
diff --git a/src/video_output/vout_internal.h b/src/video_output/vout_internal.h
index 0cf1767..376b8a2 100644
--- a/src/video_output/vout_internal.h
+++ b/src/video_output/vout_internal.h
@@ -86,6 +86,8 @@ struct vout_thread_sys_t
bool b_title_show;
mtime_t i_title_timeout;
int i_title_position;
+
+ char *psz_title;
};
/* DO NOT use vout_RenderPicture unless you are in src/video_ouput */
diff --git a/src/video_output/vout_intf.c b/src/video_output/vout_intf.c
index 78e5649..897a35e 100644
--- a/src/video_output/vout_intf.c
+++ b/src/video_output/vout_intf.c
@@ -264,6 +264,7 @@ void vout_IntfInit( vout_thread_t *p_vout )
(mtime_t)var_CreateGetInteger( p_vout, "video-title-timeout" );
p_vout->p->i_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-timeout", TitleTimeoutCallback, NULL );
More information about the vlc-devel
mailing list