video_output.h 11.8 KB
Newer Older
1
/*****************************************************************************
Michel Kaempf's avatar
Michel Kaempf committed
2
 * video_output.h : video output thread
3 4
 *****************************************************************************
 * Copyright (C) 1999, 2000 VideoLAN
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 22
 * 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., 59 Temple Place - Suite 330, Boston, MA  02111, 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
 *
Sam Hocevar's avatar
 
Sam Hocevar committed
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 */
Sam Hocevar's avatar
 
Sam Hocevar committed
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;
Sam Hocevar's avatar
 
Sam Hocevar committed
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 87
    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 */
    vlc_bool_t          b_override_aspect;       /**< aspect ratio overriden */
88
    uint32_t            render_time;           /**< last picture render time */
89 90
    unsigned int        i_window_width;              /**< video window width */
    unsigned int        i_window_height;            /**< video window height */
Gildas Bazin's avatar
 
Gildas Bazin committed
91
    unsigned int        i_alignment;          /**< video alignment in window */
92 93 94

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

97 98
    /** \name Plugin used and shortcuts to access its capabilities */
    /**@{*/
99 100 101 102 103 104
    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 * );
105
    int       ( *pf_control )    ( vout_thread_t *, int, va_list );
106
    /**@}*/
107

108 109
    /** \name Statistics
     * These numbers are not supposed to be accurate, but are a
110
     * good indication of the thread status */
111 112 113 114 115 116 117 118 119 120 121 122 123
    /**@{*/
    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 */
    /**@}*/
Sam Hocevar's avatar
 
Sam Hocevar committed
124 125

    /* Picture and subpicture heaps */
126
    picture_t           p_picture[2*VOUT_MAX_PICTURES+1];      /**< pictures */
127
    subpicture_t        p_subpicture[VOUT_MAX_PICTURES];    /**< subpictures */
128 129 130 131
    subpicture_t        *p_default_channel;   /**< subpicture in the default
                                                   channel */
    int                 i_channel_count;       /**< index of last subpicture
                                                    channel registered */
Christophe Massiot's avatar
Christophe Massiot committed
132

133
    /* Statistics */
134 135 136 137 138 139 140
    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 */
Gildas Bazin's avatar
 
Gildas Bazin committed
141
    int                 i_pts_delay;
142

Gildas Bazin's avatar
 
Gildas Bazin committed
143 144
    /* Filter chain */
    char *psz_filter_chain;
Gildas Bazin's avatar
 
Gildas Bazin committed
145
    vlc_bool_t b_filter_change;
146 147 148

    /* text renderer data */
    text_renderer_sys_t * p_text_renderer_data;        /**< private data for
149
                                                           the text renderer */
150
    module_t *            p_text_renderer_module;  /**< text renderer module */
151
    /** callback used when a new string needs to be shown on the vout */
152 153 154
    subpicture_t * ( *pf_add_string ) ( vout_thread_t *, int, char *,
                                        text_style_t *, int, int, int, mtime_t,
                                        mtime_t );
155
};
Michel Kaempf's avatar
Michel Kaempf committed
156

Sam Hocevar's avatar
 
Sam Hocevar committed
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
/** change/recreate picture buffers */
#define VOUT_PICTURE_BUFFERS_CHANGE 0x1000
189
/**@}*/
190

Gildas Bazin's avatar
 
Gildas Bazin committed
191 192 193 194 195 196 197 198
/* 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

199 200
#define MAX_JITTER_SAMPLES      20

201
/*****************************************************************************
Michel Kaempf's avatar
Michel Kaempf committed
202
 * Prototypes
203
 *****************************************************************************/
