vlc_vout.h 28.9 KB
Newer Older
1
/*****************************************************************************
2
 * vlc_video.h: common video definitions
3
 *****************************************************************************
4
 * Copyright (C) 1999 - 2008 the VideoLAN team
5
 * $Id$
6
 *
7
 * Authors: Vincent Seguin <seguin@via.ecp.fr>
Clément Stenac's avatar
Clément Stenac committed
8 9
 *          Samuel Hocevar <sam@via.ecp.fr>
 *          Olivier Aubert <oaubert 47 videolan d07 org>
10 11 12 13 14
 *
 * 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.
15
 *
16 17
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 19
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
20
 *
21 22
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
Antoine Cellerier's avatar
Antoine Cellerier committed
23
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
24
 *****************************************************************************/
25

26 27
#ifndef VLC_VOUT_H_
#define VLC_VOUT_H_ 1
28

29 30 31 32 33
/**
 * \file
 * This file defines common video output structures and functions in vlc
 */

Clément Stenac's avatar
Clément Stenac committed
34
#include <vlc_es.h>
35
#include <vlc_filter.h>
36

Clément Stenac's avatar
Clément Stenac committed
37
/** Description of a planar graphic field */
38
typedef struct plane_t
39
{
40
    uint8_t *p_pixels;                        /**< Start of the plane's data */
41 42

    /* Variables used for fast memcpy operations */
43
    int i_lines;           /**< Number of lines, including margins */
44
    int i_pitch;           /**< Number of bytes in a line, including margins */
45

46
    /** Size of a macropixel, defaults to 1 */
47
    int i_pixel_pitch;
48 49

    /* Variables used for pictures with margins */
50
    int i_visible_lines;            /**< How many visible lines are there ? */
51
    int i_visible_pitch;            /**< How many visible pixels are there ? */
52

53 54
} plane_t;

55 56 57
/**
 * Video picture
 *
58
 * Any picture destined to be displayed by a video output thread should be
Michel Kaempf's avatar
Michel Kaempf committed
59
 * stored in this structure from it's creation to it's effective display.
Vincent Seguin's avatar
Vincent Seguin committed
60 61
 * Picture type and flags should only be modified by the output thread. Note
 * that an empty picture MUST have its flags set to 0.
62
 */
63
struct picture_t
Michel Kaempf's avatar
Michel Kaempf committed
64
{
65
    /**
66 67
     * The properties of the picture
     */
68 69
    video_frame_format_t format;

70
    /** Picture data - data can always be freely modified, but p_data may
71 72
     * NEVER be modified. A direct buffer can be handled as the plugin
     * wishes, it can even swap p_pixels buffers. */
73
    uint8_t        *p_data;
74 75 76
    void           *p_data_orig;                /**< pointer before memalign */
    plane_t         p[ VOUT_MAX_PLANES ];     /**< description of the planes */
    int             i_planes;                /**< number of allocated planes */
77

78 79 80 81 82
    /** \name Type and flags
     * Should NOT be modified except by the vout thread
     * @{*/
    int             i_status;                             /**< picture flags */
    int             i_type;                /**< is picture a direct buffer ? */
83
    bool            b_slow;                 /**< is picture in slow memory ? */
84 85
    int             i_matrix_coefficients;   /**< in YUV type, encoding type */
    /**@}*/
86

87 88 89 90
    /** \name Picture management properties
     * These properties can be modified using the video output thread API,
     * but should never be written directly */
    /**@{*/
91
    unsigned        i_refcount;                  /**< link reference counter */
92
    mtime_t         date;                                  /**< display date */
93
    bool            b_force;
94 95 96 97 98 99
    /**@}*/

    /** \name Picture dynamic properties
     * Those properties can be changed by the decoder
     * @{
     */
100
    bool            b_progressive;          /**< is it a progressive frame ? */
101
    unsigned int    i_nb_fields;                  /**< # of displayed fields */
102
    bool            b_top_field_first;             /**< which field is first */
103 104 105
    uint8_t        *p_q;                           /**< quantification table */
    int             i_qstride;                    /**< quantification stride */
    int             i_qtype;                       /**< quantification style */
106
    /**@}*/
107

108
    /** The picture heap we are attached to */
109
    picture_heap_t* p_heap;
110

111 112 113 114
    /* Some vouts require the picture to be locked before it can be modified */
    int (* pf_lock) ( vout_thread_t *, picture_t * );
    int (* pf_unlock) ( vout_thread_t *, picture_t * );

115
    /** Private data - the video output plugin might want to put stuff here to
116
     * keep track of the picture */
117
    picture_sys_t * p_sys;
118 119 120

    /** This way the picture_Release can be overloaded */
    void (*pf_release)( picture_t * );
121 122 123

    /** Next picture in a FIFO a pictures */
    struct picture_t *p_next;
124
};
Michel Kaempf's avatar
Michel Kaempf committed
125

