vlc_osd.h 24.2 KB
Newer Older
hartman's avatar
hartman committed
1
/*****************************************************************************
zorglub's avatar
zorglub committed
2
 * vlc_osd.h - OSD menu and subpictures definitions and function prototypes
hartman's avatar
hartman committed
3
 *****************************************************************************
Rafaël Carré's avatar
typo  
Rafaël Carré committed
4
 * Copyright (C) 1999-2006 the VideoLAN team
hartman's avatar
hartman committed
5 6 7 8
 * Copyright (C) 2004-2005 M2X
 * $Id$
 *
 * Authors: Jean-Paul Saman <jpsaman #_at_# m2x dot nl>
zorglub's avatar
zorglub committed
9
 *          Gildas Bazin <gbazin@videolan.org>
hartman's avatar
hartman committed
10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
 *
 * Added code from include/osd.h written by:
 * Copyright (C) 2003-2005 the VideoLAN team
 * Authors: Sigmund Augdal Helberg <dnumgis@videolan.org>
 *
 * 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
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * 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., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
 *****************************************************************************/

zorglub's avatar
zorglub committed
30 31 32 33 34 35 36 37 38 39 40 41
#ifndef _VLC_OSD_H
#define _VLC_OSD_H 1

#include "vlc_vout.h"

