video_output.h 10.9 KB
Newer Older
1
/*****************************************************************************
Michel Kaempf's avatar
Michel Kaempf committed
2
 * video_output.h : video output thread
3
 *****************************************************************************
4
 * Copyright (C) 1999, 2000 the VideoLAN team
Gildas Bazin's avatar
Gildas Bazin committed
5
 * $Id$
6
 *
7
 * Authors: Vincent Seguin <seguin@via.ecp.fr>
8
 *          Samuel Hocevar <sam@via.ecp.fr>
9 10 11 12 13
 *
 * 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.
14
 *
15 16
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 18
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
19
 *
20 21
 * 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
22
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
23
 *****************************************************************************/
Michel Kaempf's avatar
Michel Kaempf committed
24

25 26 27 28 29 30 31 32 33 34 35
/**
 * \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.
 * @{
 */

/**
 * Chroma conversion function
 *
36
 * This is the prototype common to all conversion functions.
37 38 39
 * \param p_vout video output thread
 * \param p_source source picture
 * \param p_dest destination picture
Vincent Seguin's avatar
Vincent Seguin committed
40
 * Picture width and source dimensions must be multiples of 16.
41
 */
42
typedef void (vout_chroma_convert_t)( vout_thread_t *,
Sam Hocevar's avatar
Sam Hocevar committed
43
                                      picture_t *, picture_t * );
44

45
typedef struct vout_chroma_t
46
{
47
    /** conversion functions */
48 49
    vout_chroma_convert_t *pf_convert;

50
    /** Private module-dependant data */
51
    chroma_sys_t *      p_sys;                               /* private data */
52

53
    /** Plugin used and shortcuts to access its capabilities */
54
    module_t * p_module;
55 56

} vout_chroma_t;
57

58
/**
59
 * Video output thread descriptor
60
 *
61
 * Any independant video output device, such as an X11 window or a GGI device,
62
 * is represented by a video output thread, and described using the following
63
 * structure.
64
 */
65
struct vout_thread_t
Michel Kaempf's avatar
Michel Kaempf committed
66
{
67 68
    VLC_COMMON_MEMBERS

69 70 71 72 73 74 75
    /** \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 */
    vout_sys_t *        p_sys;                     /**< system output method */
    /**@}*/
76

77 78
    /** \name Current display properties */
    /**@{*/
79 80
    uint16_t            i_changes;          /**< changes made to the thread.
                                                      \see \ref vout_changes */
81 82 83 84 85 86
    float               f_gamma;                                  /**< gamma */
    vlc_bool_t          b_grayscale;         /**< color or grayscale display */
    vlc_bool_t          b_info;            /**< print additional information */
    vlc_bool_t          b_interface;                   /**< render interface */
    vlc_bool_t          b_scale;                  /**< allow picture scaling */
    vlc_bool_t          b_fullscreen;         /**< toogle fullscreen display */
87
    uint32_t            render_time;           /**< last picture render time */
88 89
    unsigned int        i_window_width;              /**< video window width */
    unsigned int        i_window_height;            /**< video window height */
90
    unsigned int        i_alignment;          /**< video alignment in window */
91 92
    unsigned int        i_par_num;           /**< monitor pixel aspect-ratio */
    unsigned int        i_par_den;           /**< monitor pixel aspect-ratio */
93 94 95

    intf_thread_t       *p_parent_intf;   /**< parent interface for embedded
                                                               vout (if any) */
96
    /**@}*/
97

98 99
    /** \name Plugin used and shortcuts to access its capabilities */
    /**@{*/
100 101 102 103 104 105
    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 * );
106
    void      ( *pf_swap )       ( vout_thread_t * );         /* OpenGL only */
107 108
    int       ( *pf_lock )       ( vout_thread_t * );         /* OpenGL only */
    void      ( *pf_unlock )     ( vout_thread_t * );         /* OpenGL only */
109
    int       ( *pf_control )    ( vout_thread_t *, int, va_list );
110
    /**@}*/
111

112 113
    /** \name Statistics
     * These numbers are not supposed to be accurate, but are a
114
     * good indication of the thread status */
115 116 117 118 119 120 121 122 123 124 125 126
    /**@{*/
    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 */
    vlc_bool_t          b_direct;            /**< rendered are like direct ? */
    vout_chroma_t       chroma;                      /**< translation tables */
127 128 129 130

    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) */
131
    /**@}*/
132

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

136 137
    /* Subpicture unit */
    spu_t            *p_spu;
138

139
    /* Statistics */