126 127 128
/**
 * This function will create a new picture.
 * The picture created will implement a default release management compatible
129
 * with picture_Hold and picture_Release. This default management will release
130 131 132 133 134 135 136 137 138 139 140 141 142
 * picture_sys_t *p_sys field if non NULL.
 */
VLC_EXPORT( picture_t *, picture_New, ( vlc_fourcc_t i_chroma, int i_width, int i_height, int i_aspect ) );

/**
 * This function will force the destruction a picture.
 * The value of the picture reference count should be 0 before entering this
 * function.
 * Unless used for reimplementing pf_release, you should not use this
 * function but picture_Release.
 */
VLC_EXPORT( void, picture_Delete, ( picture_t * ) );

143 144 145 146
/**
 * This function will increase the picture reference count.
 * It will not have any effect on picture obtained from vout
 */
147
static inline void picture_Hold( picture_t *p_picture )
148 149 150 151 152 153 154 155 156 157 158 159 160 161 162
{
    if( p_picture->pf_release )
        p_picture->i_refcount++;
}
/**
 * This function will release a picture.
 * It will not have any effect on picture obtained from vout
 */
static inline void picture_Release( picture_t *p_picture )
{
    /* FIXME why do we let pf_release handle the i_refcount ? */
    if( p_picture->pf_release )
        p_picture->pf_release( p_picture );
}

163 164 165 166 167 168 169 170 171 172 173
/**
 * Cleanup quantization matrix data and set to 0
 */
static inline void picture_CleanupQuant( picture_t *p_pic )
{
    free( p_pic->p_q );
    p_pic->p_q = NULL;
    p_pic->i_qstride = 0;
    p_pic->i_qtype = 0;
}

174 175 176 177 178 179 180 181 182 183 184
/**
 * This function will copy all picture dynamic properties.
 */
static inline void picture_CopyProperties( picture_t *p_dst, const picture_t *p_src )
{
    p_dst->date = p_src->date;
    p_dst->b_force = p_src->b_force;

    p_dst->b_progressive = p_src->b_progressive;
    p_dst->i_nb_fields = p_src->i_nb_fields;
    p_dst->b_top_field_first = p_src->b_top_field_first;
185 186

    /* FIXME: copy ->p_q and ->p_qstride */
187 188
}

189 190
/**
 * This function will copy the picture pixels.
191 192
 * You can safely copy between pictures that do not have the same size,
 * only the compatible(smaller) part will be copied.
193 194
 */
VLC_EXPORT( void, picture_CopyPixels, ( picture_t *p_dst, const picture_t *p_src ) );
195
VLC_EXPORT( void, plane_CopyPixels, ( plane_t *p_dst, const plane_t *p_src ) );
196 197 198

/**
 * This function will copy both picture dynamic properties and pixels.
199
 * You have to notice that sometime a simple picture_Hold may do what
200 201
 * you want without the copy overhead.
 * Provided for convenience.
202 203 204
 *
 * \param p_dst pointer to the destination picture.
 * \param p_src pointer to the source picture.
205 206 207 208 209 210 211
 */
static inline void picture_Copy( picture_t *p_dst, const picture_t *p_src )
{
    picture_CopyPixels( p_dst, p_src );
    picture_CopyProperties( p_dst, p_src );
}

212 213
/**
 * Video picture heap, either render (to store pictures used
Sam Hocevar's avatar
Sam Hocevar committed
214
 * by the decoder) or output (to store pictures displayed by the vout plugin)
215
 */