204 205 206 207 208
#define vout_Request(a,b,c,d,e,f) __vout_Request(VLC_OBJECT(a),b,c,d,e,f)
VLC_EXPORT( vout_thread_t *, __vout_Request,      ( vlc_object_t *, vout_thread_t *, unsigned int, unsigned int, uint32_t, unsigned int ) );
#define vout_Create(a,b,c,d,e) __vout_Create(VLC_OBJECT(a),b,c,d,e)
VLC_EXPORT( vout_thread_t *, __vout_Create,       ( vlc_object_t *, unsigned int, unsigned int, uint32_t, unsigned int ) );
VLC_EXPORT( void,            vout_Destroy,        ( vout_thread_t * ) );
209
VLC_EXPORT( int, vout_VarCallback, ( vlc_object_t *, const char *, vlc_value_t, vlc_value_t, void * ) );
Sam Hocevar's avatar
 
Sam Hocevar committed
210

211
VLC_EXPORT( int,             vout_ChromaCmp,      ( uint32_t, uint32_t ) );
212

213
VLC_EXPORT( picture_t *,     vout_CreatePicture,  ( vout_thread_t *, vlc_bool_t, vlc_bool_t, unsigned int ) );
Gildas Bazin's avatar
 
Gildas Bazin committed
214 215
VLC_EXPORT( void,            vout_InitFormat,     ( video_frame_format_t *, uint32_t, int, int, int ) );
VLC_EXPORT( void,            vout_InitPicture,    ( vlc_object_t *, picture_t *, uint32_t, int, int, int ) );
Gildas Bazin's avatar
 
Gildas Bazin committed
216
VLC_EXPORT( void,            vout_AllocatePicture,( vlc_object_t *, picture_t *, uint32_t, int, int, int ) );
217 218 219 220 221
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 * ) );
222
VLC_EXPORT( void,            vout_PlacePicture,   ( vout_thread_t *, unsigned int, unsigned int, unsigned int *, unsigned int *, unsigned int *, unsigned int * ) );
Sam Hocevar's avatar
 
Sam Hocevar committed
223 224
picture_t *     vout_RenderPicture  ( vout_thread_t *, picture_t *,
                                                       subpicture_t * );
225 226

VLC_EXPORT( int, vout_vaControlDefault, ( vout_thread_t *, int, va_list ) );
Gildas Bazin's avatar
Gildas Bazin committed
227 228
VLC_EXPORT( void *, vout_RequestWindow, ( vout_thread_t *, int *, int *, unsigned int *, unsigned int * ) );
VLC_EXPORT( void,   vout_ReleaseWindow, ( vout_thread_t *, void * ) );
229
VLC_EXPORT( int, vout_ControlWindow, ( vout_thread_t *, void *, int, va_list ) );
Gildas Bazin's avatar
Gildas Bazin committed
230

231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252
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
{
253 254
    VOUT_SET_ZOOM,         /* arg1= double           res=    */
    VOUT_SET_STAY_ON_TOP,  /* arg1= vlc_bool_t       res=    */
255 256
    VOUT_REPARENT,
    VOUT_CLOSE
257 258
};

259 260 261 262
/**
 * \addtogroup subpicture
 * @{
 */
263
VLC_EXPORT( subpicture_t *,  vout_CreateSubPicture,   ( vout_thread_t *, int, int ) );
264 265
VLC_EXPORT( void,            vout_DestroySubPicture,  ( vout_thread_t *, subpicture_t * ) );
VLC_EXPORT( void,            vout_DisplaySubPicture,  ( vout_thread_t *, subpicture_t * ) );
266 267
VLC_EXPORT( int,             vout_RegisterOSDChannel, ( vout_thread_t * ) );
VLC_EXPORT( void,            vout_ClearOSDChannel,    ( vout_thread_t *, int ) );
268

Sam Hocevar's avatar
 
Sam Hocevar committed
269
subpicture_t *  vout_SortSubPictures    ( vout_thread_t *, mtime_t );
Sam Hocevar's avatar
 
Sam Hocevar committed
270 271
void            vout_RenderSubPictures  ( vout_thread_t *, picture_t *,
                                                           subpicture_t * );
272 273 274 275
/** @}*/
/**
 * @}
 */