]> git.sesse.net Git - vlc/blob - include/vlc_subpicture.h
Simplify the creation of subpicture with dynamic content.
[vlc] / include / vlc_subpicture.h
1 /*****************************************************************************
2  * vlc_subpicture.h: subpicture definitions
3  *****************************************************************************
4  * Copyright (C) 1999 - 2009 the VideoLAN team
5  * $Id$
6  *
7  * Authors: Vincent Seguin <seguin@via.ecp.fr>
8  *          Samuel Hocevar <sam@via.ecp.fr>
9  *          Olivier Aubert <oaubert 47 videolan d07 org>
10  *
11  * This program is free software; you can redistribute it and/or modify
12  * it under the terms of the GNU General Public License as published by
13  * the Free Software Foundation; either version 2 of the License, or
14  * (at your option) any later version.
15  *
16  * This program is distributed in the hope that it will be useful,
17  * but WITHOUT ANY WARRANTY; without even the implied warranty of
18  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19  * GNU General Public License for more details.
20  *
21  * You should have received a copy of the GNU General Public License
22  * along with this program; if not, write to the Free Software
23  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
24  *****************************************************************************/
25
26 #ifndef VLC_SUBPICTURE_H
27 #define VLC_SUBPICTURE_H 1
28
29 /**
30  * \file
31  * This file defines subpicture structures and functions in vlc
32  */
33
34 #include <vlc_picture.h>
35
36 /**
37  * \defgroup subpicture Video Subpictures
38  * Subpictures are pictures that should be displayed on top of the video, like
39  * subtitles and OSD
40  * \ingroup video_output
41  * @{
42  */
43
44 /**
45  * Video subtitle region spu core private
46  */
47 typedef struct subpicture_region_private_t subpicture_region_private_t;
48
49 /**
50  * Video subtitle region
51  *
52  * A subtitle region is defined by a picture (graphic) and its rendering
53  * coordinates.
54  * Subtitles contain a list of regions.
55  */
56 struct subpicture_region_t
57 {
58     video_format_t  fmt;                          /**< format of the picture */
59     picture_t       *p_picture;          /**< picture comprising this region */
60
61     int             i_x;                             /**< position of region */
62     int             i_y;                             /**< position of region */
63     int             i_align;                  /**< alignment within a region */
64     int             i_alpha;                               /**< transparency */
65
66     char            *psz_text;       /**< text string comprising this region */
67     char            *psz_html;       /**< HTML version of subtitle (NULL = use psz_text) */
68     text_style_t    *p_style;        /**< a description of the text style formatting */
69
70     subpicture_region_t *p_next;                /**< next region in the list */
71     subpicture_region_private_t *p_private;  /**< Private data for spu_t *only* */
72 };
73
74 /* Subpicture region position flags */
75 #define SUBPICTURE_ALIGN_LEFT 0x1
76 #define SUBPICTURE_ALIGN_RIGHT 0x2
77 #define SUBPICTURE_ALIGN_TOP 0x4
78 #define SUBPICTURE_ALIGN_BOTTOM 0x8
79 #define SUBPICTURE_ALIGN_MASK ( SUBPICTURE_ALIGN_LEFT|SUBPICTURE_ALIGN_RIGHT| \
80                                 SUBPICTURE_ALIGN_TOP |SUBPICTURE_ALIGN_BOTTOM )
81
82 /**
83  * This function will create a new subpicture region.
84  *
85  * You must use subpicture_region_Delete to destroy it.
86  */
87 VLC_EXPORT( subpicture_region_t *, subpicture_region_New, ( const video_format_t *p_fmt ) );
88
89 /**
90  * This function will destroy a subpicture region allocated by
91  * subpicture_region_New.
92  *
93  * You may give it NULL.
94  */
95 VLC_EXPORT( void, subpicture_region_Delete, ( subpicture_region_t *p_region ) );
96
97 /**
98  * This function will destroy a list of subpicture regions allocated by
99  * subpicture_region_New.
100  *
101  * Provided for convenience.
102  */
103 VLC_EXPORT( void, subpicture_region_ChainDelete, ( subpicture_region_t *p_head ) );
104
105 /**
106  *
107  */
108 typedef struct subpicture_updater_sys_t subpicture_updater_sys_t;
109 typedef struct
110 {
111     int  (*pf_validate)( subpicture_t *,
112                          bool has_src_changed, const video_format_t *p_fmt_src,
113                          bool has_dst_changed, const video_format_t *p_fmt_dst,
114                          mtime_t);
115     void (*pf_update)  ( subpicture_t *,
116                          const video_format_t *p_fmt_src,
117                          const video_format_t *p_fmt_dst,
118                          mtime_t );
119     void (*pf_destroy) ( subpicture_t * );
120     subpicture_updater_sys_t *p_sys;
121 } subpicture_updater_t;
122
123 typedef struct subpicture_private_t subpicture_private_t;
124
125 /**
126  * Video subtitle
127  *
128  * Any subtitle destined to be displayed by a video output thread should
129  * be stored in this structure from it's creation to it's effective display.
130  * Subtitle type and flags should only be modified by the output thread. Note
131  * that an empty subtitle MUST have its flags set to 0.
132  */
133 struct subpicture_t
134 {
135     /** \name Channel ID */
136     /**@{*/
137     int             i_channel;                    /**< subpicture channel ID */
138     /**@}*/
139
140     /** \name Type and flags
141        Should NOT be modified except by the vout thread */
142     /**@{*/
143     int64_t         i_order;                 /** an increasing unique number */
144     subpicture_t *  p_next;               /**< next subtitle to be displayed */
145     /**@}*/
146
147     subpicture_region_t *p_region;  /**< region list composing this subtitle */
148
149     /** \name Date properties */
150     /**@{*/
151     mtime_t         i_start;                  /**< beginning of display date */
152     mtime_t         i_stop;                         /**< end of display date */
153     bool            b_ephemer;    /**< If this flag is set to true the subtitle
154                                 will be displayed untill the next one appear */
155     bool            b_fade;                               /**< enable fading */
156     /**@}*/
157
158     /** \name Display properties
159      * These properties are only indicative and may be
160      * changed by the video output thread, or simply ignored depending of the
161      * subtitle type. */
162     /**@{*/
163     bool         b_subtitle;            /**< the picture is a movie subtitle */
164     bool         b_absolute;                       /**< position is absolute */
165     int          i_original_picture_width;  /**< original width of the movie */
166     int          i_original_picture_height;/**< original height of the movie */
167     int          i_alpha;                                  /**< transparency */
168      /**@}*/
169
170     subpicture_updater_t updater;
171
172     subpicture_private_t *p_private;    /* Reserved to the core */
173 };
174
175 /**
176  * This function create a new empty subpicture.
177  *
178  * You must use subpicture_Delete to destroy it.
179  */
180 VLC_EXPORT( subpicture_t *, subpicture_New, ( const subpicture_updater_t * ) );
181
182 /**
183  * This function delete a subpicture created by subpicture_New.
184  * You may give it NULL.
185  */
186 VLC_EXPORT( void,  subpicture_Delete, ( subpicture_t *p_subpic ) );
187
188 /**
189  * This function will create a subpicture having one region in the requested
190  * chroma showing the given picture.
191  *
192  * The picture_t given is not released nor used inside the
193  * returned subpicture_t.
194  */
195 VLC_EXPORT( subpicture_t *, subpicture_NewFromPicture, ( vlc_object_t *, picture_t *, vlc_fourcc_t i_chroma ) );
196
197 /**@}*/
198
199 #endif /* _VLC_VIDEO_H */