vlc_vout.h 29.3 KB
Newer Older
1
/*****************************************************************************
2
 * vlc_video.h: common video definitions
3
 *****************************************************************************
4
 * Copyright (C) 1999 - 2008 the VideoLAN team
yoann's avatar
yoann committed
5
 * $Id$
6
 *
7
 * Authors: Vincent Seguin <seguin@via.ecp.fr>
zorglub's avatar
zorglub 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.
zorglub's avatar
zorglub committed
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
dionoea's avatar
dionoea committed
23
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
24
 *****************************************************************************/
zorglub's avatar
zorglub committed
25

26
27
#ifndef VLC_VOUT_H_
#define VLC_VOUT_H_ 1
gbazin's avatar
   
gbazin committed
28

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

zorglub's avatar
zorglub committed
34
#include <vlc_es.h>
35
#include <vlc_filter.h>
36

zorglub's avatar
zorglub committed
37
/** Description of a planar graphic field */
38
typedef struct plane_t
Sam Hocevar's avatar
   
Sam Hocevar committed
39
{
sigmunau's avatar
sigmunau committed
40
    uint8_t *p_pixels;                        /**< Start of the plane's data */
Sam Hocevar's avatar
   
Sam Hocevar committed
41
42

    /* Variables used for fast memcpy operations */
43
    int i_lines;           /**< Number of lines, including margins */
sigmunau's avatar
sigmunau committed
44
    int i_pitch;           /**< Number of bytes in a line, including margins */
Sam Hocevar's avatar
   
Sam Hocevar committed
45

sigmunau's avatar
sigmunau committed
46
    /** Size of a macropixel, defaults to 1 */
47
    int i_pixel_pitch;
Sam Hocevar's avatar
   
Sam Hocevar committed
48
49

    /* Variables used for pictures with margins */
50
    int i_visible_lines;            /**< How many visible lines are there ? */
sigmunau's avatar
sigmunau committed
51
    int i_visible_pitch;            /**< How many visible pixels are there ? */
Sam Hocevar's avatar
   
Sam Hocevar committed
52

Sam Hocevar's avatar
   
Sam Hocevar committed
53
54
} plane_t;

sigmunau's avatar
sigmunau committed
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.
sigmunau's avatar
sigmunau committed
62
 */
63
struct picture_t
Michel Kaempf's avatar
Michel Kaempf committed
64
{
65
    /**
sigmunau's avatar
sigmunau committed
66
67
     * The properties of the picture
     */
gbazin's avatar
   
gbazin committed
68
69
    video_frame_format_t format;

sigmunau's avatar
sigmunau committed
70
    /** Picture data - data can always be freely modified, but p_data may
Sam Hocevar's avatar
   
Sam Hocevar committed
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;
sigmunau's avatar
sigmunau committed
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

sigmunau's avatar
sigmunau committed
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 ? */
sigmunau's avatar
sigmunau committed
84
85
    int             i_matrix_coefficients;   /**< in YUV type, encoding type */
    /**@}*/
Sam Hocevar's avatar
   
Sam Hocevar committed
86

sigmunau's avatar
sigmunau committed
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 */
sigmunau's avatar
sigmunau committed
92
    mtime_t         date;                                  /**< display date */
93
    bool            b_force;
sigmunau's avatar
sigmunau committed
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 ? */
sigmunau's avatar
sigmunau committed
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 */
sigmunau's avatar
sigmunau committed
106
    /**@}*/
zorglub's avatar
zorglub committed
107

sigmunau's avatar
sigmunau committed
108
    /** The picture heap we are attached to */
109
    picture_heap_t* p_heap;
Sam Hocevar's avatar
   
Sam Hocevar committed
110

gbazin's avatar
   
gbazin committed
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 * );

sigmunau's avatar
sigmunau committed
115
    /** Private data - the video output plugin might want to put stuff here to
Sam Hocevar's avatar
   
Sam Hocevar committed
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
129
130
131
132
133
134
135
136
137
138
139
140
141
142
/**
 * This function will create a new picture.
 * The picture created will implement a default release management compatible
 * with picture_Yield and picture_Release. This default management will release
 * 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
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
/**
 * This function will increase the picture reference count.
 * It will not have any effect on picture obtained from vout
 */