140 141 142 143 144 145 146
    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
                                           for the calculation of the
                                           jitter  */
    /** delay created by internal caching */
147
    int                 i_pts_delay;
148

149 150
    /* Filter chain */
    char *psz_filter_chain;
151
    vlc_bool_t b_filter_change;
152 153 154

    /* Misc */
    vlc_bool_t       b_snapshot;     /**< take one snapshot on the next loop */
155
};
Michel Kaempf's avatar
Michel Kaempf committed
156

157 158 159 160 161
#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

162 163 164 165 166 167
/** \defgroup vout_changes Flags for changes
 * These flags are set in the vout_thread_t::i_changes field when another
 * thread changed a variable
 * @{
 */
/** b_info changed */
168
#define VOUT_INFO_CHANGE        0x0001
169
/** b_grayscale changed */
170
#define VOUT_GRAYSCALE_CHANGE   0x0002
171
/** b_interface changed */
172
#define VOUT_INTF_CHANGE        0x0004
173
/** b_scale changed */
174
#define VOUT_SCALE_CHANGE       0x0008
175 176 177 178 179 180 181 182 183 184 185 186
/** 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
187 188 189 190
/** cropping parameters changed */
#define VOUT_CROP_CHANGE        0x1000
/** aspect ratio changed */
#define VOUT_ASPECT_CHANGE      0x2000
191
/** change/recreate picture buffers */
192
#define VOUT_PICTURE_BUFFERS_CHANGE 0x4000
193
/**@}*/
194

195 196 197 198 199 200 201 202
/* 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

203 204
#define MAX_JITTER_SAMPLES      20

205
/*****************************************************************************
Michel Kaempf's avatar
Michel Kaempf committed
206
 * Prototypes
207
 *****************************************************************************/
208 209 210 211
#define vout_Request(a,b,c) __vout_Request(VLC_OBJECT(a),b,c)
VLC_EXPORT( vout_thread_t *, __vout_Request,    ( vlc_object_t *, vout_thread_t *, video_format_t * ) );
#define vout_Create(a,b) __vout_Create(VLC_OBJECT(a),b)
VLC_EXPORT( vout_thread_t *, __vout_Create,       ( vlc_object_t *, video_format_t * ) );
212
VLC_EXPORT( void,            vout_Destroy,        ( vout_thread_t * ) );
213
VLC_EXPORT( int, vout_VarCallback, ( vlc_object_t *, const char *, vlc_value_t, vlc_value_t, void * ) );
214

215
VLC_EXPORT( int,             vout_ChromaCmp,      ( uint32_t, uint32_t ) );
216

217
VLC_EXPORT( picture_t *,     vout_CreatePicture,  ( vout_thread_t *, vlc_bool_t, vlc_bool_t, unsigned int ) );
218
VLC_EXPORT( void,            vout_InitFormat,     ( video_frame_format_t *, uint32_t, int, int, int ) );
219 220 221 222 223
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 * ) );
224
VLC_EXPORT( void,            vout_PlacePicture,   ( vout_thread_t *, unsigned int, unsigned int, unsigned int *, unsigned int *, unsigned int *, unsigned int * ) );
225 226
picture_t *     vout_RenderPicture  ( vout_thread_t *, picture_t *,
                                                       subpicture_t * );
227 228

VLC_EXPORT( int, vout_vaControlDefault, ( vout_thread_t *, int, va_list ) );
Gildas Bazin's avatar
Gildas Bazin committed
229 230
VLC_EXPORT( void *, vout_RequestWindow, ( vout_thread_t *, int *, int *, unsigned int *, unsigned int * ) );
VLC_EXPORT( void,   vout_ReleaseWindow, ( vout_thread_t *, void * ) );
231
VLC_EXPORT( int, vout_ControlWindow, ( vout_thread_t *, void *, int, va_list ) );
232 233
void vout_IntfInit( vout_thread_t * );

Gildas Bazin's avatar
Gildas Bazin committed
234

235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256
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
{
257 258
    VOUT_GET_SIZE,         /* arg1= unsigned int*, arg2= unsigned int*, res= */
    VOUT_SET_SIZE,         /* arg1= unsigned int, arg2= unsigned int, res= */
259
    VOUT_SET_STAY_ON_TOP,  /* arg1= vlc_bool_t       res=    */
260
    VOUT_REPARENT,
261
    VOUT_SNAPSHOT,
262 263
    VOUT_CLOSE,
    VOUT_SET_FOCUS         /* arg1= vlc_bool_t       res=    */
264 265
};

266 267 268
/**
 * @}
 */