]> git.sesse.net Git - vlc/blob - include/vlc_osd.h
84dd336a2e4feb4f25a7e181d6345752d17bb5f3
[vlc] / include / vlc_osd.h
1 /*****************************************************************************\r
2  * vlc_osd.h - OSD menu definitions and function prototypes\r
3  *****************************************************************************\r
4  * Copyright (C) 2004-2005 M2X\r
5  * $Id: vlc_osd.h 9451 2004-12-01 01:07:08Z jpsaman $\r
6  *\r
7  * Authors: Jean-Paul Saman <jpsaman #_at_# m2x dot nl>\r
8  *\r
9  * Added code from include/osd.h written by:\r
10  * Copyright (C) 2003-2005 the VideoLAN team\r
11  * Authors: Sigmund Augdal Helberg <dnumgis@videolan.org>\r
12  *\r
13  * This program is free software; you can redistribute it and/or modify\r
14  * it under the terms of the GNU General Public License as published by\r
15  * the Free Software Foundation; either version 2 of the License, or\r
16  * (at your option) any later version.\r
17  *\r
18  * This program is distributed in the hope that it will be useful,\r
19  * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
20  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
21  * GNU General Public License for more details.\r
22  *\r
23  * You should have received a copy of the GNU General Public License\r
24  * along with this program; if not, write to the Free Software\r
25  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.\r
26  *****************************************************************************/\r
27 \r
28 /**\r
29  * \file\r
30  * The OSD menu core creates the OSD menu structure in memory. It parses a \r
31  * configuration file that defines all elements that are part of the menu. The \r
32  * core also handles all actions and menu structure updates on behalf of video \r
33  * subpicture filters.\r
34  *\r
35  * The file modules/video_filters/osdmenu.c implements a subpicture filter that\r
36  * specifies the final information on positioning of the current state image. \r
37  * A subpicture filter is called each time a video picture has to be rendered, it\r
38  * also gives a start and end date to the subpicture. The subpicture can be streamed\r
39  * if used inside a transcoding command. For example:\r
40  *\r
41  *  vlc dvdsimple:///dev/dvd --extraintf rc\r
42  *  --sout='#transcode{osd}:std{access=udp,mux=ts,url=dest_ipaddr}'\r
43  *  --osdmenu-file=share/osdmenu/dvd.cfg\r
44  *\r
45  * Each OSD menu element, called "action", defines a hotkey action. Each action \r
46  * can have several states (unselect, select, pressed). Each state has an image \r
47  * that represents the state visually. The commands "menu right", "menu left", \r
48  * "menu up" and "menu down" are used to navigate through the OSD menu structure.\r
49  * The commands "menu on" or "menu show" and "menu off" or "menu hide" respectively\r
50  * show and hide the OSD menu subpictures.\r
51  *\r
52  * There is one special element called "range". A range is an arbritary range\r
53  * of state images that can be browsed using "menu up" and "menu down" commands\r
54  * on the rc interface. \r
55  *  \r
56  * The OSD menu configuration file uses a very simple syntax and basic parser. \r
57  * A configuration file has the ".cfg". An example is "share/osdmenu/dvd256.cfg".\r
58  */\r
59   \r
60 #ifndef _VLC_OSD_H\r
61 #define _VLC_OSD_H 1\r
62 \r
63 #include "vlc_video.h"\r
64 \r
65 # ifdef __cplusplus\r
66 extern "C" {\r
67 # endif\r
68 \r
69 /**\r
70  * \brief The OSD Menu configuration file format.\r
71  *\r
72  * The configuration file syntax is very basic and so is its parser. See the\r
73  * BNF formal representation below:\r
74  *\r
75  * The keywords FILENAME and PATHNAME represent the filename and pathname specification\r
76  * that is valid for the Operating System VLC is compiled for. \r
77  *\r
78  * The hotkey actions that are supported by VLC are documented in the file src/libvlc. The\r
79  * file include/vlc_keys.h defines some hotkey internals.\r
80  *\r
81  * CONFIG_FILE = FILENAME '.cfg'\r
82  * WS = [ ' ' | '\t' ]+\r
83  * OSDMEN_PATH = PATHNAME\r
84  * DIR = 'dir' WS OSDMENU_PATH '\n'\r
85  * STATE = [ 'unselect' | 'select' | 'pressed' ]\r
86  * HOTKEY_ACTION = 'key-' [ 'a' .. 'z', 'A' .. 'Z', '-' ]+\r
87  * \r
88  * ACTION_TYPE        = 'type' 'volume' '\n'\r
89  * ACTION_BLOCK_START = 'action' WS HOTKEY_ACTION WS '('POS','POS')' '\n'\r
90  * ACTION_BLOCK_END   = 'end' '\n'\r
91  * ACTION_STATE       = STATE WS FILENAME '\n'\r
92  * ACTION_RANGE_START = 'range' WS HOTKEY_ACTION WS DEFAULT_INDEX '\n'\r
93  * ACTION_RANGE_END   = 'end' '\n'\r
94  * ACTION_RANGE_STATE = FILENAME '\n'\r
95  *\r
96  * ACTION_BLOCK_RANGE = ACTION_RANGE_START [WS ACTION_RANGE_STATE]+ WS ACTION_RANGE_END\r
97  * ACTION_BLOCK = ACTION_BLOCK_START [WS ACTION_TYPE*] [ [WS ACTION_STATE]+3 | [WS ACTION_BLOCK_RANGE]+1 ] ACTION_BLOCK_END\r
98  * CONFIG_FILE_CONTENTS = DIR [ACTION_BLOCK]+\r
99  *\r
100  */ \r
101 \r
102 /**\r
103  * OSD menu position and picture type defines\r
104  */\r
105 \r
106 #define OSD_ALIGN_LEFT 0x1\r
107 #define OSD_ALIGN_RIGHT 0x2\r
108 #define OSD_ALIGN_TOP 0x4\r
109 #define OSD_ALIGN_BOTTOM 0x8\r
110 \r
111 #define OSD_HOR_SLIDER 1\r
112 #define OSD_VERT_SLIDER 2\r
113 \r
114 #define OSD_PLAY_ICON 1\r
115 #define OSD_PAUSE_ICON 2\r
116 #define OSD_SPEAKER_ICON 3\r
117 #define OSD_MUTE_ICON 4\r
118 \r
119 /**\r
120  * Text style information.\r
121  * This struct is currently ignored\r
122  */\r
123 struct text_style_t\r
124 {\r
125     int i_size;\r
126     uint32_t i_color;\r
127     vlc_bool_t b_italic;\r
128     vlc_bool_t b_bold;\r
129     vlc_bool_t b_underline;\r
130 };\r
131 static const text_style_t default_text_style = { 22, 0xffffff, VLC_FALSE, VLC_FALSE, VLC_FALSE };\r
132  \r
133 /**\r
134  * OSD menu button states\r
135  *\r
136  * Every button has three states, either it is unselected, selected or pressed.\r
137  * An OSD menu skin can associate images with each state.\r
138  *\r
139  *  OSD_BUTTON_UNSELECT 0\r
140  *  OSD_BUTTON_SELECT   1\r
141  *  OSD_BUTTON_PRESSED  2\r
142  */\r
143 #define OSD_BUTTON_UNSELECT 0\r
144 #define OSD_BUTTON_SELECT   1\r
145 #define OSD_BUTTON_PRESSED  2\r
146 \r
147 /**\r
148  * OSD State object\r
149  *\r
150  * The OSD state object holds the state and associated images for a particular state\r
151  * on the screen. The picture is displayed when this state is the active state.\r
152  */\r
153 struct osd_state_t\r
154 {\r
155     osd_state_t *p_next;    /*< pointer to next state */\r
156     osd_state_t *p_prev;    /*< pointer to previous state */\r
157     picture_t   *p_pic;     /*< picture of state */\r
158     \r
159     char        *psz_state; /*< state name */\r
160     int          i_state;   /*< state index */ \r
161 };\r
162 \r
163 /** \r
164  * OSD Button object\r
165  *\r
166  * An OSD Button has different states. Each state has an image for display. \r
167  */\r
168 struct osd_button_t\r
169 {\r
170     osd_button_t *p_next;   /*< pointer to next button */\r
171     osd_button_t *p_prev;   /*< pointer to previous button */\r
172     osd_button_t *p_up;     /*< pointer to up button */\r
173     osd_button_t *p_down;   /*< pointer to down button */\r
174     \r
175     osd_state_t *p_current_state; /*< pointer to current state image */\r
176     osd_state_t *p_states; /*< doubly linked list of states */\r
177     picture_t   *p_feedback; /*< feedback picture */\r
178         \r
179     char    *psz_name;     /*< name of button */\r
180     \r
181     /* These member should probably be a struct hotkey */\r
182     char    *psz_action;      /*< hotkey action name on button*/\r
183     char    *psz_action_down; /*< hotkey action name on range buttons for command "menu down" */\r
184     /* end of hotkey specifics */\r
185     \r
186     int     i_x;            /*< x-position of button visible state image */\r
187     int     i_y;            /*< y-position of button visible state image */ \r
188     \r
189     /* range style button */    \r
190     vlc_bool_t   b_range;    /*< button should be interpreted as range */\r
191     int          i_ranges;   /*< number of states */\r
192 };\r
193 \r
194 /** \r
195  * OSD Menu State object\r
196  *\r
197  * Represents the current state as displayed. \r
198  */\r
199 /* Represent the menu state */\r
200 struct osd_menu_state_t\r
201 {\r
202     int     i_x;        /*< x position of spu region */\r
203     int     i_y;        /*< y position of spu region */\r
204     int     i_width;    /*< width of spu region */\r
205     int     i_height;   /*< height of spu region */    \r
206     \r
207     picture_t    *p_pic;  /*< pointer to picture to display */\r
208     osd_button_t *p_visible; /*< shortcut to visible button */\r
209     \r
210     vlc_bool_t b_menu_visible; /*< menu currently visible? */\r
211     vlc_bool_t b_update;       /*< update OSD Menu when VLC_TRUE */\r
212     \r
213     /* quick hack to volume state. */\r
214     osd_button_t *p_volume; /*< pointer to volume range object. */\r
215 };\r
216 \r
217 /**\r
218  * OSD Menu object\r
219  *\r
220  * The main OSD Menu object, which holds a linked list to all buttons\r
221  * and images that defines the menu. The p_state variable represents the\r
222  * current state of the OSD Menu.\r
223  */\r
224 struct osd_menu_t\r
225 {\r
226     VLC_COMMON_MEMBERS\r
227     \r
228     int     i_x;        /*< x-position of OSD Menu on the video screen */ \r
229     int     i_y;        /*< y-position of OSD Menu on the video screen */ \r
230     int     i_width;    /*< width of OSD Menu on the video screen */ \r
231     int     i_height;   /*< height of OSD Menu on the video screen */ \r
232     \r
233     char             *psz_path;  /*< directory where OSD menu images are stored */\r
234     osd_button_t     *p_button;  /*< doubly linked list of buttons */\r
235     osd_menu_state_t *p_state;   /*< current state of OSD menu */\r
236         \r
237     /* quick link in the linked list. */\r
238     osd_button_t  *p_last_button; /*< pointer to last button in the list */\r
239 };\r
240 \r
241 /**\r
242  * Initialize an osd_menu_t object\r
243  *\r
244  * This functions has to be called before any call to other osd_menu_t* functions.\r
245  * It creates the osd_menu object and holds a pointer to it during its lifetime.\r
246  */\r
247 VLC_EXPORT( osd_menu_t *, __osd_MenuCreate, ( vlc_object_t *, const char * ) );\r
248 \r
249 /**\r
250  * Delete the osd_menu_t object\r
251  *\r
252  * This functions has to be called to release the associated module and memory\r
253  * for the osdmenu. After return of this function the pointer to osd_menu_t* is invalid.\r
254  */\r
255 VLC_EXPORT( void, __osd_MenuDelete, ( vlc_object_t *, osd_menu_t * ) );\r
256 \r
257 /**\r
258  * Change state on an osd_button_t.\r
259  *\r
260  * This function selects the specified state and returns a pointer to it. The \r
261  * following states are currently supported: \r
262  * \see OSD_BUTTON_UNSELECT\r
263  * \see OSD_BUTTON_SELECT   \r
264  * \see OSD_BUTTON_PRESSED  \r
265  */\r
266 VLC_EXPORT( osd_state_t *, __osd_StateChange, ( osd_state_t *, const int ) );\r
267 \r
268 #define osd_MenuCreate(object,file) __osd_MenuCreate( VLC_OBJECT(object), file )\r
269 #define osd_MenuDelete(object,osd)  __osd_MenuDelete( VLC_OBJECT(object), osd )\r
270 #define osd_StateChange(object,value) __osd_StateChange( object, value )\r
271 \r
272 /**\r
273  * Show the OSD menu.\r
274  *\r
275  * Show the OSD menu on the video output or mux it into the stream. \r
276  * Every change to the OSD menu will now be visible in the output. An output \r
277  * can be a video output window or a stream (\see stream output)\r
278  */\r
279 VLC_EXPORT( void, __osd_MenuShow, ( vlc_object_t * ) ); \r
280 \r
281 /**\r
282  * Hide the OSD menu.\r
283  *\r
284  * Stop showing the OSD menu on the video output or mux it into the stream.\r
285  */\r
286 VLC_EXPORT( void, __osd_MenuHide, ( vlc_object_t * ) );\r
287 \r
288 /**\r
289  * Activate the action of this OSD menu item.\r
290  *\r
291  * The rc interface command "menu select" triggers the sending of an hotkey action\r
292  * to the hotkey interface. The hotkey that belongs to the current highlighted \r
293  * OSD menu item will be used.\r
294  */\r
295 VLC_EXPORT( void, __osd_MenuActivate,   ( vlc_object_t * ) );\r
296 \r
297 #define osd_MenuShow(object) __osd_MenuShow( VLC_OBJECT(object) )\r
298 #define osd_MenuHide(object) __osd_MenuHide( VLC_OBJECT(object) )\r
299 #define osd_MenuActivate(object)   __osd_MenuActivate( VLC_OBJECT(object) )\r
300 \r
301 /**\r
302  * Next OSD menu item\r
303  *\r
304  * Select the next OSD menu item to be highlighted.\r
305  * Note: The actual position on screen of the menu item is determined by the the\r
306  * OSD menu configuration file.\r
307  */\r
308 VLC_EXPORT( void, __osd_MenuNext, ( vlc_object_t * ) ); \r
309 \r
310 /**\r
311  * Previous OSD menu item\r
312  *\r
313  * Select the previous OSD menu item to be highlighted.\r
314  * Note: The actual position on screen of the menu item is determined by the the\r
315  * OSD menu configuration file.\r
316  */\r
317 VLC_EXPORT( void, __osd_MenuPrev, ( vlc_object_t * ) );\r
318 \r
319 /**\r
320  * OSD menu item above\r
321  *\r
322  * Select the OSD menu item above the current item to be highlighted. \r
323  * Note: The actual position on screen of the menu item is determined by the the\r
324  * OSD menu configuration file.\r
325  */\r
326 VLC_EXPORT( void, __osd_MenuUp,   ( vlc_object_t * ) );\r
327 \r
328 /**\r
329  * OSD menu item below\r
330  *\r
331  * Select the next OSD menu item below the current item to be highlighted.\r
332  * Note: The actual position on screen of the menu item is determined by the the\r
333  * OSD menu configuration file.\r
334  */\r
335 VLC_EXPORT( void, __osd_MenuDown, ( vlc_object_t * ) );\r
336 \r
337 #define osd_MenuNext(object) __osd_MenuNext( VLC_OBJECT(object) )\r
338 #define osd_MenuPrev(object) __osd_MenuPrev( VLC_OBJECT(object) )\r
339 #define osd_MenuUp(object)   __osd_MenuUp( VLC_OBJECT(object) )\r
340 #define osd_MenuDown(object) __osd_MenuDown( VLC_OBJECT(object) )\r
341 \r
342 /**\r
343  * Display the audio volume bitmap.\r
344  *\r
345  * Display the correct audio volume bitmap that corresponds to the\r
346  * current Audio Volume setting.\r
347  */\r
348 VLC_EXPORT( void, __osd_Volume, ( vlc_object_t * ) );\r
349 \r
350 #define osd_Volume(object)     __osd_Volume( VLC_OBJECT(object) )\r
351 \r
352 /**\r
353  * Retrieve a non modifyable pointer to the OSD Menu state\r
354  *\r
355  */\r
356 static inline const osd_menu_state_t *osd_GetMenuState( osd_menu_t *p_osd )\r
357 {\r
358     return( p_osd->p_state );\r
359 }\r
360 \r
361 /**\r
362  * Get the last key press received by the OSD Menu\r
363  *\r
364  * Returns 0 when no key has been pressed or the value of the key pressed.\r
365  */\r
366 static inline vlc_bool_t osd_GetKeyPressed( osd_menu_t *p_osd )\r
367 {\r
368     return( p_osd->p_state->b_update );\r
369 }       \r
370 \r
371 /**\r
372  * Set the key pressed to a value.\r
373  *\r
374  * Assign a new key value to the last key pressed on the OSD Menu.\r
375  */\r
376 static inline void osd_SetKeyPressed( vlc_object_t *p_this, int i_value )\r
377 {\r
378     vlc_value_t val;\r
379     \r
380     val.i_int = i_value;    \r
381     var_Set( p_this, "key-pressed", val );            \r
382 }\r
383 \r
384 /**\r
385  * Update the OSD Menu visibility flag.\r
386  *\r
387  * VLC_TRUE means OSD Menu should be shown. VLC_FALSE means OSD Menu should not be shown.\r
388  */\r
389 static inline void osd_SetMenuVisible( osd_menu_t *p_osd, vlc_bool_t b_value )\r
390 {\r
391     vlc_value_t val;\r
392     \r
393     val.b_bool = p_osd->p_state->b_menu_visible = b_value; \r
394     var_Set( p_osd, "osd-menu-visible", val );\r
395 }\r
396 \r
397 /**\r
398  * Update the OSD Menu update flag\r
399  *\r
400  * If the OSD Menu should be updated then set the update flag to VLC_TRUE, else to VLC_FALSE.\r
401  */\r
402 static inline void osd_SetMenuUpdate( osd_menu_t *p_osd, vlc_bool_t b_value )\r
403 {\r
404     vlc_value_t val;\r
405 \r
406     val.b_bool = p_osd->p_state->b_update = b_value;\r
407     var_Set( p_osd, "osd-menu-update", val );\r
408\r
409 \r
410 /**\r
411  * Textual feedback\r
412  *\r
413  * Functions that provide the textual feedback on the OSD. They are shown on hotkey commands. The feedback\r
414  * is also part of the osd_button_t object. The types are declared in the include file\r
415  * include/vlc_osd.h\r
416  * @see vlc_osd.h \r
417  */\r
418 VLC_EXPORT( int, osd_ShowTextRelative, ( spu_t *, int, char *, text_style_t *, int, int, int, mtime_t ) );\r
419 VLC_EXPORT( int, osd_ShowTextAbsolute, ( spu_t *, int, char *, text_style_t *, int, int, int, mtime_t, mtime_t ) );\r
420 VLC_EXPORT( void,osd_Message, ( spu_t *, int, char *, ... ) );\r
421 \r
422 /**\r
423  * Default feedback images\r
424  *\r
425  * Functions that provide the default OSD feedback images on hotkey commands. These feedback\r
426  * images are also part of the osd_button_t object. The types are declared in the include file\r
427  * include/vlc_osd.h\r
428  * @see vlc_osd.h \r
429  */\r
430 VLC_EXPORT( int, osd_Slider, ( vlc_object_t *, spu_t *, int, int, int, int, short ) );\r
431 VLC_EXPORT( int, osd_Icon, ( vlc_object_t *, spu_t *, int, int, int, short ) );\r
432 \r
433 /**\r
434  * Loading and parse the OSD Configuration file\r
435  *\r
436  * These functions load/unload the OSD menu configuration file and create/destroy the\r
437  * themable OSD menu structure on the OSD object.\r
438  */\r
439 VLC_EXPORT( int,  osd_ConfigLoader, ( vlc_object_t *, const char *, osd_menu_t ** ) );\r
440 VLC_EXPORT( void, osd_ConfigUnload, ( vlc_object_t *, osd_menu_t ** ) );\r
441 \r
442 # ifdef __cplusplus\r
443 }\r
444 # endif\r
445 \r
446 #endif /* _VLC_OSD_H */\r