216
struct picture_heap_t
217
{
218 219 220 221 222 223 224 225 226 227 228
    int i_pictures;                                   /**< current heap size */

    /* \name Picture static properties
     * Those properties are fixed at initialization and should NOT be modified
     * @{
     */
    unsigned int i_width;                                 /**< picture width */
    unsigned int i_height;                               /**< picture height */
    vlc_fourcc_t i_chroma;                               /**< picture chroma */
    unsigned int i_aspect;                                 /**< aspect ratio */
    /**@}*/
229

230
    /* Real pictures */
231 232
    picture_t*      pp_picture[VOUT_MAX_PICTURES];             /**< pictures */
    int             i_last_used_pic;              /**< last used pic in heap */
233
    bool            b_allow_modify_pics;
234 235

    /* Stuff used for truecolor RGB planes */
236 237 238
    uint32_t i_rmask; int i_rrshift, i_lrshift;
    uint32_t i_gmask; int i_rgshift, i_lgshift;
    uint32_t i_bmask; int i_rbshift, i_lbshift;
239

240
    /** Stuff used for palettized RGB planes */
241
    void (* pf_setpalette) ( vout_thread_t *, uint16_t *, uint16_t *, uint16_t * );
242
};
243

244 245 246 247
/*****************************************************************************
 * Flags used to describe the status of a picture
 *****************************************************************************/

248 249 250 251 252 253
/* Picture type */
#define EMPTY_PICTURE           0                            /* empty buffer */
#define MEMORY_PICTURE          100                 /* heap-allocated buffer */
#define DIRECT_PICTURE          200                         /* direct buffer */

/* Picture status */
254 255 256 257 258 259 260
#define FREE_PICTURE            0                  /* free and not allocated */
#define RESERVED_PICTURE        1                  /* allocated and reserved */
#define RESERVED_DATED_PICTURE  2              /* waiting for DisplayPicture */
#define RESERVED_DISP_PICTURE   3               /* waiting for a DatePicture */
#define READY_PICTURE           4                       /* ready for display */
#define DISPLAYED_PICTURE       5            /* been displayed but is linked */
#define DESTROYED_PICTURE       6              /* allocated but no more used */
Michel Kaempf's avatar
Michel Kaempf committed
261

262 263 264 265 266
/* Quantification type */
#define QTYPE_MPEG1            0
#define QTYPE_MPEG2            1
#define QTYPE_H264             2

267 268 269
/*****************************************************************************
 * Shortcuts to access image components
 *****************************************************************************/
270

271
/* Plane indices */
272 273 274
#define Y_PLANE      0
#define U_PLANE      1
#define V_PLANE      2
275
#define A_PLANE      3
276 277

/* Shortcuts */
278
#define Y_PIXELS     p[Y_PLANE].p_pixels
279
#define Y_PITCH      p[Y_PLANE].i_pitch
280
#define U_PIXELS     p[U_PLANE].p_pixels
281
#define U_PITCH      p[U_PLANE].i_pitch
282
#define V_PIXELS     p[V_PLANE].p_pixels
283
#define V_PITCH      p[V_PLANE].i_pitch
284 285
#define A_PIXELS     p[A_PLANE].p_pixels
#define A_PITCH      p[A_PLANE].i_pitch
286

287 288 289 290 291 292 293 294
/**
 * \defgroup subpicture Video Subpictures
 * Subpictures are pictures that should be displayed on top of the video, like
 * subtitles and OSD
 * \ingroup video_output
 * @{
 */

295 296 297 298 299
/**
 * Video subtitle region spu core private
 */
typedef struct subpicture_region_private_t subpicture_region_private_t;

300 301 302 303 304 305 306 307 308 309
/**
 * Video subtitle region
 *
 * A subtitle region is defined by a picture (graphic) and its rendering
 * coordinates.
 * Subtitles contain a list of regions.
 */
struct subpicture_region_t
{
    video_format_t  fmt;                          /**< format of the picture */
310
    picture_t       *p_picture;          /**< picture comprising this region */
311 312 313

    int             i_x;                             /**< position of region */
    int             i_y;                             /**< position of region */
314
    int             i_align;                  /**< alignment within a region */
315
    int             i_alpha;                               /**< transparency */
316 317

    char            *psz_text;       /**< text string comprising this region */
318
    char            *psz_html;       /**< HTML version of subtitle (NULL = use psz_text) */
Jean-Paul Saman's avatar
Jean-Paul Saman committed
319
    text_style_t    *p_style;        /**< a description of the text style formatting */
320

321
    subpicture_region_t *p_next;                /**< next region in the list */
322
    subpicture_region_private_t *p_private;  /**< Private data for spu_t *only* */
323 324
};