# ifdef __cplusplus
extern "C" {
# endif

/**********************************************************************
 * Base SPU structures
 **********************************************************************/
hartman's avatar
hartman committed
42
/**
zorglub's avatar
zorglub committed
43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
 * \defgroup spu Subpicture Unit
 * This module describes the programming interface for the subpicture unit.
 * It includes functions allowing to create/destroy an spu, create/destroy
 * subpictures and render them.
 * @{
 */

#include <vlc_vout.h>

/**
 * Subpicture unit descriptor
 */
struct spu_t
{
    VLC_COMMON_MEMBERS

    vlc_mutex_t  subpicture_lock;                  /**< subpicture heap lock */
    subpicture_t p_subpicture[VOUT_MAX_SUBPICTURES];        /**< subpictures */
    int i_channel;             /**< number of subpicture channels registered */

    filter_t *p_blend;                            /**< alpha blending module */
    filter_t *p_text;                              /**< text renderer module */
65 66 67
    filter_t *p_scale_yuvp;                     /**< scaling module for YUVP */
    filter_t *p_scale;                    /**< scaling module (all but YUVP) */
    bool b_force_crop;                     /**< force cropping of subpicture */
zorglub's avatar
zorglub committed
68 69 70
    int i_crop_x, i_crop_y, i_crop_width, i_crop_height;       /**< cropping */

    int i_margin;                        /**< force position of a subpicture */
71
    bool b_force_palette;             /**< force palette of subpicture */
zorglub's avatar
zorglub committed
72 73 74 75 76
    uint8_t palette[4][4];                               /**< forced palette */

    int ( *pf_control ) ( spu_t *, int, va_list );

    /* Supciture filters */
dionoea's avatar
dionoea committed
77
    filter_chain_t *p_chain;
zorglub's avatar
zorglub committed
78 79 80 81 82 83 84 85 86
};

static inline int spu_vaControl( spu_t *p_spu, int i_query, va_list args )
{
    if( p_spu->pf_control )
        return p_spu->pf_control( p_spu, i_query, args );
    else
        return VLC_EGENERIC;
}
87

zorglub's avatar
zorglub committed
88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108
static inline int spu_Control( spu_t *p_spu, int i_query, ... )
{
    va_list args;
    int i_result;

    va_start( args, i_query );
    i_result = spu_vaControl( p_spu, i_query, args );
    va_end( args );
    return i_result;
}

enum spu_query_e
{
    SPU_CHANNEL_REGISTER,         /* arg1= int *   res=    */
    SPU_CHANNEL_CLEAR             /* arg1= int     res=    */
};

#define spu_Create(a) __spu_Create(VLC_OBJECT(a))
VLC_EXPORT( spu_t *, __spu_Create, ( vlc_object_t * ) );
VLC_EXPORT( int, spu_Init, ( spu_t * ) );
VLC_EXPORT( void, spu_Destroy, ( spu_t * ) );
109
void spu_Attach( spu_t *, vlc_object_t *, bool );
zorglub's avatar
zorglub committed
110 111 112 113 114 115 116 117 118 119 120

VLC_EXPORT( subpicture_t *, spu_CreateSubpicture, ( spu_t * ) );
VLC_EXPORT( void, spu_DestroySubpicture, ( spu_t *, subpicture_t * ) );
VLC_EXPORT( void, spu_DisplaySubpicture, ( spu_t *, subpicture_t * ) );

#define spu_CreateRegion(a,b) __spu_CreateRegion(VLC_OBJECT(a),b)
VLC_EXPORT( subpicture_region_t *,__spu_CreateRegion, ( vlc_object_t *, video_format_t * ) );
#define spu_MakeRegion(a,b,c) __spu_MakeRegion(VLC_OBJECT(a),b,c)
VLC_EXPORT( subpicture_region_t *,__spu_MakeRegion, ( vlc_object_t *, video_format_t *, picture_t * ) );
#define spu_DestroyRegion(a,b) __spu_DestroyRegion(VLC_OBJECT(a),b)
VLC_EXPORT( void, __spu_DestroyRegion, ( vlc_object_t *, subpicture_region_t * ) );
121
VLC_EXPORT( subpicture_t *, spu_SortSubpictures, ( spu_t *, mtime_t, bool ) );
zorglub's avatar
zorglub committed
122 123 124 125 126 127 128 129 130
VLC_EXPORT( void, spu_RenderSubpictures, ( spu_t *,  video_format_t *, picture_t *, picture_t *, subpicture_t *, int, int ) );

/** @}*/

/**********************************************************************
 * OSD Menu
 **********************************************************************/
/**
 * \defgroup osdmenu OSD Menu
hartman's avatar
hartman committed
131 132 133 134 135 136 137
 * The OSD menu core creates the OSD menu structure in memory. It parses a
 * configuration file that defines all elements that are part of the menu. The
 * core also handles all actions and menu structure updates on behalf of video
 * subpicture filters.
 *
 * The file modules/video_filters/osdmenu.c implements a subpicture filter that
 * specifies the final information on positioning of the current state image.
zorglub's avatar
zorglub committed
138 139 140
 * A subpicture filter is called each time a video picture has to be rendered,
 * it also gives a start and end date to the subpicture. The subpicture can be
 * streamed if used inside a transcoding command. For example:
hartman's avatar
hartman committed
141 142
 *
 *  vlc dvdsimple:///dev/dvd --extraintf rc
dionoea's avatar
dionoea committed
143
 *  --sout='#transcode{osd}:std{access=udp,mux=ts,dst=dest_ipaddr}'
hartman's avatar
hartman committed
144 145
 *  --osdmenu-file=share/osdmenu/dvd.cfg
 *
Jean-Paul Saman's avatar
Jean-Paul Saman committed
146 147 148 149 150 151
 * An example for local usage of the OSD menu is:
 *
 *  vlc dvdsimple:///dev/dvd --extraintf rc
 *  --sub-filter osdmenu
 *  --osdmenu-file=share/osdmenu/dvd.cfg
 *
hartman's avatar
hartman committed
152 153 154 155 156 157 158 159 160 161 162 163
 * Each OSD menu element, called "action", defines a hotkey action. Each action
 * can have several states (unselect, select, pressed). Each state has an image
 * that represents the state visually. The commands "menu right", "menu left",
 * "menu up" and "menu down" are used to navigate through the OSD menu structure.
 * The commands "menu on" or "menu show" and "menu off" or "menu hide" respectively
 * show and hide the OSD menu subpictures.
 *
 * There is one special element called "range". A range is an arbritary range
 * of state images that can be browsed using "menu up" and "menu down" commands
 * on the rc interface.
 *
 * The OSD menu configuration file uses a very simple syntax and basic parser.
zorglub's avatar
zorglub committed
164 165 166
 * A configuration file has the ".cfg".
 * An example is "share/osdmenu/dvd256.cfg".
 * @{
hartman's avatar
hartman committed
167 168 169 170 171 172 173 174
 */

/**
 * \brief The OSD Menu configuration file format.
 *
 * The configuration file syntax is very basic and so is its parser. See the
 * BNF formal representation below:
 *
175 176
 * The keywords FILENAME and PATHNAME represent the filename and pathname
 * specification that is valid for the Operating System VLC is compiled for.
hartman's avatar
hartman committed
177
 *
178 179
 * The hotkey actions that are supported by VLC are documented in the file
 * src/libvlc. The file include/vlc_keys.h defines some hotkey internals.
hartman's avatar
hartman committed
180 181 182
 *
 * CONFIG_FILE = FILENAME '.cfg'
 * WS = [ ' ' | '\t' ]+
Jean-Paul Saman's avatar
Jean-Paul Saman committed
183
 * OSDMENU_PATH = PATHNAME
hartman's avatar
hartman committed
184
 * DIR = 'dir' WS OSDMENU_PATH '\n'
Jean-Paul Saman's avatar
Jean-Paul Saman committed
185
 * STYLE = 'style' [ 'default' | 'concat' ] '\n'
hartman's avatar
hartman committed
186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220
 * STATE = [ 'unselect' | 'select' | 'pressed' ]
 * HOTKEY_ACTION = 'key-' [ 'a' .. 'z', 'A' .. 'Z', '-' ]+
 *
 * ACTION_TYPE        = 'type' 'volume' '\n'
 * ACTION_BLOCK_START = 'action' WS HOTKEY_ACTION WS '('POS','POS')' '\n'
 * ACTION_BLOCK_END   = 'end' '\n'
 * ACTION_STATE       = STATE WS FILENAME '\n'
 * ACTION_RANGE_START = 'range' WS HOTKEY_ACTION WS DEFAULT_INDEX '\n'
 * ACTION_RANGE_END   = 'end' '\n'
 * ACTION_RANGE_STATE = FILENAME '\n'
 *
 * ACTION_BLOCK_RANGE = ACTION_RANGE_START [WS ACTION_RANGE_STATE]+ WS ACTION_RANGE_END
 * ACTION_BLOCK = ACTION_BLOCK_START [WS ACTION_TYPE*] [ [WS ACTION_STATE]+3 | [WS ACTION_BLOCK_RANGE]+1 ] ACTION_BLOCK_END
 * CONFIG_FILE_CONTENTS = DIR [ACTION_BLOCK]+
 *
 */

/**
 * OSD menu position and picture type defines
 */

#define OSD_ALIGN_LEFT 0x1
#define OSD_ALIGN_RIGHT 0x2
#define OSD_ALIGN_TOP 0x4
#define OSD_ALIGN_BOTTOM 0x8

#define OSD_HOR_SLIDER 1
#define OSD_VERT_SLIDER 2

#define OSD_PLAY_ICON 1
#define OSD_PAUSE_ICON 2
#define OSD_SPEAKER_ICON 3
#define OSD_MUTE_ICON 4

/**
hartman's avatar
hartman committed
221 222 223
 * Text style
 *
 * A text style is used to specify the formatting of text.
224 225
 * A font renderer can use the supplied information to render the
 * text specified.
hartman's avatar
hartman committed
226 227 228
 */
struct text_style_t
{
229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248
    char *     psz_fontname;      /**< The name of the font */
    int        i_font_size;       /**< The font size in pixels */
    int        i_font_color;      /**< The color of the text 0xRRGGBB
                                       (native endianness) */
    int        i_font_alpha;      /**< The transparency of the text.
                                       0x00 is fully opaque,
                                       0xFF fully transparent */
    int        i_style_flags;     /**< Formatting style flags */
    int        i_outline_color;   /**< The color of the outline 0xRRGGBB */
    int        i_outline_alpha;   /**< The transparency of the outline.
                                       0x00 is fully opaque,
                                       0xFF fully transparent */
    int        i_shadow_color;    /**< The color of the shadow 0xRRGGBB */
    int        i_shadow_alpha;    /**< The transparency of the shadow.
                                        0x00 is fully opaque,
                                        0xFF fully transparent */
    int        i_background_color;/**< The color of the background 0xRRGGBB */
    int        i_background_alpha;/**< The transparency of the background.
                                       0x00 is fully opaque,
                                       0xFF fully transparent */
249 250 251 252
    int        i_karaoke_background_color;/**< Background color for karaoke 0xRRGGBB */
    int        i_karaoke_background_alpha;/**< The transparency of the karaoke bg.
                                       0x00 is fully opaque,
                                       0xFF fully transparent */
253 254 255
    int        i_outline_width;   /**< The width of the outline in pixels */
    int        i_shadow_width;    /**< The width of the shadow in pixels */
    int        i_spacing;         /**< The spaceing between glyphs in pixels */
hartman's avatar
hartman committed
256
};
hartman's avatar
hartman committed
257 258 259 260 261 262 263 264 265 266 267

/* Style flags for \ref text_style_t */
#define STYLE_BOLD        1
#define STYLE_ITALIC      2
#define STYLE_OUTLINE     4
#define STYLE_SHADOW      8
#define STYLE_BACKGROUND  16
#define STYLE_UNDERLINE   32
#define STYLE_STRIKEOUT   64

static const text_style_t default_text_style = { NULL, 22, 0xffffff, 0xff, STYLE_OUTLINE,
268
                0x000000, 0xff, 0x000000, 0xff, 0xffffff, 0x80, 0xffffff, 0xff, 1, 0, -1 };
hartman's avatar
hartman committed
269

hartman's avatar
hartman committed
270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286
/**
 * OSD menu button states
 *
 * Every button has three states, either it is unselected, selected or pressed.
 * An OSD menu skin can associate images with each state.
 *
 *  OSD_BUTTON_UNSELECT 0
 *  OSD_BUTTON_SELECT   1
 *  OSD_BUTTON_PRESSED  2
 */
#define OSD_BUTTON_UNSELECT 0
#define OSD_BUTTON_SELECT   1
#define OSD_BUTTON_PRESSED  2

/**
 * OSD State object
 *
287 288 289
 * The OSD state object holds the state and associated images for a
 * particular state on the screen. The picture is displayed when this
 * state is the active state.
hartman's avatar
hartman committed
290 291 292 293 294 295 296 297 298
 */
struct osd_state_t
{
    osd_state_t *p_next;    /*< pointer to next state */
    osd_state_t *p_prev;    /*< pointer to previous state */
    picture_t   *p_pic;     /*< picture of state */

    char        *psz_state; /*< state name */
    int          i_state;   /*< state index */
299 300 301 302 303

    int     i_x;            /*< x-position of button state image */
    int     i_y;            /*< y-position of button state image */
    int     i_width;        /*< width of button state image */
    int     i_height;       /*< height of button state image */
hartman's avatar
hartman committed
304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325
};

/**
 * OSD Button object
 *
 * An OSD Button has different states. Each state has an image for display.
 */
struct osd_button_t
{
    osd_button_t *p_next;   /*< pointer to next button */
    osd_button_t *p_prev;   /*< pointer to previous button */
    osd_button_t *p_up;     /*< pointer to up button */
    osd_button_t *p_down;   /*< pointer to down button */

    osd_state_t *p_current_state; /*< pointer to current state image */
    osd_state_t *p_states; /*< doubly linked list of states */
    picture_t   *p_feedback; /*< feedback picture */

    char    *psz_name;     /*< name of button */

    /* These member should probably be a struct hotkey */
    char    *psz_action;      /*< hotkey action name on button*/
326 327
    char    *psz_action_down; /*< hotkey action name on range buttons
                                  for command "menu down" */
hartman's avatar
hartman committed
328 329 330 331
    /* end of hotkey specifics */

    int     i_x;            /*< x-position of button visible state image */
    int     i_y;            /*< y-position of button visible state image */
332 333
    int     i_width;        /*< width of button visible state image */
    int     i_height;       /*< height of button visible state image */
hartman's avatar
hartman committed
334 335

    /* range style button */
336
    bool   b_range;    /*< button should be interpreted as range */
hartman's avatar
hartman committed
337 338 339
    int          i_ranges;   /*< number of states */
};

Jean-Paul Saman's avatar
Jean-Paul Saman committed
340 341 342 343 344 345 346 347 348 349 350 351 352 353
/**
 * OSD Menu Style
 *
 * The images that make up an OSD menu can be created in such away that
 * they contain all buttons in the same picture, with the selected one
 * highlighted or being a concatenation of all the seperate images. The
 * first case is the default.
 *
 * To change the default style the keyword 'style' should be set to 'concat'.
 */

#define OSD_MENU_STYLE_SIMPLE 0x0
#define OSD_MENU_STYLE_CONCAT 0x1

hartman's avatar
hartman committed
354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369
/**
 * OSD Menu State object
 *
 * Represents the current state as displayed.
 */
/* Represent the menu state */
struct osd_menu_state_t
{
    int     i_x;        /*< x position of spu region */
    int     i_y;        /*< y position of spu region */
    int     i_width;    /*< width of spu region */
    int     i_height;   /*< height of spu region */

    picture_t    *p_pic;  /*< pointer to picture to display */
    osd_button_t *p_visible; /*< shortcut to visible button */

370 371
    bool b_menu_visible; /*< menu currently visible? */
    bool b_update;       /*< update OSD Menu when true */
hartman's avatar
hartman committed
372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391

    /* quick hack to volume state. */
    osd_button_t *p_volume; /*< pointer to volume range object. */
};

/**
 * OSD Menu object
 *
 * The main OSD Menu object, which holds a linked list to all buttons
 * and images that defines the menu. The p_state variable represents the
 * current state of the OSD Menu.
 */
struct osd_menu_t
{
    VLC_COMMON_MEMBERS

    int     i_x;        /*< x-position of OSD Menu on the video screen */
    int     i_y;        /*< y-position of OSD Menu on the video screen */
    int     i_width;    /*< width of OSD Menu on the video screen */
    int     i_height;   /*< height of OSD Menu on the video screen */
Jean-Paul Saman's avatar
Jean-Paul Saman committed
392
    int     i_style;    /*< style of spu region generation */
393
    int     i_position; /*< display position */
hartman's avatar
hartman committed
394 395 396 397 398 399 400

    char             *psz_path;  /*< directory where OSD menu images are stored */
    osd_button_t     *p_button;  /*< doubly linked list of buttons */
    osd_menu_state_t *p_state;   /*< current state of OSD menu */

    /* quick link in the linked list. */
    osd_button_t  *p_last_button; /*< pointer to last button in the list */
401 402

    /* misc parser */
403
    module_t        *p_parser;  /*< pointer to parser module */
404 405
    char            *psz_file;  /*< Config file name */
    image_handler_t *p_image;   /*< handler to image loading and conversion libraries */
hartman's avatar
hartman committed
406 407 408 409 410
};

/**
 * Initialize an osd_menu_t object
 *
411 412 413
 * This functions has to be called before any call to other osd_menu_t*
 * functions. It creates the osd_menu object and holds a pointer to it
 * during its lifetime.
hartman's avatar
hartman committed
414 415 416 417 418 419
 */
VLC_EXPORT( osd_menu_t *, __osd_MenuCreate, ( vlc_object_t *, const char * ) );

/**
 * Delete the osd_menu_t object
 *
420 421 422
 * This functions has to be called to release the associated module and
 * memory for the osdmenu. After return of this function the pointer to
 * osd_menu_t* is invalid.
hartman's avatar
hartman committed
423 424 425
 */
VLC_EXPORT( void, __osd_MenuDelete, ( vlc_object_t *, osd_menu_t * ) );

426 427 428
#define osd_MenuCreate(object,file) __osd_MenuCreate( VLC_OBJECT(object), file )
#define osd_MenuDelete(object,osd)  __osd_MenuDelete( VLC_OBJECT(object), osd )

hartman's avatar
hartman committed
429
/**
430
 * Find OSD Menu button at position x,y
hartman's avatar
hartman committed
431
 */
432 433
VLC_EXPORT( osd_button_t *, __osd_ButtonFind, ( vlc_object_t *p_this,
     int, int, int, int, int, int ) );
hartman's avatar
hartman committed
434

435 436 437 438 439 440 441 442
#define osd_ButtonFind(object,x,y,h,w,sh,sw)  __osd_ButtonFind(object,x,y,h,w,sh,sw)

/**
 * Select the button provided as the new active button
 */
VLC_EXPORT( void, __osd_ButtonSelect, ( vlc_object_t *, osd_button_t *) );

#define osd_ButtonSelect(object,button) __osd_ButtonSelect(object,button)
hartman's avatar
hartman committed
443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462

/**
 * Show the OSD menu.
 *
 * Show the OSD menu on the video output or mux it into the stream.
 * Every change to the OSD menu will now be visible in the output. An output
 * can be a video output window or a stream (\see stream output)
 */
VLC_EXPORT( void, __osd_MenuShow, ( vlc_object_t * ) );

/**
 * Hide the OSD menu.
 *
 * Stop showing the OSD menu on the video output or mux it into the stream.
 */
VLC_EXPORT( void, __osd_MenuHide, ( vlc_object_t * ) );

/**
 * Activate the action of this OSD menu item.
 *
463 464 465
 * The rc interface command "menu select" triggers the sending of an
 * hotkey action to the hotkey interface. The hotkey that belongs to
 * the current highlighted OSD menu item will be used.
hartman's avatar
hartman committed
466 467 468 469 470 471 472 473 474 475 476
 */
VLC_EXPORT( void, __osd_MenuActivate,   ( vlc_object_t * ) );

#define osd_MenuShow(object) __osd_MenuShow( VLC_OBJECT(object) )
#define osd_MenuHide(object) __osd_MenuHide( VLC_OBJECT(object) )
#define osd_MenuActivate(object)   __osd_MenuActivate( VLC_OBJECT(object) )

/**
 * Next OSD menu item
 *
 * Select the next OSD menu item to be highlighted.
477 478
 * Note: The actual position on screen of the menu item is determined by
 * the OSD menu configuration file.
hartman's avatar
hartman committed
479 480 481 482 483 484 485
 */
VLC_EXPORT( void, __osd_MenuNext, ( vlc_object_t * ) );

/**
 * Previous OSD menu item
 *
 * Select the previous OSD menu item to be highlighted.
486 487
 * Note: The actual position on screen of the menu item is determined by
 * the OSD menu configuration file.
hartman's avatar
hartman committed
488 489 490 491 492 493 494
 */
VLC_EXPORT( void, __osd_MenuPrev, ( vlc_object_t * ) );

/**
 * OSD menu item above
 *
 * Select the OSD menu item above the current item to be highlighted.
495 496
 * Note: The actual position on screen of the menu item is determined by
 * the OSD menu configuration file.
hartman's avatar
hartman committed
497 498 499 500 501 502 503
 */
VLC_EXPORT( void, __osd_MenuUp,   ( vlc_object_t * ) );

/**
 * OSD menu item below
 *
 * Select the next OSD menu item below the current item to be highlighted.
504 505
 * Note: The actual position on screen of the menu item is determined by
 * the OSD menu configuration file.
hartman's avatar
hartman committed
506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537
 */
VLC_EXPORT( void, __osd_MenuDown, ( vlc_object_t * ) );

#define osd_MenuNext(object) __osd_MenuNext( VLC_OBJECT(object) )
#define osd_MenuPrev(object) __osd_MenuPrev( VLC_OBJECT(object) )
#define osd_MenuUp(object)   __osd_MenuUp( VLC_OBJECT(object) )
#define osd_MenuDown(object) __osd_MenuDown( VLC_OBJECT(object) )

/**
 * Display the audio volume bitmap.
 *
 * Display the correct audio volume bitmap that corresponds to the
 * current Audio Volume setting.
 */
VLC_EXPORT( void, __osd_Volume, ( vlc_object_t * ) );

#define osd_Volume(object)     __osd_Volume( VLC_OBJECT(object) )

/**
 * Retrieve a non modifyable pointer to the OSD Menu state
 *
 */
static inline const osd_menu_state_t *osd_GetMenuState( osd_menu_t *p_osd )
{
    return( p_osd->p_state );
}

/**
 * Get the last key press received by the OSD Menu
 *
 * Returns 0 when no key has been pressed or the value of the key pressed.
 */
538
static inline bool osd_GetKeyPressed( osd_menu_t *p_osd )
hartman's avatar
hartman committed
539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558
{
    return( p_osd->p_state->b_update );
}

/**
 * Set the key pressed to a value.
 *
 * Assign a new key value to the last key pressed on the OSD Menu.
 */
static inline void osd_SetKeyPressed( vlc_object_t *p_this, int i_value )
{
    vlc_value_t val;

    val.i_int = i_value;
    var_Set( p_this, "key-pressed", val );
}

/**
 * Update the OSD Menu visibility flag.
 *
559
 * true means OSD Menu should be shown. false means OSD Menu
560
 * should not be shown.
hartman's avatar
hartman committed
561
 */
562
static inline void osd_SetMenuVisible( osd_menu_t *p_osd, bool b_value )
hartman's avatar
hartman committed
563 564 565 566 567 568 569 570 571 572
{
    vlc_value_t val;

    val.b_bool = p_osd->p_state->b_menu_visible = b_value;
    var_Set( p_osd, "osd-menu-visible", val );
}

/**
 * Update the OSD Menu update flag
 *
573
 * If the OSD Menu should be updated then set the update flag to
574
 * true, else to false.
hartman's avatar
hartman committed
575
 */
576
static inline void osd_SetMenuUpdate( osd_menu_t *p_osd, bool b_value )
hartman's avatar
hartman committed
577 578 579 580 581 582 583 584 585 586
{
    vlc_value_t val;

    val.b_bool = p_osd->p_state->b_update = b_value;
    var_Set( p_osd, "osd-menu-update", val );
}

/**
 * Textual feedback
 *
587 588 589
 * Functions that provide the textual feedback on the OSD. They are shown
 * on hotkey commands. The feedback is also part of the osd_button_t
 * object. The types are declared in the include file include/vlc_osd.h
hartman's avatar
hartman committed
590 591 592 593
 * @see vlc_osd.h
 */
VLC_EXPORT( int, osd_ShowTextRelative, ( spu_t *, int, char *, text_style_t *, int, int, int, mtime_t ) );
VLC_EXPORT( int, osd_ShowTextAbsolute, ( spu_t *, int, char *, text_style_t *, int, int, int, mtime_t, mtime_t ) );
594
VLC_EXPORT( void,osd_Message, ( spu_t *, int, char *, ... ) LIBVLC_FORMAT( 3, 4 ) );
hartman's avatar
hartman committed
595 596 597 598

/**
 * Default feedback images
 *
599 600 601
 * Functions that provide the default OSD feedback images on hotkey
 * commands. These feedback images are also part of the osd_button_t
 * object. The types are declared in the include file include/vlc_osd.h
hartman's avatar
hartman committed
602 603
 * @see vlc_osd.h
 */
604 605
VLC_EXPORT( int, osd_Slider, ( vlc_object_t *, spu_t *, int, int, int, int, int, int, short ) );
VLC_EXPORT( int, osd_Icon, ( vlc_object_t *, spu_t *, int, int, int, int, int, short ) );
hartman's avatar
hartman committed
606

zorglub's avatar
zorglub committed
607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639
/** @} */

/**********************************************************************
 * Vout text and widget overlays
 **********************************************************************/

/**
 * 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
 * \param i_hmargin horizontal margin in pixels
 * \param i_vmargin vertical margin in pixels
 * \param i_duration Amount of time the text is to be shown.
 */
VLC_EXPORT( int, vout_ShowTextRelative, ( vout_thread_t *, int, char *, text_style_t *, int, int, int, mtime_t ) );

/**
 * 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
 * \param i_hmargin horizontal margin in pixels
 * \param i_vmargin vertical margin in pixels
 * \param i_start the time when this string is to appear on the video
 * \param i_stop the time when this string should stop to be displayed
 *               if this is 0 the string will be shown untill the next string
 *               is about to be shown
 */
640
VLC_EXPORT( int, vout_ShowTextAbsolute, ( vout_thread_t *, int, const char *, text_style_t *, int, int, int, mtime_t, mtime_t ) );
zorglub's avatar
zorglub committed
641 642 643 644 645 646 647 648

/**
 * 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 i_channel Subpicture channel
 * \param psz_format printf style formatting
 **/
649
VLC_EXPORT( void,  __vout_OSDMessage, ( vlc_object_t *, int, const char *, ... ) LIBVLC_FORMAT( 3, 4 ) );
zorglub's avatar
zorglub committed
650 651 652 653

/**
 * Same as __vlc_OSDMessage() but with automatic casting
 */
Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
654 655
#define vout_OSDMessage( obj, chan, ...) \
      __vout_OSDMessage( VLC_OBJECT(obj), chan, __VA_ARGS__ )
zorglub's avatar
zorglub committed
656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675

/**
 * Display a slider on the video output.
 * \param p_this    The object that called the function.
 * \param i_channel Subpicture channel
 * \param i_postion Current position in the slider
 * \param i_type    Types are: OSD_HOR_SLIDER and OSD_VERT_SLIDER.
 * @see vlc_osd.h
 */
VLC_EXPORT( void, vout_OSDSlider, ( vlc_object_t *, int, int , short ) );

/**
 * Display an Icon on the video output.
 * \param p_this    The object that called the function.
 * \param i_channel Subpicture channel
 * \param i_type    Types are: OSD_PLAY_ICON, OSD_PAUSE_ICON, OSD_SPEAKER_ICON, OSD_MUTE_ICON
 * @see vlc_osd.h
 */
VLC_EXPORT( void, vout_OSDIcon, ( vlc_object_t *, int, short ) );

hartman's avatar
hartman committed
676 677 678 679 680
# ifdef __cplusplus
}
# endif

#endif /* _VLC_OSD_H */