static inline void picture_Yield( picture_t *p_picture )
{
    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 );
}

/**
 * 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;
174
175

    /* FIXME: copy ->p_q and ->p_qstride */
176
177
}

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

/**
 * This function will copy both picture dynamic properties and pixels.
 * You have to notice that sometime a simple picture_Yield may do what
 * you want without the copy overhead.
 * Provided for convenience.
 */
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 );
}

sigmunau's avatar
sigmunau committed
198
199
/**
 * Video picture heap, either render (to store pictures used
Sam Hocevar's avatar
   
Sam Hocevar committed
200
 * by the decoder) or output (to store pictures displayed by the vout plugin)
sigmunau's avatar
sigmunau committed
201
 */
202
struct picture_heap_t
Sam Hocevar's avatar
   
Sam Hocevar committed
203
{
sigmunau's avatar
sigmunau committed
204
205
206
207
208
209
210
211
212
213
214
    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 */
    /**@}*/
Sam Hocevar's avatar
   
Sam Hocevar committed
215

Sam Hocevar's avatar
   
Sam Hocevar committed
216
    /* Real pictures */
sigmunau's avatar
sigmunau committed
217
218
    picture_t*      pp_picture[VOUT_MAX_PICTURES];             /**< pictures */
    int             i_last_used_pic;              /**< last used pic in heap */
219
    bool            b_allow_modify_pics;
Sam Hocevar's avatar
   
Sam Hocevar committed
220
221

    /* Stuff used for truecolor RGB planes */
222
223
224
    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;
Sam Hocevar's avatar
   
Sam Hocevar committed
225

sigmunau's avatar
sigmunau committed
226
    /** Stuff used for palettized RGB planes */
227
    void (* pf_setpalette) ( vout_thread_t *, uint16_t *, uint16_t *, uint16_t * );
228
};
Sam Hocevar's avatar
   
Sam Hocevar committed
229

Sam Hocevar's avatar
   
Sam Hocevar committed
230
231
232
233
/*****************************************************************************
 * Flags used to describe the status of a picture
 *****************************************************************************/

Sam Hocevar's avatar
   
Sam Hocevar committed
234
235
236
237
238
239
/* Picture type */
#define EMPTY_PICTURE           0                            /* empty buffer */
#define MEMORY_PICTURE          100                 /* heap-allocated buffer */
#define DIRECT_PICTURE          200                         /* direct buffer */

/* Picture status */
Sam Hocevar's avatar
Sam Hocevar committed
240
241
242
243
244
245
246
#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
247

248
249
250
251
252
/* Quantification type */
#define QTYPE_MPEG1            0
#define QTYPE_MPEG2            1
#define QTYPE_H264             2

253
254
255
/*****************************************************************************
 * Shortcuts to access image components
 *****************************************************************************/
256

Sam Hocevar's avatar
   
Sam Hocevar committed
257
/* Plane indices */
Sam Hocevar's avatar
   
Sam Hocevar committed
258
259
260
#define Y_PLANE      0
#define U_PLANE      1
#define V_PLANE      2
261
#define A_PLANE      3
Sam Hocevar's avatar
   
Sam Hocevar committed
262
263

/* Shortcuts */
Sam Hocevar's avatar
   
Sam Hocevar committed
264
#define Y_PIXELS     p[Y_PLANE].p_pixels
265
#define Y_PITCH      p[Y_PLANE].i_pitch
Sam Hocevar's avatar
   
Sam Hocevar committed
266
#define U_PIXELS     p[U_PLANE].p_pixels
267
#define U_PITCH      p[U_PLANE].i_pitch
Sam Hocevar's avatar
   
Sam Hocevar committed
268
#define V_PIXELS     p[V_PLANE].p_pixels
269
#define V_PITCH      p[V_PLANE].i_pitch
270
271
#define A_PIXELS     p[A_PLANE].p_pixels
#define A_PITCH      p[A_PLANE].i_pitch
Sam Hocevar's avatar
   
