X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fvideo_output%2Fvideo_text.c;h=26c8465519d08e0542077bac987499b6167c9019;hb=0a520894c4451459a1e93426a1042e88be5db0cc;hp=e34cc4c51c582848d0d072aaa6f574828e290c46;hpb=2ad9f25dbb5f38ad09a54b2586f1e58e7fd1b36a;p=vlc diff --git a/src/video_output/video_text.c b/src/video_output/video_text.c index e34cc4c51c..26c8465519 100644 --- a/src/video_output/video_text.c +++ b/src/video_output/video_text.c @@ -1,10 +1,10 @@ /***************************************************************************** * video_text.c : text manipulation functions ***************************************************************************** - * Copyright (C) 1999-2004 VideoLAN - * $Id: video_text.c,v 1.51 2004/02/15 18:22:26 sigmunau Exp $ + * Copyright (C) 1999-2007 the VideoLAN team + * $Id$ * - * Author: Sigmund Augdal + * Author: Sigmund Augdal Helberg * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -18,14 +18,23 @@ * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA. + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ -#include -#include + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include +#include +#include +#include /** * \brief Show text on the video for some time * \param p_vout pointer to the vout the text is to be showed on + * \param i_channel Subpicture channel * \param psz_string The text to be shown * \param p_style Pointer to a struct with text style info * \param i_flags flags for alignment and such @@ -33,30 +42,22 @@ * \param i_vmargin vertical margin in pixels * \param i_duration Amount of time the text is to be shown. */ -subpicture_t *vout_ShowTextRelative( vout_thread_t *p_vout, char *psz_string, - text_style_t *p_style, int i_flags, - int i_hmargin, int i_vmargin, - mtime_t i_duration ) +int vout_ShowTextRelative( vout_thread_t *p_vout, int i_channel, + char *psz_string, text_style_t *p_style, + int i_flags, int i_hmargin, int i_vmargin, + mtime_t i_duration ) { - subpicture_t *p_subpic = NULL; mtime_t i_now = mdate(); - if ( p_vout->pf_add_string ) - { - p_subpic = p_vout->pf_add_string( p_vout, psz_string, p_style, i_flags, - i_hmargin, i_vmargin, i_now, i_now + i_duration ); - } - else - { - msg_Warn( p_vout, "No text renderer found" ); - } - - return p_subpic; + return vout_ShowTextAbsolute( p_vout, i_channel, psz_string, + p_style, i_flags, i_hmargin, i_vmargin, + i_now, i_now + i_duration ); } /** * \brief Show text on the video from a given start date to a given end date * \param p_vout pointer to the vout the text is to be showed on + * \param i_channel Subpicture channel * \param psz_string The text to be shown * \param p_style Pointer to a struct with text style info * \param i_flags flags for alignment and such @@ -67,20 +68,50 @@ subpicture_t *vout_ShowTextRelative( vout_thread_t *p_vout, char *psz_string, * if this is 0 the string will be shown untill the next string * is about to be shown */ -void vout_ShowTextAbsolute( vout_thread_t *p_vout, char *psz_string, - text_style_t *p_style, int i_flags, - int i_hmargin, int i_vmargin, mtime_t i_start, - mtime_t i_stop ) +int vout_ShowTextAbsolute( vout_thread_t *p_vout, int i_channel, + const char *psz_string, text_style_t *p_style, + int i_flags, int i_hmargin, int i_vmargin, + mtime_t i_start, mtime_t i_stop ) { - if ( p_vout->pf_add_string ) - { - p_vout->pf_add_string( p_vout, psz_string, p_style, i_flags, i_hmargin, - i_vmargin, i_start, i_stop ); - } - else + subpicture_t *p_spu; + video_format_t fmt; + (void)p_style; // FIXME: <-- why ask for this if it's unused?!? + + if( !psz_string ) return VLC_EGENERIC; + + p_spu = spu_CreateSubpicture( p_vout->p_spu ); + if( !p_spu ) return VLC_EGENERIC; + + /* Create a new subpicture region */ + memset( &fmt, 0, sizeof(video_format_t) ); + fmt.i_chroma = VLC_FOURCC('T','E','X','T'); + fmt.i_aspect = 0; + fmt.i_width = fmt.i_height = 0; + fmt.i_x_offset = fmt.i_y_offset = 0; + p_spu->p_region = p_spu->pf_create_region( VLC_OBJECT(p_vout), &fmt ); + if( !p_spu->p_region ) { - msg_Warn( p_vout, "No text renderer found" ); + msg_Err( p_vout, "cannot allocate SPU region" ); + spu_DestroySubpicture( p_vout->p_spu, p_spu ); + return VLC_EGENERIC; } + + p_spu->p_region->psz_text = strdup( psz_string ); + p_spu->p_region->i_align = i_flags & SUBPICTURE_ALIGN_MASK; + p_spu->i_start = i_start; + p_spu->i_stop = i_stop; + p_spu->b_ephemer = VLC_TRUE; + p_spu->b_absolute = VLC_FALSE; + p_spu->b_fade = VLC_TRUE; + + p_spu->i_x = i_hmargin; + p_spu->i_y = i_vmargin; + p_spu->i_flags = i_flags & ~SUBPICTURE_ALIGN_MASK; + p_spu->i_channel = i_channel; + + spu_DisplaySubpicture( p_vout->p_spu, p_spu ); + + return VLC_SUCCESS; } @@ -88,9 +119,11 @@ void vout_ShowTextAbsolute( vout_thread_t *p_vout, char *psz_string, * \brief Write an informative message at the default location, * for the default duration and only if the OSD option is enabled. * \param p_caller The object that called the function. - * \param psz_string The text to be shown + * \param i_channel Subpicture channel + * \param psz_format printf style formatting **/ -void __vout_OSDMessage( vlc_object_t *p_caller, char *psz_format, ... ) +void __vout_OSDMessage( vlc_object_t *p_caller, int i_channel, + const char *psz_format, ... ) { vout_thread_t *p_vout; char *psz_string; @@ -99,26 +132,20 @@ void __vout_OSDMessage( vlc_object_t *p_caller, char *psz_format, ... ) if( !config_GetInt( p_caller, "osd" ) ) return; p_vout = vlc_object_find( p_caller, VLC_OBJECT_VOUT, FIND_ANYWHERE ); - if( p_vout ) { va_start( args, psz_format ); vasprintf( &psz_string, psz_format, args ); - vlc_mutex_lock( &p_vout->change_lock ); - - if( p_vout->p_last_osd_message ) - { - vout_DestroySubPicture( p_vout, p_vout->p_last_osd_message ); - } - p_vout->p_last_osd_message = vout_ShowTextRelative( p_vout, psz_string, - NULL, OSD_ALIGN_TOP|OSD_ALIGN_RIGHT, 30,20,1000000 ); - - vlc_mutex_unlock( &p_vout->change_lock ); + vout_ShowTextRelative( p_vout, i_channel, psz_string, NULL, + OSD_ALIGN_TOP|OSD_ALIGN_RIGHT, + 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, 1000000 ); vlc_object_release( p_vout ); free( psz_string ); va_end( args ); } } -