325 326 327 328 329 330 331 332
/* Subpicture region position flags */
#define SUBPICTURE_ALIGN_LEFT 0x1
#define SUBPICTURE_ALIGN_RIGHT 0x2
#define SUBPICTURE_ALIGN_TOP 0x4
#define SUBPICTURE_ALIGN_BOTTOM 0x8
#define SUBPICTURE_ALIGN_MASK ( SUBPICTURE_ALIGN_LEFT|SUBPICTURE_ALIGN_RIGHT| \
                                SUBPICTURE_ALIGN_TOP |SUBPICTURE_ALIGN_BOTTOM )

333
/**
334 335 336
 * This function will create a new subpicture region.
 *
 * You must use subpicture_region_Delete to destroy it.
337 338 339 340
 */
VLC_EXPORT( subpicture_region_t *, subpicture_region_New, ( const video_format_t *p_fmt ) );

/**
341
 * This function will destroy a subpicture region allocated by
342 343 344 345 346 347 348
 * subpicture_region_New.
 *
 * You may give it NULL.
 */
VLC_EXPORT( void, subpicture_region_Delete, ( subpicture_region_t *p_region ) );

/**
349
 * This function will destroy a list of subpicture regions allocated by
350 351 352 353 354 355
 * subpicture_region_New.
 *
 * Provided for convenience.
 */
VLC_EXPORT( void, subpicture_region_ChainDelete, ( subpicture_region_t *p_head ) );

356 357 358
/**
 * Video subtitle
 *
359
 * Any subtitle destined to be displayed by a video output thread should
360
 * be stored in this structure from it's creation to it's effective display.
Vincent Seguin's avatar
Vincent Seguin committed
361 362
 * Subtitle type and flags should only be modified by the output thread. Note
 * that an empty subtitle MUST have its flags set to 0.
363
 */
364
struct subpicture_t
Vincent Seguin's avatar
Vincent Seguin committed
365
{
366
    /** \name Channel ID */
367
    /**@{*/
368
    int             i_channel;                    /**< subpicture channel ID */
369 370
    /**@}*/

371 372 373
    /** \name Type and flags
       Should NOT be modified except by the vout thread */
    /**@{*/
374
    int64_t         i_order;                 /** an increasing unique number */
375 376 377 378 379 380 381
    subpicture_t *  p_next;               /**< next subtitle to be displayed */
    /**@}*/

    /** \name Date properties */
    /**@{*/
    mtime_t         i_start;                  /**< beginning of display date */
    mtime_t         i_stop;                         /**< end of display date */
382
    bool            b_ephemer;    /**< If this flag is set to true the subtitle
383
                                will be displayed untill the next one appear */
384
    bool            b_fade;                               /**< enable fading */
385 386
    /**@}*/

387 388
    subpicture_region_t *p_region;  /**< region list composing this subtitle */

389 390
    /** \name Display properties
     * These properties are only indicative and may be
391
     * changed by the video output thread, or simply ignored depending of the
392
     * subtitle type. */
393
    /**@{*/
394 395
    int          i_original_picture_width;  /**< original width of the movie */
    int          i_original_picture_height;/**< original height of the movie */
396
    bool         b_subtitle;            /**< the picture is a movie subtitle */
397 398
    bool         b_absolute;                       /**< position is absolute */
    int          i_alpha;                                  /**< transparency */
399
     /**@}*/
400

401
    /** Pointer to function that renders this subtitle in a picture */
402
    void ( *pf_render )  ( vout_thread_t *, picture_t *, const subpicture_t * );
403
    /** Pointer to function that cleans up the private data of this subtitle */
404
    void ( *pf_destroy ) ( subpicture_t * );
405

406
    /** Pointer to functions for region management */
407 408 409
    void (*pf_pre_render)    ( spu_t *, subpicture_t *, const video_format_t * );
    void (*pf_update_regions)( spu_t *,
                               subpicture_t *, const video_format_t *, mtime_t );
410

411
    /** Private data - the subtitle plugin might want to put stuff here to
412
     * keep track of the subpicture */
413 414
    subpicture_sys_t *p_sys;                              /* subpicture data */
};
Vincent Seguin's avatar
Vincent Seguin committed
415

416 417 418 419 420 421 422 423 424 425 426 427 428 429

/**
 * This function create a new empty subpicture.
 *
 * You must use subpicture_Delete to destroy it.
 */