Sam Hocevar committed
272

sigmunau's avatar
sigmunau committed
273
274
275
276
277
278
279
280
/**
 * \defgroup subpicture Video Subpictures
 * Subpictures are pictures that should be displayed on top of the video, like
 * subtitles and OSD
 * \ingroup video_output
 * @{
 */

281
282
283
284
285
286
287
288
289
290
291
292
293
294
/**
 * 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 */
    picture_t       picture;             /**< picture comprising this region */

    int             i_x;                             /**< position of region */
    int             i_y;                             /**< position of region */
295
    int             i_align;                  /**< alignment within a region */
296
    int             i_alpha;                               /**< transparency */
297
298

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

302
    subpicture_region_t *p_next;                /**< next region in the list */
303
    subpicture_region_t *p_cache;       /**< modified version of this region */
304
305
};

306
307
308
/**
 * Video subtitle
 *
Sam Hocevar's avatar
Sam Hocevar committed
309
 * Any subtitle destined to be displayed by a video output thread should
310
 * be stored in this structure from it's creation to it's effective display.
Vincent Seguin's avatar
Vincent Seguin committed
311
312
 * Subtitle type and flags should only be modified by the output thread. Note
 * that an empty subtitle MUST have its flags set to 0.
313
 */
314
struct subpicture_t
Vincent Seguin's avatar
Vincent Seguin committed
315
{
316
    /** \name Channel ID */
yoann's avatar
yoann committed
317
    /**@{*/
318
    int             i_channel;                    /**< subpicture channel ID */
yoann's avatar
yoann committed
319
320
    /**@}*/

321
322
323
324
325
326
327
328
329
330
331
332
    /** \name Type and flags
       Should NOT be modified except by the vout thread */
    /**@{*/
    int             i_type;                                        /**< type */
    int             i_status;                                     /**< flags */
    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 */
333
    bool            b_ephemer;    /**< If this flag is set to true the subtitle
334
                                will be displayed untill the next one appear */
335
336
    bool            b_fade;                               /**< enable fading */
    bool            b_pausable;               /**< subpicture will be paused if
337
                                                            stream is paused */
338
339
    /**@}*/

340
341
    subpicture_region_t *p_region;  /**< region list composing this subtitle */

342
343
    /** \name Display properties
     * These properties are only indicative and may be
344
     * changed by the video output thread, or simply ignored depending of the
Sam Hocevar's avatar
Sam Hocevar committed
345
     * subtitle type. */
346
    /**@{*/
347
348
349
350
    int          i_x;                    /**< offset from alignment position */
    int          i_y;                    /**< offset from alignment position */
    int          i_width;                                 /**< picture width */
    int          i_height;                               /**< picture height */
351
    int          i_alpha;                                  /**< transparency */
352
353
    int          i_original_picture_width;  /**< original width of the movie */
    int          i_original_picture_height;/**< original height of the movie */
354
    bool         b_absolute;                       /**< position is absolute */
355
    int          i_flags;                                /**< position flags */
356
     /**@}*/
Sam Hocevar's avatar
   
Sam Hocevar committed
357

358
    /** Pointer to function that renders this subtitle in a picture */
359
    void ( *pf_render )  ( vout_thread_t *, picture_t *, const subpicture_t * );
360
    /** Pointer to function that cleans up the private data of this subtitle */
361
    void ( *pf_destroy ) ( subpicture_t * );
Sam Hocevar's avatar
   
Sam Hocevar committed
362

363
364
365
    /** Pointer to functions for region management */
    subpicture_region_t * ( *pf_create_region ) ( vlc_object_t *,
                                                  video_format_t * );
366
367
    subpicture_region_t * ( *pf_make_region ) ( vlc_object_t *,
                                                video_format_t *, picture_t * );
368
369
    void ( *pf_destroy_region ) ( vlc_object_t *, subpicture_region_t * );

370
371
372
    void ( *pf_pre_render ) ( video_format_t *, spu_t *, subpicture_t * );
    void ( *pf_update_regions ) ( video_format_t *, spu_t *,
                                  subpicture_t *, mtime_t );
373

374
    /** Private data - the subtitle plugin might want to put stuff here to
Sam Hocevar's avatar
   
Sam Hocevar committed
375
     * keep track of the subpicture */
376
377
    subpicture_sys_t *p_sys;                              /* subpicture data */
};
Vincent Seguin's avatar
Vincent Seguin committed
378

