1 /*****************************************************************************
2 * video_text.c : text manipulation functions
3 *****************************************************************************
4 * Copyright (C) 1999-2007 the VideoLAN team
7 * Author: Sigmund Augdal Helberg <dnumgis@videolan.org>
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version.
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
22 *****************************************************************************/
28 #include <vlc_common.h>
30 #include <vlc_block.h>
31 #include <vlc_filter.h>
35 * \brief Show text on the video for some time
36 * \param p_vout pointer to the vout the text is to be showed on
37 * \param i_channel Subpicture channel
38 * \param psz_string The text to be shown
39 * \param p_style Pointer to a struct with text style info (it is duplicated if non NULL)
40 * \param i_flags flags for alignment and such
41 * \param i_hmargin horizontal margin in pixels
42 * \param i_vmargin vertical margin in pixels
43 * \param i_duration Amount of time the text is to be shown.
45 int vout_ShowTextRelative( vout_thread_t
*p_vout
, int i_channel
,
46 char *psz_string
, const text_style_t
*p_style
,
47 int i_flags
, int i_hmargin
, int i_vmargin
,
50 mtime_t i_now
= mdate();
52 return vout_ShowTextAbsolute( p_vout
, i_channel
, psz_string
,
53 p_style
, i_flags
, i_hmargin
, i_vmargin
,
54 i_now
, i_now
+ i_duration
);
58 * \brief Show text on the video from a given start date to a given end date
59 * \param p_vout pointer to the vout the text is to be showed on
60 * \param i_channel Subpicture channel
61 * \param psz_string The text to be shown
62 * \param p_style Pointer to a struct with text style info (it is duplicated if non NULL)
63 * \param i_flags flags for alignment and such
64 * \param i_hmargin horizontal margin in pixels
65 * \param i_vmargin vertical margin in pixels
66 * \param i_start the time when this string is to appear on the video
67 * \param i_stop the time when this string should stop to be displayed
68 * if this is 0 the string will be shown untill the next string
69 * is about to be shown
71 int vout_ShowTextAbsolute( vout_thread_t
*p_vout
, int i_channel
,
72 const char *psz_string
, const text_style_t
*p_style
,
73 int i_flags
, int i_hmargin
, int i_vmargin
,
74 mtime_t i_start
, mtime_t i_stop
)
79 if( !psz_string
) return VLC_EGENERIC
;
81 p_spu
= subpicture_New();
85 p_spu
->i_channel
= i_channel
;
86 p_spu
->i_start
= i_start
;
87 p_spu
->i_stop
= i_stop
;
88 p_spu
->b_ephemer
= true;
89 p_spu
->b_absolute
= false;
93 /* Create a new subpicture region */
94 memset( &fmt
, 0, sizeof(video_format_t
) );
95 fmt
.i_chroma
= VLC_CODEC_TEXT
;
96 fmt
.i_width
= fmt
.i_height
= 0;
97 fmt
.i_x_offset
= fmt
.i_y_offset
= 0;
98 p_spu
->p_region
= subpicture_region_New( &fmt
);
99 if( !p_spu
->p_region
)
101 msg_Err( p_vout
, "cannot allocate SPU region" );
102 subpicture_Delete( p_spu
);
106 p_spu
->p_region
->psz_text
= strdup( psz_string
);
107 p_spu
->p_region
->i_align
= i_flags
& SUBPICTURE_ALIGN_MASK
;
108 p_spu
->p_region
->i_x
= i_hmargin
;
109 p_spu
->p_region
->i_y
= i_vmargin
;
111 p_spu
->p_region
->p_style
= text_style_Duplicate( p_style
);
113 spu_DisplaySubpicture( p_vout
->p_spu
, p_spu
);
120 * \brief Write an informative message at the default location,
121 * for the default duration and only if the OSD option is enabled.
122 * \param p_caller The object that called the function.
123 * \param i_channel Subpicture channel
124 * \param psz_format printf style formatting
126 void __vout_OSDMessage( vlc_object_t
*p_caller
, int i_channel
,
127 const char *psz_format
, ... )
129 vout_thread_t
*p_vout
;
130 char *psz_string
= NULL
;
133 if( !var_InheritBool( p_caller
, "osd" ) ) return;
135 p_vout
= vlc_object_find( p_caller
, VLC_OBJECT_VOUT
, FIND_ANYWHERE
);
138 va_start( args
, psz_format
);
139 if( vasprintf( &psz_string
, psz_format
, args
) != -1 )
141 vout_ShowTextRelative( p_vout
, i_channel
, psz_string
, NULL
,
142 OSD_ALIGN_TOP
|OSD_ALIGN_RIGHT
,
143 30 + p_vout
->fmt_in
.i_width
144 - p_vout
->fmt_in
.i_visible_width
145 - p_vout
->fmt_in
.i_x_offset
,
146 20 + p_vout
->fmt_in
.i_y_offset
, 1000000 );
149 vlc_object_release( p_vout
);
155 text_style_t
*text_style_New( void )
157 text_style_t
*p_style
= calloc( 1, sizeof(*p_style
) );
161 /* initialize to default text style */
162 p_style
->psz_fontname
= NULL
;
163 p_style
->i_font_size
= 22;
164 p_style
->i_font_color
= 0xffffff;
165 p_style
->i_font_alpha
= 0xff;
166 p_style
->i_style_flags
= STYLE_OUTLINE
;
167 p_style
->i_outline_color
= 0x000000;
168 p_style
->i_outline_alpha
= 0xff;
169 p_style
->i_shadow_color
= 0x000000;
170 p_style
->i_shadow_alpha
= 0xff;
171 p_style
->i_background_color
= 0xffffff;
172 p_style
->i_background_alpha
= 0x80;
173 p_style
->i_karaoke_background_color
= 0xffffff;
174 p_style
->i_karaoke_background_alpha
= 0xff;
175 p_style
->i_outline_width
= 1;
176 p_style
->i_shadow_width
= 0;
177 p_style
->i_spacing
= -1;
182 text_style_t
*text_style_Copy( text_style_t
*p_dst
, const text_style_t
*p_src
)
188 if( p_dst
->psz_fontname
)
189 free( p_dst
->psz_fontname
);
195 if( p_dst
->psz_fontname
)
196 p_dst
->psz_fontname
= strdup( p_dst
->psz_fontname
);
201 text_style_t
*text_style_Duplicate( const text_style_t
*p_src
)
206 text_style_t
*p_dst
= calloc( 1, sizeof(*p_dst
) );
208 text_style_Copy( p_dst
, p_src
);
212 void text_style_Delete( text_style_t
*p_style
)
215 free( p_style
->psz_fontname
);