VLC_EXPORT( subpicture_t *, subpicture_New, ( void ) );

/**
 * This function delete a subpicture created by subpicture_New.
 * You may give it NULL.
 */
VLC_EXPORT( void,  subpicture_Delete, ( subpicture_t *p_subpic ) );

430 431 432
/* Default subpicture channel ID */
#define DEFAULT_CHAN           1

433 434 435
/*****************************************************************************
 * Prototypes
 *****************************************************************************/
Clément Stenac's avatar
Clément Stenac committed
436

437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461
/**
 * Initialise different fields of a picture_t (but does not allocate memory).
 * \param p_this a vlc object
 * \param p_pic pointer to the picture structure.
 * \param i_chroma the wanted chroma for the picture.
 * \param i_width the wanted width for the picture.
 * \param i_height the wanted height for the picture.
 * \param i_aspect the wanted aspect ratio for the picture.
 */
#define vout_InitPicture(a,b,c,d,e,f) \
        __vout_InitPicture(VLC_OBJECT(a),b,c,d,e,f)
VLC_EXPORT( int, __vout_InitPicture, ( vlc_object_t *p_this, picture_t *p_pic, uint32_t i_chroma, int i_width, int i_height, int i_aspect ) );

/**
 * Initialise different fields of a picture_t and allocates the picture buffer.
 * \param p_this a vlc object
 * \param p_pic pointer to the picture structure.
 * \param i_chroma the wanted chroma for the picture.
 * \param i_width the wanted width for the picture.
 * \param i_height the wanted height for the picture.
 * \param i_aspect the wanted aspect ratio for the picture.
 */
#define vout_AllocatePicture(a,b,c,d,e,f) \
        __vout_AllocatePicture(VLC_OBJECT(a),b,c,d,e,f)
VLC_EXPORT( int, __vout_AllocatePicture,( vlc_object_t *p_this, picture_t *p_pic, uint32_t i_chroma, int i_width, int i_height, int i_aspect ) );
462

Clément Stenac's avatar
Clément Stenac committed
463

464
/**
Clément Stenac's avatar
Clément Stenac committed
465 466 467 468 469
 * \defgroup video_output Video Output
 * This module describes the programming interface for video output threads.
 * It includes functions allowing to open a new thread, send pictures to a
 * thread, and destroy a previously opened video output thread.
 * @{
470 471 472
 */

/**
Clément Stenac's avatar
Clément Stenac committed
473
 * Video output thread descriptor
474
 *
Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
475
 * Any independent video output device, such as an X11 window or a GGI device,
Clément Stenac's avatar
Clément Stenac committed
476 477
 * is represented by a video output thread, and described using the following
 * structure.
478
 */
Clément Stenac's avatar
Clément Stenac committed
479 480 481
struct vout_thread_t
{
    VLC_COMMON_MEMBERS
482

Clément Stenac's avatar
Clément Stenac committed
483 484 485 486 487
    /** \name Thread properties and locks */
    /**@{*/
    vlc_mutex_t         picture_lock;                 /**< picture heap lock */
    vlc_mutex_t         subpicture_lock;           /**< subpicture heap lock */
    vlc_mutex_t         change_lock;                 /**< thread change lock */
488
    vlc_mutex_t         vfilter_lock;         /**< video filter2 change lock */
Clément Stenac's avatar
Clément Stenac committed
489 490 491 492 493 494 495 496
    vout_sys_t *        p_sys;                     /**< system output method */
    /**@}*/

    /** \name Current display properties */
    /**@{*/
    uint16_t            i_changes;          /**< changes made to the thread.
                                                      \see \ref vout_changes */
    float               f_gamma;                                  /**< gamma */
497 498 499 500 501
    bool                b_grayscale;         /**< color or grayscale display */
    bool                b_info;            /**< print additional information */
    bool                b_interface;                   /**< render interface */
    bool                b_scale;                  /**< allow picture scaling */
    bool                b_fullscreen;         /**< toogle fullscreen display */
Clément Stenac's avatar
Clément Stenac committed
502 503 504 505 506 507 508
    uint32_t            render_time;           /**< last picture render time */
    unsigned int        i_window_width;              /**< video window width */
    unsigned int        i_window_height;            /**< video window height */
    unsigned int        i_alignment;          /**< video alignment in window */
    unsigned int        i_par_num;           /**< monitor pixel aspect-ratio */
    unsigned int        i_par_den;           /**< monitor pixel aspect-ratio */

509
    struct vout_window_t *p_window;   /**< window for embedded vout (if any) */
Clément Stenac's avatar
Clément Stenac committed
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 538
    /**@}*/