379
/* Subpicture type */
Sam Hocevar's avatar
Sam Hocevar committed
380
#define EMPTY_SUBPICTURE       0     /* subtitle slot is empty and available */
Sam Hocevar's avatar
   
Sam Hocevar committed
381
#define MEMORY_SUBPICTURE      100            /* subpicture stored in memory */
Vincent Seguin's avatar
Vincent Seguin committed
382

383
384
385
/* Default subpicture channel ID */
#define DEFAULT_CHAN           1

386
/* Subpicture status */
Sam Hocevar's avatar
Sam Hocevar committed
387
388
389
#define FREE_SUBPICTURE        0                   /* free and not allocated */
#define RESERVED_SUBPICTURE    1                   /* allocated and reserved */
#define READY_SUBPICTURE       2                        /* ready for display */
390

391
392
393
394
395
/* Subpicture position flags */
#define SUBPICTURE_ALIGN_LEFT 0x1
#define SUBPICTURE_ALIGN_RIGHT 0x2
#define SUBPICTURE_ALIGN_TOP 0x4
#define SUBPICTURE_ALIGN_BOTTOM 0x8
Laurent Aimar's avatar
Laurent Aimar committed
396
397
#define SUBPICTURE_ALIGN_MASK ( SUBPICTURE_ALIGN_LEFT|SUBPICTURE_ALIGN_RIGHT| \
                                SUBPICTURE_ALIGN_TOP |SUBPICTURE_ALIGN_BOTTOM )
398

399
400
401
/* Subpicture rendered flag - should only be used by vout_subpictures */
#define SUBPICTURE_RENDERED  0x10

402
403
404
/*****************************************************************************
 * Prototypes
 *****************************************************************************/
zorglub's avatar
zorglub committed
405

406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
/**
 * Copy the source picture onto the destination picture.
 * \param p_this a vlc object
 * \param p_dst pointer to the destination picture.
 * \param p_src pointer to the source picture.
 */
#define vout_CopyPicture(a,b,c) __vout_CopyPicture(VLC_OBJECT(a),b,c)
VLC_EXPORT( void, __vout_CopyPicture, ( vlc_object_t *p_this, picture_t *p_dst, picture_t *p_src ) );

/**
 * 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 ) );
440

zorglub's avatar
zorglub committed
441

442
/**
zorglub's avatar
zorglub committed
443
444
445
446
447
 * \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.
 * @{
448
449
450
 */

/**
zorglub's avatar
zorglub committed
451
 * Video output thread descriptor
452
 *
Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
453
 * Any independent video output device, such as an X11 window or a GGI device,
zorglub's avatar
zorglub committed
454
455
 * is represented by a video output thread, and described using the following
 * structure.
456
 */
zorglub's avatar
zorglub committed
457
458
459
struct vout_thread_t
{
    VLC_COMMON_MEMBERS
460

zorglub's avatar
zorglub committed
461
462
463
464
465
    /** \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 */
466
    vlc_mutex_t         vfilter_lock;         /**< video filter2 change lock */
zorglub's avatar
zorglub committed
467
468
469
470
471
472
473
474
    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 */
475
476
477
478
479
    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 */
zorglub's avatar
zorglub committed
480
481
482
483
484
485
486
    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 */

487
    struct vout_window_t *p_window;   /**< window for embedded vout (if any) */
zorglub's avatar
zorglub committed
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
    /**@}*/

    /** \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 */
517
518
    bool                b_direct;            /**< rendered are like direct ? */
    filter_t           *p_chroma;                    /**< translation tables */
zorglub's avatar
zorglub committed
519
520
521
522
523
524
525
526
527
528

    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 */
529
    spu_t          *p_spu;
zorglub's avatar
zorglub committed
530
531

