[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