    /** \name Plugin used and shortcuts to access its capabilities */
    /**@{*/
    module_t *   p_module;
    int       ( *pf_init )       ( vout_thread_t * );
    void      ( *pf_end )        ( vout_thread_t * );
    int       ( *pf_manage )     ( vout_thread_t * );
    void      ( *pf_render )     ( vout_thread_t *, picture_t * );
    void      ( *pf_display )    ( vout_thread_t *, picture_t * );
    void      ( *pf_swap )       ( vout_thread_t * );         /* OpenGL only */
    int       ( *pf_lock )       ( vout_thread_t * );         /* OpenGL only */
    void      ( *pf_unlock )     ( vout_thread_t * );         /* OpenGL only */
    int       ( *pf_control )    ( vout_thread_t *, int, va_list );
    /**@}*/

    /** \name Statistics
     * These numbers are not supposed to be accurate, but are a
     * good indication of the thread status */
    /**@{*/
    count_t       c_fps_samples;                         /**< picture counts */
    mtime_t       p_fps_sample[VOUT_FPS_SAMPLES];     /**< FPS samples dates */
    /**@}*/

    /** \name Video heap and translation tables */
    /**@{*/
    int                 i_heap_size;                          /**< heap size */
    picture_heap_t      render;                       /**< rendered pictures */
    picture_heap_t      output;                          /**< direct buffers */
539 540
    bool                b_direct;            /**< rendered are like direct ? */
    filter_t           *p_chroma;                    /**< translation tables */
Clément Stenac's avatar
Clément Stenac committed
541 542 543 544 545 546 547 548 549 550

    video_format_t      fmt_render;      /* render format (from the decoder) */
    video_format_t      fmt_in;            /* input (modified render) format */
    video_format_t      fmt_out;     /* output format (for the video output) */
    /**@}*/

    /* Picture heap */
    picture_t           p_picture[2*VOUT_MAX_PICTURES+1];      /**< pictures */

    /* Subpicture unit */
551
    spu_t          *p_spu;
Clément Stenac's avatar
Clément Stenac committed
552 553

    /* Statistics */
554 555 556 557
    count_t         c_loops;
    count_t         c_pictures, c_late_pictures;
    mtime_t         display_jitter;    /**< average deviation from the PTS */
    count_t         c_jitter_samples;  /**< number of samples used
Clément Stenac's avatar
Clément Stenac committed
558 559 560
                                           for the calculation of the
                                           jitter  */
    /** delay created by internal caching */
561
    int             i_pts_delay;
Clément Stenac's avatar
Clément Stenac committed
562 563

    /* Filter chain */
564 565
    char           *psz_filter_chain;
    bool            b_filter_change;
Clément Stenac's avatar
Clément Stenac committed
566

567 568 569
    /* Video filter2 chain */
    filter_chain_t *p_vf2_chain;
    char           *psz_vf2;
Clément Stenac's avatar
Clément Stenac committed
570 571

    /* Misc */
572
    bool            b_snapshot;     /**< take one snapshot on the next loop */
573 574 575

    /* Video output configuration */
    config_chain_t *p_cfg;
576 577

    /* Show media title on videoutput */
578
    bool            b_title_show;
579 580
    mtime_t         i_title_timeout;
    int             i_title_position;
Clément Stenac's avatar
Clément Stenac committed
581 582 583 584 585 586 587 588 589 590 591
};

#define I_OUTPUTPICTURES p_vout->output.i_pictures
#define PP_OUTPUTPICTURE p_vout->output.pp_picture
#define I_RENDERPICTURES p_vout->render.i_pictures
#define PP_RENDERPICTURE p_vout->render.pp_picture

/** \defgroup vout_changes Flags for changes
 * These flags are set in the vout_thread_t::i_changes field when another
 * thread changed a variable
 * @{
592
 */