    /* Statistics */
532
533
534
535
    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
zorglub's avatar
zorglub committed
536
537
538
                                           for the calculation of the
                                           jitter  */
    /** delay created by internal caching */
539
    int             i_pts_delay;
zorglub's avatar
zorglub committed
540
541

    /* Filter chain */
542
543
    char           *psz_filter_chain;
    bool            b_filter_change;
zorglub's avatar
zorglub committed
544

545
546
547
    /* Video filter2 chain */
    filter_chain_t *p_vf2_chain;
    char           *psz_vf2;
zorglub's avatar
zorglub committed
548
549

    /* Misc */
550
    bool            b_snapshot;     /**< take one snapshot on the next loop */
551
552
553

    /* Video output configuration */
    config_chain_t *p_cfg;
554
555

    /* Show media title on videoutput */
556
    bool            b_title_show;
557
558
    mtime_t         i_title_timeout;
    int             i_title_position;
zorglub's avatar
zorglub committed
559
560
561
562
563
564
565
566
567
568
569
};

#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
 * @{
570
 */
zorglub's avatar
zorglub committed
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
/** 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
 *****************************************************************************/
612
613
614
615
616
617
618
619
620
621
622
623

/**
 * 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.
624
625
 * You can release the returned value either by vout_Request or vout_Close()
 * followed by a vlc_object_release() or shorter vout_CloseAndRelease()
626
627
628
629
630
631
632
 *
 * \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
 */
zorglub's avatar
zorglub committed
633
#define vout_Request(a,b,c) __vout_Request(VLC_OBJECT(a),b,c)
634
635
636
637
638
639
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.
 *
640
 * You have to call either vout_Close or vout_Request on the returned value
641
642
643
644
 * \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
 */
zorglub's avatar
zorglub committed
645
#define vout_Create(a,b) __vout_Create(VLC_OBJECT(a),b)
646
647
648
VLC_EXPORT( vout_thread_t *, __vout_Create,       ( vlc_object_t *p_this, video_format_t *p_fmt ) );

/**
649
650
651
652
 * 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().
653
 *
654
 * \param p_vout the vout to close
655
 */
656
657
658
659
660
661
662
663
664
665
666
667
668
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 );
}
zorglub's avatar
zorglub committed
669

670
/* */
zorglub's avatar
zorglub committed
671
672
VLC_EXPORT( int,             vout_ChromaCmp,      ( uint32_t, uint32_t ) );

673
VLC_EXPORT( picture_t *,     vout_CreatePicture,  ( vout_thread_t *, bool, bool, unsigned int ) );
zorglub's avatar
zorglub committed
674
675
676
677
678
679
680
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 * ) );
681
682

/* DO NOT use vout_RenderPicture unless you are in src/video_ouput */
zorglub's avatar
zorglub committed
683
684
685
picture_t *     vout_RenderPicture  ( vout_thread_t *, picture_t *,
                                                       subpicture_t * );

686
687
688
/* DO NOT use vout_CountPictureAvailable unless your are in src/input/dec.c (no exception) */
int vout_CountPictureAvailable( vout_thread_t * );

zorglub's avatar
zorglub committed
689
690
691
692
693
694
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 ) );
695
VLC_EXPORT( void, vout_EnableFilter, ( vout_thread_t *, char *,bool , bool  ) );
zorglub's avatar
zorglub committed
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721


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= */
722
    VOUT_SET_STAY_ON_TOP,  /* arg1= bool       res=    */
zorglub's avatar
zorglub committed
723
724
725
    VOUT_REPARENT,
    VOUT_SNAPSHOT,
    VOUT_CLOSE,
726
    VOUT_SET_FOCUS,         /* arg1= bool       res=    */
727
728
    VOUT_SET_VIEWPORT,      /* arg1= view rect, arg2=clip rect, res= */
    VOUT_REDRAW_RECT,       /* arg1= area rect, res= */
zorglub's avatar
zorglub committed
729
730
731
732
733
734
735
736
737
738
};

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;
739

sigmunau's avatar
sigmunau committed
740
/**@}*/
gbazin's avatar
   
gbazin committed
741
742

#endif /* _VLC_VIDEO_H */