Clément Stenac's avatar
Clément Stenac committed
593 594 595 596 597 598 599 600 601 602 603 604 605 606 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
/** b_info changed */
#define VOUT_INFO_CHANGE        0x0001
/** b_grayscale changed */
#define VOUT_GRAYSCALE_CHANGE   0x0002
/** b_interface changed */
#define VOUT_INTF_CHANGE        0x0004
/** b_scale changed */
#define VOUT_SCALE_CHANGE       0x0008
/** gamma changed */
#define VOUT_GAMMA_CHANGE       0x0010
/** b_cursor changed */
#define VOUT_CURSOR_CHANGE      0x0020
/** b_fullscreen changed */
#define VOUT_FULLSCREEN_CHANGE  0x0040
/** size changed */
#define VOUT_SIZE_CHANGE        0x0200
/** depth changed */
#define VOUT_DEPTH_CHANGE       0x0400
/** change chroma tables */
#define VOUT_CHROMA_CHANGE      0x0800
/** cropping parameters changed */
#define VOUT_CROP_CHANGE        0x1000
/** aspect ratio changed */
#define VOUT_ASPECT_CHANGE      0x2000
/** change/recreate picture buffers */
#define VOUT_PICTURE_BUFFERS_CHANGE 0x4000
/**@}*/

/* Alignment flags */
#define VOUT_ALIGN_LEFT         0x0001
#define VOUT_ALIGN_RIGHT        0x0002
#define VOUT_ALIGN_HMASK        0x0003
#define VOUT_ALIGN_TOP          0x0004
#define VOUT_ALIGN_BOTTOM       0x0008
#define VOUT_ALIGN_VMASK        0x000C

#define MAX_JITTER_SAMPLES      20

/*****************************************************************************
 * Prototypes
 *****************************************************************************/
634 635 636 637 638 639 640 641 642 643 644 645

/**
 * This function will
 *  - returns a suitable vout (if requested by a non NULL p_fmt)
 *  - recycles an old vout (if given) by either destroying it or by saving it
 *  for latter usage.
 *
 * The purpose of this function is to avoid unnecessary creation/destruction of
 * vout (and to allow optional vout reusing).
 *
 * You can call vout_Request on a vout created by vout_Create or by a previous
 * call to vout_Request.
646 647
 * You can release the returned value either by vout_Request or vout_Close()
 * followed by a vlc_object_release() or shorter vout_CloseAndRelease()
648 649 650 651 652 653 654
 *
 * \param p_this a vlc object
 * \param p_vout a vout candidate
 * \param p_fmt the video format requested or NULL
 * \return a vout if p_fmt is non NULL and the request is successfull, NULL
 * otherwise
 */
Clément Stenac's avatar
Clément Stenac committed
655
#define vout_Request(a,b,c) __vout_Request(VLC_OBJECT(a),b,c)
656 657 658 659 660 661
VLC_EXPORT( vout_thread_t *, __vout_Request,    ( vlc_object_t *p_this, vout_thread_t *p_vout, video_format_t *p_fmt ) );

/**
 * This function will create a suitable vout for a given p_fmt. It will never
 * reuse an already existing unused vout.
 *
662
 * You have to call either vout_Close or vout_Request on the returned value
663 664 665 666
 * \param p_this a vlc object to which the returned vout will be attached
 * \param p_fmt the video format requested
 * \return a vout if the request is successfull, NULL otherwise
 */
Clément Stenac's avatar
Clément Stenac committed
667
#define vout_Create(a,b) __vout_Create(VLC_OBJECT(a),b)
668 669 670
VLC_EXPORT( vout_thread_t *, __vout_Create,       ( vlc_object_t *p_this, video_format_t *p_fmt ) );

/**
671 672 673 674
 * This function will close a vout created by vout_Create or vout_Request.
 * The associated vout module is closed.
 * Note: It is not released yet, you'll have to call vlc_object_release()
 * or use the convenient vout_CloseAndRelease().
675
 *
676
 * \param p_vout the vout to close
677
 */
678 679 680 681 682 683 684 685 686 687 688 689 690
VLC_EXPORT( void,            vout_Close,        ( vout_thread_t *p_vout ) );

/**
 * This function will close a vout created by vout_Create
 * and then release it.
 *
 * \param p_vout the vout to close and release
 */
static inline void vout_CloseAndRelease( vout_thread_t *p_vout )
{
    vout_Close( p_vout );
    vlc_object_release( p_vout );
}
Clément Stenac's avatar
Clément Stenac committed
691

692
/* */
Clément Stenac's avatar
Clément Stenac committed
693 694
VLC_EXPORT( int,             vout_ChromaCmp,      ( uint32_t, uint32_t ) );

695
VLC_EXPORT( picture_t *,     vout_CreatePicture,  ( vout_thread_t *, bool, bool, unsigned int ) );
Clément Stenac's avatar
Clément Stenac committed
696 697 698 699 700 701 702
VLC_EXPORT( void,            vout_InitFormat,     ( video_frame_format_t *, uint32_t, int, int, int ) );
VLC_EXPORT( void,            vout_DestroyPicture, ( vout_thread_t *, picture_t * ) );
VLC_EXPORT( void,            vout_DisplayPicture, ( vout_thread_t *, picture_t * ) );
VLC_EXPORT( void,            vout_DatePicture,    ( vout_thread_t *, picture_t *, mtime_t ) );
VLC_EXPORT( void,            vout_LinkPicture,    ( vout_thread_t *, picture_t * ) );
VLC_EXPORT( void,            vout_UnlinkPicture,  ( vout_thread_t *, picture_t * ) );
VLC_EXPORT( void,            vout_PlacePicture,   ( vout_thread_t *, unsigned int, unsigned int, unsigned int *, unsigned int *, unsigned int *, unsigned int * ) );
703 704

/* DO NOT use vout_RenderPicture unless you are in src/video_ouput */
Clément Stenac's avatar
Clément Stenac committed
705
picture_t *     vout_RenderPicture  ( vout_thread_t *, picture_t *,
Laurent Aimar's avatar
Laurent Aimar committed
706
                                                       subpicture_t *, bool b_paused );
Clément Stenac's avatar
Clément Stenac committed
707

708 709 710
/* DO NOT use vout_CountPictureAvailable unless your are in src/input/dec.c (no exception) */
int vout_CountPictureAvailable( vout_thread_t * );

Clément Stenac's avatar
Clément Stenac committed
711 712 713 714 715 716
VLC_EXPORT( int, vout_vaControlDefault, ( vout_thread_t *, int, va_list ) );
VLC_EXPORT( void *, vout_RequestWindow, ( vout_thread_t *, int *, int *, unsigned int *, unsigned int * ) );
VLC_EXPORT( void,   vout_ReleaseWindow, ( vout_thread_t *, void * ) );
VLC_EXPORT( int, vout_ControlWindow, ( vout_thread_t *, void *, int, va_list ) );
void vout_IntfInit( vout_thread_t * );
VLC_EXPORT( int, vout_Snapshot, ( vout_thread_t *p_vout, picture_t *p_pic ) );
717
VLC_EXPORT( void, vout_EnableFilter, ( vout_thread_t *, char *,bool , bool  ) );
Clément Stenac's avatar
Clément Stenac committed
718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743


static inline int vout_vaControl( vout_thread_t *p_vout, int i_query,
                                  va_list args )
{
    if( p_vout->pf_control )
        return p_vout->pf_control( p_vout, i_query, args );
    else
        return VLC_EGENERIC;
}

static inline int vout_Control( vout_thread_t *p_vout, int i_query, ... )
{
    va_list args;
    int i_result;

    va_start( args, i_query );
    i_result = vout_vaControl( p_vout, i_query, args );
    va_end( args );
    return i_result;
}

enum output_query_e
{
    VOUT_GET_SIZE,         /* arg1= unsigned int*, arg2= unsigned int*, res= */
    VOUT_SET_SIZE,         /* arg1= unsigned int, arg2= unsigned int, res= */
744
    VOUT_SET_STAY_ON_TOP,  /* arg1= bool       res=    */
Clément Stenac's avatar
Clément Stenac committed
745 746 747
    VOUT_REPARENT,
    VOUT_SNAPSHOT,
    VOUT_CLOSE,
748
    VOUT_SET_FOCUS,         /* arg1= bool       res=    */
749 750
    VOUT_SET_VIEWPORT,      /* arg1= view rect, arg2=clip rect, res= */
    VOUT_REDRAW_RECT,       /* arg1= area rect, res= */
Clément Stenac's avatar
Clément Stenac committed
751 752 753 754 755 756 757 758 759 760
};

typedef struct snapshot_t {
  char *p_data;  /* Data area */

  int i_width;       /* In pixels */
  int i_height;      /* In pixels */
  int i_datasize;    /* In bytes */
  mtime_t date;      /* Presentation time */
} snapshot_t;
761

762
/**@}*/
763 764

#endif /* _VLC_VIDEO_H */