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

zorglub's avatar
zorglub committed
27
/**
Sam Hocevar's avatar
Sam Hocevar committed
28
 * \file
zorglub's avatar
zorglub committed
29
30
31
 * This file is a collection of common definitions and types
 */

32
33
34
#ifndef VLC_COMMON_H
# define VLC_COMMON_H 1

35
/*****************************************************************************
36
 * Required vlc headers
37
 *****************************************************************************/
38
#if defined( _MSC_VER )
gbazin's avatar
   
gbazin committed
39
#   pragma warning( disable : 4244 )
40
41
#endif

42
43
#include "vlc_config.h"

Sam Hocevar's avatar
 
Sam Hocevar committed
44
45
46
/*****************************************************************************
 * Required system headers
 *****************************************************************************/
gbazin's avatar
   
gbazin committed
47
#include <stdlib.h>
48
49
#include <stdarg.h>

50
#include <string.h>
51
#include <stdio.h>
52
#include <inttypes.h>
53
#include <stddef.h>
Sam Hocevar's avatar
   
Sam Hocevar committed
54

55
56
57
58
#ifndef __cplusplus
# include <stdbool.h>
#endif

59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
/* Try to fix format strings for all versions of mingw and mingw64 */
#if defined( _WIN32 ) && defined( __USE_MINGW_ANSI_STDIO )
 #undef PRId64
 #define PRId64 "lld"
 #undef PRIi64
 #define PRIi64 "lli"
 #undef PRIu64
 #define PRIu64 "llu"
 #undef PRIo64
 #define PRIo64 "llo"
 #undef PRIx64
 #define PRIx64 "llx"
 #define snprintf        __mingw_snprintf
 #define vsnprintf       __mingw_vsnprintf
#endif

75
76
/* Format string sanity checks */
#ifdef __GNUC__
77
#   if defined( _WIN32 ) && (__GNUC__ > 4 || ( __GNUC__ == 4 && __GNUC_MINOR__ >= 4 ) )
78
79
80
81
#     define LIBVLC_FORMAT(x,y) __attribute__ ((format(gnu_printf,x,y)))
#   else
#     define LIBVLC_FORMAT(x,y) __attribute__ ((format(printf,x,y)))
#   endif
82
#   define LIBVLC_FORMAT_ARG(x) __attribute__ ((format_arg(x)))
83
#   define LIBVLC_USED __attribute__ ((warn_unused_result))
84
#   define LIBVLC_MALLOC __attribute__ ((malloc))
85
86
#else
#   define LIBVLC_FORMAT(x,y)
87
#   define LIBVLC_FORMAT_ARG(x)
88
#   define LIBVLC_USED
89
#   define LIBVLC_MALLOC
90
91
#endif

92
93
94
95
96
97
98
99
100
/* Branch prediction */
#ifdef __GNUC__
#   define likely(p)   __builtin_expect(!!(p), 1)
#   define unlikely(p) __builtin_expect(!!(p), 0)
#else
#   define likely(p)   (!!(p))
#   define unlikely(p) (!!(p))
#endif

Sam Hocevar's avatar
 
Sam Hocevar committed
101
102
103
/*****************************************************************************
 * Basic types definitions
 *****************************************************************************/
104
#if defined( WIN32 ) || defined( UNDER_CE )
gbazin's avatar
   
gbazin committed
105
#   include <malloc.h>
106
107
108
#   ifndef PATH_MAX
#       define PATH_MAX MAX_PATH
#   endif
gbazin's avatar
   
gbazin committed
109
110
#endif

Sam Hocevar's avatar
 
Sam Hocevar committed
111
112
113
/* Counter for statistics and profiling */
typedef unsigned long       count_t;

114
/* Audio volume */
115
116
typedef uint16_t            audio_volume_t;

sigmunau's avatar
sigmunau committed
117
118
119
/**
 * High precision date or time interval
 *
120
121
 * Store a high precision date or time interval. The maximum precision is the
 * microsecond, and a 64 bits integer is used to avoid overflows (maximum
Sam Hocevar's avatar
 
Sam Hocevar committed
122
 * time interval is then 292271 years, which should be long enough for any
123
124
 * video). Dates are stored as microseconds since a common date (usually the
 * epoch). Note that date and time intervals can be manipulated using regular
Sam Hocevar's avatar
 
Sam Hocevar committed
125
 * arithmetic operators, and that no special functions are required.
sigmunau's avatar
sigmunau committed
126
 */
127
typedef int64_t mtime_t;
Sam Hocevar's avatar
 
Sam Hocevar committed
128

sigmunau's avatar
sigmunau committed
129
/**
130
 * The vlc_fourcc_t type.
sigmunau's avatar
sigmunau committed
131
 *
132
 * See http://www.webartz.com/fourcc/ for a very detailed list.
sigmunau's avatar
sigmunau committed
133
 */
134
typedef uint32_t vlc_fourcc_t;
135

136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
#ifdef WORDS_BIGENDIAN
#   define VLC_FOURCC( a, b, c, d ) \
        ( ((uint32_t)d) | ( ((uint32_t)c) << 8 ) \
           | ( ((uint32_t)b) << 16 ) | ( ((uint32_t)a) << 24 ) )
#   define VLC_TWOCC( a, b ) \
        ( (uint16_t)(b) | ( (uint16_t)(a) << 8 ) )

#else
#   define VLC_FOURCC( a, b, c, d ) \
        ( ((uint32_t)a) | ( ((uint32_t)b) << 8 ) \
           | ( ((uint32_t)c) << 16 ) | ( ((uint32_t)d) << 24 ) )
#   define VLC_TWOCC( a, b ) \
        ( (uint16_t)(a) | ( (uint16_t)(b) << 8 ) )

#endif

152
153
154
155
156
157
158
/**
 * Translate a vlc_fourcc into its string representation. This function
 * assumes there is enough room in psz_fourcc to store 4 characters in.
 *
 * \param fcc a vlc_fourcc_t
 * \param psz_fourcc string to store string representation of vlc_fourcc in
 */
159
static inline void vlc_fourcc_to_char( vlc_fourcc_t fcc, char *psz_fourcc )
160
{
161
    memcpy( psz_fourcc, &fcc, 4 );
162
163
164
}

#define vlc_fourcc_to_char( a, b ) \
165
        vlc_fourcc_to_char( (vlc_fourcc_t)(a), (char *)(b) )
166

Sam Hocevar's avatar
 
Sam Hocevar committed
167
168
169
170
/*****************************************************************************
 * Classes declaration
 *****************************************************************************/

171
/* Internal types */
172
173
typedef struct vlc_list_t vlc_list_t;
typedef struct vlc_object_t vlc_object_t;
174
typedef struct libvlc_int_t libvlc_int_t;
175
typedef struct date_t date_t;
zorglub's avatar
zorglub committed
176
177
typedef struct dict_entry_t dict_entry_t;
typedef struct dict_t dict_t;
178

gbazin's avatar
   
gbazin committed
179
/* Playlist */
hartman's avatar
hartman committed
180
181
182
183
184
185

/* FIXME */
/**
 * Playlist commands
 */
typedef enum {
zorglub's avatar
zorglub committed
186
    PLAYLIST_PLAY,      /**< No arg.                            res=can fail*/
187
188
    PLAYLIST_VIEWPLAY,  /**< arg1= playlist_item_t*,*/
                        /**  arg2 = playlist_item_t*          , res=can fail */
zorglub's avatar
zorglub committed
189
190
191
    PLAYLIST_PAUSE,     /**< No arg                             res=can fail*/
    PLAYLIST_STOP,      /**< No arg                             res=can fail*/
    PLAYLIST_SKIP,      /**< arg1=int,                          res=can fail*/
hartman's avatar
hartman committed
192
193
194
} playlist_command_t;


195
196
typedef struct playlist_t playlist_t;
typedef struct playlist_item_t playlist_item_t;
zorglub's avatar
zorglub committed
197
typedef struct playlist_view_t playlist_view_t;
zorglub's avatar
zorglub committed
198
199
typedef struct services_discovery_t services_discovery_t;
typedef struct services_discovery_sys_t services_discovery_sys_t;
zorglub's avatar
zorglub committed
200
typedef struct playlist_add_t playlist_add_t;
Sam Hocevar's avatar
 
Sam Hocevar committed
201

202
/* Modules */
203
204
205
206
typedef struct module_bank_t module_bank_t;
typedef struct module_t module_t;
typedef struct module_config_t module_config_t;
typedef struct module_symbols_t module_symbols_t;
207
typedef struct module_cache_t module_cache_t;
Sam Hocevar's avatar
 
Sam Hocevar committed
208

zorglub's avatar
zorglub committed
209
210
typedef struct config_category_t config_category_t;

Sam Hocevar's avatar
 
Sam Hocevar committed
211
/* Input */
212
typedef struct input_thread_t input_thread_t;
213
typedef struct input_thread_sys_t input_thread_sys_t;
214
typedef struct input_item_t input_item_t;
jpd's avatar
jpd committed
215
typedef struct input_item_node_t input_item_node_t;
216
typedef struct access_t access_t;
217
typedef struct access_sys_t access_sys_t;
218
219
220
typedef struct stream_t     stream_t;
typedef struct stream_sys_t stream_sys_t;
typedef struct demux_t  demux_t;
221
typedef struct demux_sys_t demux_sys_t;
222
223
224
typedef struct es_out_t     es_out_t;
typedef struct es_out_id_t  es_out_id_t;
typedef struct es_out_sys_t es_out_sys_t;
225
typedef struct es_descriptor_t es_descriptor_t;
gbazin's avatar
gbazin committed
226
typedef struct seekpoint_t seekpoint_t;
227
228
typedef struct info_t info_t;
typedef struct info_category_t info_category_t;
229
typedef struct input_attachment_t input_attachment_t;
Sam Hocevar's avatar
 
Sam Hocevar committed
230

231
232
233
234
/* Format */
typedef struct audio_format_t audio_format_t;
typedef struct video_format_t video_format_t;
typedef struct subs_format_t subs_format_t;
gbazin's avatar
   
gbazin committed
235
236
typedef struct es_format_t es_format_t;
typedef struct video_palette_t video_palette_t;
237

Sam Hocevar's avatar
 
Sam Hocevar committed
238
/* Audio */
239
240
typedef struct aout_instance_t aout_instance_t;
typedef struct aout_sys_t aout_sys_t;
241
typedef struct aout_fifo_t aout_fifo_t;
242
typedef struct aout_input_t aout_input_t;
243
typedef struct block_t aout_buffer_t;
gbazin's avatar
   
gbazin committed
244
typedef audio_format_t audio_sample_format_t;
245
typedef struct audio_date_t audio_date_t;
gbazin's avatar
   
gbazin committed
246
typedef struct aout_filter_t aout_filter_t;
Sam Hocevar's avatar
 
Sam Hocevar committed
247
248

/* Video */
249
250
typedef struct vout_thread_t vout_thread_t;
typedef struct vout_sys_t vout_sys_t;
251

gbazin's avatar
   
gbazin committed
252
typedef video_format_t video_frame_format_t;
253
254
255
typedef struct picture_t picture_t;
typedef struct picture_sys_t picture_sys_t;
typedef struct picture_heap_t picture_heap_t;
256

257
/* Subpictures */
258
typedef struct spu_t spu_t;
259
260
typedef struct subpicture_t subpicture_t;
typedef struct subpicture_sys_t subpicture_sys_t;
261
typedef struct subpicture_region_t subpicture_region_t;
262
typedef struct text_style_t text_style_t;
Sam Hocevar's avatar
 
Sam Hocevar committed
263

264
265
typedef struct image_handler_t image_handler_t;

266
267
/* Stream output */
typedef struct sout_instance_t sout_instance_t;
268
269
typedef struct sout_instance_sys_t sout_instance_sys_t;

270
typedef struct sout_input_t sout_input_t;
271
typedef struct sout_packetizer_input_t sout_packetizer_input_t;
272

273
typedef struct sout_access_out_t sout_access_out_t;
274
275
typedef struct sout_access_out_sys_t   sout_access_out_sys_t;

276
typedef struct sout_mux_t sout_mux_t;
277
278
typedef struct sout_mux_sys_t sout_mux_sys_t;

279
typedef struct sout_stream_t    sout_stream_t;
280
281
typedef struct sout_stream_sys_t sout_stream_sys_t;

282
typedef struct config_chain_t       config_chain_t;
zorglub's avatar
zorglub committed
283
284
typedef struct session_descriptor_t session_descriptor_t;
typedef struct announce_method_t announce_method_t;
285

286
287
typedef struct sout_param_t sout_param_t;
typedef struct sout_pcat_t sout_pcat_t;
288
289
290
291
292
293
294
295
typedef struct sout_std_t sout_std_t;
typedef struct sout_display_t sout_display_t;
typedef struct sout_duplicate_t sout_duplicate_t;
typedef struct sout_transcode_t sout_transcode_t;
typedef struct sout_chain_t sout_chain_t;
typedef struct streaming_profile_t streaming_profile_t;
typedef struct sout_module_t sout_module_t;
typedef struct sout_gui_descr_t sout_gui_descr_t;
zorglub's avatar
zorglub committed
296
typedef struct profile_parser_t profile_parser_t;
297

Sam Hocevar's avatar
 
Sam Hocevar committed
298
/* Decoders */
Laurent Aimar's avatar
Laurent Aimar committed
299
300
301
typedef struct decoder_t         decoder_t;
typedef struct decoder_sys_t     decoder_sys_t;
typedef struct decoder_synchro_t decoder_synchro_t;
Sam Hocevar's avatar
 
Sam Hocevar committed
302

gbazin's avatar
   
gbazin committed
303
304
305
306
/* Encoders */
typedef struct encoder_t      encoder_t;
typedef struct encoder_sys_t  encoder_sys_t;

307
308
309
310
/* Filters */
typedef struct filter_t filter_t;
typedef struct filter_sys_t filter_sys_t;

311
/* Network */
312
typedef struct network_socket_t network_socket_t;
313
typedef struct virtual_socket_t v_socket_t;
Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
314
315
typedef struct sockaddr sockaddr;
typedef struct addrinfo addrinfo;
316
typedef struct vlc_acl_t vlc_acl_t;
317
typedef struct vlc_url_t vlc_url_t;
318

319
320
/* Misc */
typedef struct iso639_lang_t iso639_lang_t;
zorglub's avatar
zorglub committed
321
typedef struct device_t device_t;
322
323
typedef struct device_probe_t device_probe_t;
typedef struct probe_sys_t probe_sys_t;
324

325
326
327
328
/* block */
typedef struct block_t      block_t;
typedef struct block_fifo_t block_fifo_t;

329
330
331
332
333
334
335
/* httpd */
typedef struct httpd_t          httpd_t;
typedef struct httpd_host_t     httpd_host_t;
typedef struct httpd_url_t      httpd_url_t;
typedef struct httpd_client_t   httpd_client_t;
typedef struct httpd_callback_sys_t httpd_callback_sys_t;
typedef struct httpd_message_t  httpd_message_t;
Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
336
typedef int    (*httpd_callback_t)( httpd_callback_sys_t *, httpd_client_t *, httpd_message_t *answer, const httpd_message_t *query );
337
338
typedef struct httpd_file_t     httpd_file_t;
typedef struct httpd_file_sys_t httpd_file_sys_t;
339
340
341
typedef int (*httpd_file_callback_t)( httpd_file_sys_t *, httpd_file_t *, uint8_t *psz_request, uint8_t **pp_data, int *pi_data );
typedef struct httpd_handler_t  httpd_handler_t;
typedef struct httpd_handler_sys_t httpd_handler_sys_t;
Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
342
typedef int (*httpd_handler_callback_t)( httpd_handler_sys_t *, httpd_handler_t *, char *psz_url, uint8_t *psz_request, int i_type, uint8_t *p_in, int i_in, char *psz_remote_addr, char *psz_remote_host, uint8_t **pp_data, int *pi_data );
343
344
345
typedef struct httpd_redirect_t httpd_redirect_t;
typedef struct httpd_stream_t httpd_stream_t;

Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
346
347
348
349
/* TLS support */
typedef struct tls_server_t tls_server_t;
typedef struct tls_session_t tls_session_t;

350
351
352
/* Hashing */
typedef struct md5_s md5_t;

gbazin's avatar
gbazin committed
353
354
355
356
357
358
/* XML */
typedef struct xml_t xml_t;
typedef struct xml_sys_t xml_sys_t;
typedef struct xml_reader_t xml_reader_t;
typedef struct xml_reader_sys_t xml_reader_sys_t;

359
360
361
/* vod server */
typedef struct vod_t     vod_t;
typedef struct vod_sys_t vod_sys_t;
362
typedef struct vod_media_t vod_media_t;
363

364
365
366
367
/* opengl */
typedef struct opengl_t     opengl_t;
typedef struct opengl_sys_t opengl_sys_t;

368
369
370
371
372
373
374
/* osdmenu */
typedef struct osd_menu_t   osd_menu_t;
typedef struct osd_state_t  osd_state_t;
typedef struct osd_event_t  osd_event_t;
typedef struct osd_button_t osd_button_t;
typedef struct osd_menu_state_t osd_menu_state_t;

375
/* VLM */
376
377
typedef struct vlm_t         vlm_t;
typedef struct vlm_message_t vlm_message_t;
378

379
/* misc */
380
typedef struct vlc_meta_t    vlc_meta_t;
381

382
/* Stats */
383
384
385
typedef struct counter_t     counter_t;
typedef struct counter_sample_t counter_sample_t;
typedef struct stats_handler_t stats_handler_t;
zorglub's avatar
zorglub committed
386
typedef struct input_stats_t input_stats_t;
387

388
389
390
/* Update */
typedef struct update_t update_t;
typedef struct update_iterator_t update_iterator_t;
391

392
393
394
/* Meta engine */
typedef struct meta_engine_t meta_engine_t;

395
396
/* stat/lstat/fstat */
#ifdef WIN32
397
#include <sys/stat.h>
398

geal's avatar
geal committed
399
# ifndef UNDER_CE
400
struct _stati64;
401
402
#define stat _stati64
#define fstat _fstati64
403
404
#endif

405
/* You should otherwise use utf8_stat and utf8_lstat. */
406
407
408
409
#else
struct stat;
#endif

410
411
412
413
414
415
/**
 * VLC value structure
 */
typedef union
{
    int             i_int;
416
    bool            b_bool;
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
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
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
    float           f_float;
    char *          psz_string;
    void *          p_address;
    vlc_object_t *  p_object;
    vlc_list_t *    p_list;
    mtime_t         i_time;

    struct { char *psz_name; int i_object_id; } var;

   /* Make sure the structure is at least 64bits */
    struct { char a, b, c, d, e, f, g, h; } padding;

} vlc_value_t;

/**
 * VLC list structure
 */
struct vlc_list_t
{
    int             i_count;
    vlc_value_t *   p_values;
    int *           pi_types;

};

/**
 * \defgroup var_type Variable types
 * These are the different types a vlc variable can have.
 * @{
 */
#define VLC_VAR_VOID      0x0010
#define VLC_VAR_BOOL      0x0020
#define VLC_VAR_INTEGER   0x0030
#define VLC_VAR_HOTKEY    0x0031
#define VLC_VAR_STRING    0x0040
#define VLC_VAR_MODULE    0x0041
#define VLC_VAR_FILE      0x0042
#define VLC_VAR_DIRECTORY 0x0043
#define VLC_VAR_VARIABLE  0x0044
#define VLC_VAR_FLOAT     0x0050
#define VLC_VAR_TIME      0x0060
#define VLC_VAR_ADDRESS   0x0070
#define VLC_VAR_MUTEX     0x0080
#define VLC_VAR_LIST      0x0090
/**@}*/

/*****************************************************************************
 * Error values (shouldn't be exposed)
 *****************************************************************************/
#define VLC_SUCCESS         -0                                   /* No error */
#define VLC_ENOMEM          -1                          /* Not enough memory */
#define VLC_ETIMEOUT        -3                                    /* Timeout */

#define VLC_ENOMOD         -10                           /* Module not found */

#define VLC_ENOOBJ         -20                           /* Object not found */

#define VLC_ENOVAR         -30                         /* Variable not found */
#define VLC_EBADVAR        -31                         /* Bad variable value */

#define VLC_ENOITEM        -40                           /**< Item not found */

#define VLC_EEXIT         -255                             /* Program exited */
#define VLC_EEXITSUCCESS  -999                /* Program exited successfully */
#define VLC_EGENERIC      -666                              /* Generic error */

483
484
485
486
487
488
489
490
491
/*****************************************************************************
 * Variable callbacks
 *****************************************************************************/
typedef int ( * vlc_callback_t ) ( vlc_object_t *,      /* variable's object */
                                   char const *,            /* variable name */
                                   vlc_value_t,                 /* old value */
                                   vlc_value_t,                 /* new value */
                                   void * );                /* callback data */

gbazin's avatar
   
gbazin committed
492
493
494
/*****************************************************************************
 * Plug-in stuff
 *****************************************************************************/
495

496
497
498
499
500
#ifdef __cplusplus
# define LIBVLC_EXTERN extern "C"
#else
# define LIBVLC_EXTERN extern
#endif
501
#if defined (WIN32) && defined (DLL_EXPORT)
geal's avatar
geal committed
502
503
504
#if defined (UNDER_CE)
# include <windef.h>
#endif
505
# define LIBVLC_EXPORT __declspec(dllexport)
506
#else
507
# define LIBVLC_EXPORT
gbazin's avatar
   
gbazin committed
508
#endif
509
510
#define VLC_EXPORT( type, name, args ) \
                        LIBVLC_EXTERN LIBVLC_EXPORT type name args
gbazin's avatar
   
gbazin committed
511

512
513
514
/*****************************************************************************
 * OS-specific headers and thread types
 *****************************************************************************/
515
#if defined( WIN32 ) || defined( UNDER_CE )
516
517
518
519
#   define WIN32_LEAN_AND_MEAN
#   include <windows.h>
#endif

Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
520
#include "vlc_mtime.h"
521
522
523
524
525
526
527
528
#include "vlc_threads.h"

/*****************************************************************************
 * Common structure members
 *****************************************************************************/

/* VLC_COMMON_MEMBERS : members common to all basic vlc objects */
#define VLC_COMMON_MEMBERS                                                  \
529
530
531
532
/** \name VLC_COMMON_MEMBERS                                                \
 * these members are common for all vlc objects                             \
 */                                                                         \
/**@{*/                                                                     \
Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
533
    const char *psz_object_type;                                            \
534
                                                                            \
535
536
    /* Messages header */                                                   \
    char *psz_header;                                                       \
537
    int  i_flags;                                                           \
538
                                                                            \
Sam Hocevar's avatar
Sam Hocevar committed
539
    /* Object properties */                                                 \
540
    volatile bool b_die;                   /**< set by the outside */ \
541
    bool b_force;      /**< set by the outside (eg. module_need()) */ \
542
                                                                            \
Sam Hocevar's avatar
Sam Hocevar committed
543
    /* Stuff related to the libvlc structure */                             \
544
    libvlc_int_t *p_libvlc;                  /**< (root of all evil) - 1 */ \
545
                                                                            \
546
    vlc_object_t *  p_parent;                            /**< our parent */ \
547
                                                                            \
548
/**@}*/                                                                     \
549

550
/* VLC_OBJECT: attempt at doing a clever cast */
551
#ifdef __GNUC__
552
553
554
555
556
557
558
559
560
# ifndef __cplusplus
#  define VLC_OBJECT( x ) \
    __builtin_choose_expr(__builtin_offsetof(__typeof__(*x), psz_object_type), \
                          (void)0 /* screw you */, (vlc_object_t *)(x))
# else
#  define VLC_OBJECT( x ) \
    ((vlc_object_t *)(x) \
      + 0 * __builtin_offsetof(__typeof__(*x), psz_object_type))
# endif
561
562
563
#else
# define VLC_OBJECT( x ) ((vlc_object_t *)(x))
#endif
564

565
typedef struct gc_object_t
566
{
567
568
569
570
    vlc_spinlock_t spin;
    uintptr_t      refs;
    void          (*pf_destructor) (struct gc_object_t *);
} gc_object_t;
571

572
573
574
575
/**
 * These members are common to all objects that wish to be garbage-collected.
 */
#define VLC_GC_MEMBERS gc_object_t vlc_gc_data;
576

577
578
579
VLC_EXPORT(void *, vlc_gc_init, (gc_object_t *, void (*)(gc_object_t *)));
VLC_EXPORT(void *, vlc_hold, (gc_object_t *));
VLC_EXPORT(void, vlc_release, (gc_object_t *));
580

581
582
583
584
#define vlc_gc_init( a,b ) vlc_gc_init( &(a)->vlc_gc_data, (b) )
#define vlc_gc_incref( a ) vlc_hold( &(a)->vlc_gc_data )
#define vlc_gc_decref( a ) vlc_release( &(a)->vlc_gc_data )
#define vlc_priv( gc, t ) ((t *)(((char *)(gc)) - offsetof(t, vlc_gc_data)))
585

Sam Hocevar's avatar
 
Sam Hocevar committed
586
587
588
589
590
591
592
593
594
595
/*****************************************************************************
 * Macros and inline functions
 *****************************************************************************/

/* CEIL: division with round to nearest greater integer */
#define CEIL(n, d)  ( ((n) / (d)) + ( ((n) % (d)) ? 1 : 0) )

/* PAD: PAD(n, d) = CEIL(n ,d) * d */
#define PAD(n, d)   ( ((n) % (d)) ? ((((n) / (d)) + 1) * (d)) : (n) )

Sam Hocevar's avatar
   
Sam Hocevar committed
596
597
598
/* __MAX and __MIN: self explanatory */
#ifndef __MAX
#   define __MAX(a, b)   ( ((a) > (b)) ? (a) : (b) )
Sam Hocevar's avatar
 
Sam Hocevar committed
599
#endif
Sam Hocevar's avatar
   
Sam Hocevar committed
600
601
#ifndef __MIN
#   define __MIN(a, b)   ( ((a) < (b)) ? (a) : (b) )
Sam Hocevar's avatar
 
Sam Hocevar committed
602
603
#endif

604
605
LIBVLC_USED
static inline int64_t GCD ( int64_t a, int64_t b )
606
{
607
608
609
610
611
612
613
    while( b )
    {
        int64_t c = a % b;
        a = b;
        b = c;
    }
    return a;
614
615
}

616
/* function imported from libavutil/common.h */
617
LIBVLC_USED
618
619
620
621
622
623
static inline uint8_t clip_uint8_vlc( int32_t a )
{
    if( a&(~255) ) return (-a)>>31;
    else           return a;
}

624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
/* Count leading zeroes */
LIBVLC_USED
static inline unsigned clz (unsigned x)
{
#ifdef __GNUC_
    return __builtin_clz (x);
#else
    unsigned i = sizeof (x) * 8;

    while (x)
    {
        x = x >> 1;
        i--;
    }
    return i;
#endif
}

#define clz8( x ) (clz(x) - ((sizeof(unsigned) - sizeof (uint8_t)) * 8))
#define clz16( x ) (clz(x) - ((sizeof(unsigned) - sizeof (uint16_t)) * 8))
/* XXX: this assumes that int is 32-bits or more */
#define clz32( x ) (clz(x) - ((sizeof(unsigned) - sizeof (uint32_t)) * 8))

647
/* Free and set set the variable to NULL */
648
#define FREENULL(a) do { free( a ); a = NULL; } while(0)
zorglub's avatar
zorglub committed
649

650
651
#define EMPTY_STR(str) (!str || !*str)

652
VLC_EXPORT( char const *, vlc_error, ( int ) LIBVLC_USED );
zorglub's avatar
zorglub committed
653

zorglub's avatar
zorglub committed
654
#include <vlc_arrays.h>
zorglub's avatar
zorglub committed
655

Sam Hocevar's avatar
 
Sam Hocevar committed
656
/* MSB (big endian)/LSB (little endian) conversions - network order is always
657
 * MSB, and should be used for both network communications and files. */
658
LIBVLC_USED
Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
659
static inline uint16_t U16_AT( const void * _p )
660
{
Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
661
    const uint8_t * p = (const uint8_t *)_p;
662
    return ( ((uint16_t)p[0] << 8) | p[1] );
663
}
664
665

LIBVLC_USED
Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
666
static inline uint32_t U32_AT( const void * _p )
667
{
Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
668
    const uint8_t * p = (const uint8_t *)_p;
669
670
    return ( ((uint32_t)p[0] << 24) | ((uint32_t)p[1] << 16)
              | ((uint32_t)p[2] << 8) | p[3] );
671
}
672
673

LIBVLC_USED
Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
674
static inline uint64_t U64_AT( const void * _p )
675
{
Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
676
    const uint8_t * p = (const uint8_t *)_p;
677
678
679
680
    return ( ((uint64_t)p[0] << 56) | ((uint64_t)p[1] << 48)
              | ((uint64_t)p[2] << 40) | ((uint64_t)p[3] << 32)
              | ((uint64_t)p[4] << 24) | ((uint64_t)p[5] << 16)
              | ((uint64_t)p[6] << 8) | p[7] );
681
}
682

683
LIBVLC_USED
Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
684
static inline uint16_t GetWLE( const void * _p )
685
{
Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
686
    const uint8_t * p = (const uint8_t *)_p;
687
688
    return ( ((uint16_t)p[1] << 8) | p[0] );
}
689
690

LIBVLC_USED
Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
691
static inline uint32_t GetDWLE( const void * _p )
692
{
Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
693
    const uint8_t * p = (const uint8_t *)_p;
694
695
696
    return ( ((uint32_t)p[3] << 24) | ((uint32_t)p[2] << 16)
              | ((uint32_t)p[1] << 8) | p[0] );
}
697
698

LIBVLC_USED
Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
699
static inline uint64_t GetQWLE( const void * _p )
700
{
Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
701
    const uint8_t * p = (const uint8_t *)_p;
702
703
704
705
706
707
708
709
710
711
    return ( ((uint64_t)p[7] << 56) | ((uint64_t)p[6] << 48)
              | ((uint64_t)p[5] << 40) | ((uint64_t)p[4] << 32)
              | ((uint64_t)p[3] << 24) | ((uint64_t)p[2] << 16)
              | ((uint64_t)p[1] << 8) | p[0] );
}

#define GetWBE( p )     U16_AT( p )
#define GetDWBE( p )    U32_AT( p )
#define GetQWBE( p )    U64_AT( p )

gbazin's avatar
   
gbazin committed
712
/* Helper writer functions */
713
#define SetWLE( p, v ) _SetWLE( (uint8_t*)(p), v)
gbazin's avatar
   
gbazin committed
714
715
716
717
718
719
static inline void _SetWLE( uint8_t *p, uint16_t i_dw )
{
    p[1] = ( i_dw >>  8 )&0xff;
    p[0] = ( i_dw       )&0xff;
}

720
#define SetDWLE( p, v ) _SetDWLE( (uint8_t*)(p), v)
gbazin's avatar
   
gbazin committed
721
722
723
724
725
726
727
static inline void _SetDWLE( uint8_t *p, uint32_t i_dw )
{
    p[3] = ( i_dw >> 24 )&0xff;
    p[2] = ( i_dw >> 16 )&0xff;
    p[1] = ( i_dw >>  8 )&0xff;
    p[0] = ( i_dw       )&0xff;
}
728
#define SetQWLE( p, v ) _SetQWLE( (uint8_t*)(p), v)
gbazin's avatar
   
gbazin committed
729
730
731
732
733
static inline void _SetQWLE( uint8_t *p, uint64_t i_qw )
{
    SetDWLE( p,   i_qw&0xffffffff );
    SetDWLE( p+4, ( i_qw >> 32)&0xffffffff );
}
734
#define SetWBE( p, v ) _SetWBE( (uint8_t*)(p), v)
735
736
737
738
739
740
static inline void _SetWBE( uint8_t *p, uint16_t i_dw )
{
    p[0] = ( i_dw >>  8 )&0xff;
    p[1] = ( i_dw       )&0xff;
}

741
#define SetDWBE( p, v ) _SetDWBE( (uint8_t*)(p), v)
742
743
744
745
746
747
748
static inline void _SetDWBE( uint8_t *p, uint32_t i_dw )
{
    p[0] = ( i_dw >> 24 )&0xff;
    p[1] = ( i_dw >> 16 )&0xff;
    p[2] = ( i_dw >>  8 )&0xff;
    p[3] = ( i_dw       )&0xff;
}
749
#define SetQWBE( p, v ) _SetQWBE( (uint8_t*)(p), v)
750
751
752
753
754
static inline void _SetQWBE( uint8_t *p, uint64_t i_qw )
{
    SetDWBE( p+4,   i_qw&0xffffffff );
    SetDWBE( p, ( i_qw >> 32)&0xffffffff );
}
755

756
757
758
759
760
#define hton16(i) htons(i)
#define hton32(i) htonl(i)
#define ntoh16(i) ntohs(i)
#define ntoh32(i) ntohl(i)

761
LIBVLC_USED
762
763
764
765
766
767
768
769
770
771
772
773
774
static inline uint64_t ntoh64 (uint64_t ll)
{
    union { uint64_t qw; uint8_t b[16]; } v = { ll };
    return ((uint64_t)v.b[0] << 56)
         | ((uint64_t)v.b[1] << 48)
         | ((uint64_t)v.b[2] << 40)
         | ((uint64_t)v.b[3] << 32)
         | ((uint64_t)v.b[4] << 24)
         | ((uint64_t)v.b[5] << 16)
         | ((uint64_t)v.b[6] <<  8)
         | ((uint64_t)v.b[7] <<  0);
}
#define hton64(i) ntoh64(i)
Sam Hocevar's avatar
 
Sam Hocevar committed
775

776
777
778
/* */
#define VLC_UNUSED(x) (void)(x)

779
/* Stuff defined in src/extras/libc.c */
780

781
#if defined(WIN32) || defined(UNDER_CE)
Sam Hocevar's avatar
 
Sam Hocevar committed
782
/* win32, cl and icl support */
Sam Hocevar's avatar
   
Sam Hocevar committed
783
#   if defined( _MSC_VER ) || !defined( __MINGW32__ )
Sam Hocevar's avatar
 
Sam Hocevar committed
784
785
#       define __attribute__(x)
#       define __inline__      __inline
gbazin's avatar
   
gbazin committed
786
#       define S_IFBLK         0x3000  /* Block */
Sam Hocevar's avatar
 
Sam Hocevar committed
787
788
789
790
791
792
793
794
795
#       define S_ISBLK(m)      (0)
#       define S_ISCHR(m)      (0)
#       define S_ISFIFO(m)     (((m)&_S_IFMT) == _S_IFIFO)
#       define S_ISREG(m)      (((m)&_S_IFMT) == _S_IFREG)
#   endif

/* several type definitions */
#   if defined( __MINGW32__ )
#       if !defined( _OFF_T_ )
796
797
            typedef long long _off_t;
            typedef _off_t off_t;
Sam Hocevar's avatar
 
Sam Hocevar committed
798
799
#           define _OFF_T_
#       else
gbazin's avatar
   
gbazin committed
800
801
802
#           ifdef off_t
#               undef off_t
#           endif
Sam Hocevar's avatar
 
Sam Hocevar committed
803
804
805
806
#           define off_t long long
#       endif
#   endif

807
#   if defined( _MSC_VER ) && !defined( __WXMSW__ )
Sam Hocevar's avatar
 
Sam Hocevar committed
808
#       if !defined( _OFF_T_DEFINED )
809
            typedef __int64 off_t;
Sam Hocevar's avatar
 
Sam Hocevar committed
810
811
#           define _OFF_T_DEFINED
#       else
812
            /* for wx compatibility typedef long off_t; */
Sam Hocevar's avatar
 
Sam Hocevar committed
813
814
815
816
#           define off_t __int64
#       endif
#   endif

ipkiss's avatar
   
ipkiss committed
817
#   if defined( __BORLANDC__ )
Sam Hocevar's avatar
   
Sam Hocevar committed
818
#       undef off_t
ipkiss's avatar
   
ipkiss committed
819
#       define off_t unsigned __int64
Sam Hocevar's avatar
   
Sam Hocevar committed
820
821
#   endif

gbazin's avatar
   
gbazin committed
822
823
#   ifndef O_NONBLOCK
#       define O_NONBLOCK 0
gbazin's avatar
   
gbazin committed
824
825
826
827
#   endif

#   ifndef alloca
#       define alloca _alloca
Sam Hocevar's avatar
 
Sam Hocevar committed
828
829
#   endif

830
#   include <tchar.h>
Sam Hocevar's avatar
 
Sam Hocevar committed
831
832
#endif

833
VLC_EXPORT( bool, vlc_ureduce, ( unsigned *, unsigned *, uint64_t, uint64_t, uint64_t ) );
834

835
836
/* iconv wrappers (defined in src/extras/libc.c) */
typedef void *vlc_iconv_t;
837
838
VLC_EXPORT( vlc_iconv_t, vlc_iconv_open, ( const char *, const char * ) LIBVLC_USED );
VLC_EXPORT( size_t, vlc_iconv, ( vlc_iconv_t, const char **, size_t *, char **, size_t * ) LIBVLC_USED );
839
840
VLC_EXPORT( int, vlc_iconv_close, ( vlc_iconv_t ) );

841
/* execve wrapper (defined in src/extras/libc.c) */
842
843
VLC_EXPORT( int, vlc_execve, ( vlc_object_t *p_object, int i_argc, char *const *pp_argv, char *const *pp_env, const char *psz_cwd, const char *p_in, size_t i_in, char **pp_data, size_t *pi_data ) LIBVLC_USED );
#define vlc_execve(a,b,c,d,e,f,g,h,i) vlc_execve(VLC_OBJECT(a),b,c,d,e,f,g,h,i)
844

845
846
847
/* dir wrappers (defined in src/extras/libc.c) */
VLC_EXPORT(int, vlc_wclosedir, ( void *_p_dir ));

848
849
VLC_EXPORT( void, vlc_tdestroy, ( void *, void (*)(void *) ) );

Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
850
/* Fast large memory copy and memory set */
851
852
VLC_EXPORT( void *, vlc_memcpy, ( void *, const void *, size_t ) );
VLC_EXPORT( void *, vlc_memset, ( void *, int, size_t ) );
Sam Hocevar's avatar
 
Sam Hocevar committed
853
854
855
856

/*****************************************************************************
 * I18n stuff
 *****************************************************************************/
857
VLC_EXPORT( char *, vlc_gettext, ( const char *msgid ) LIBVLC_FORMAT_ARG(1) );
858

859
LIBVLC_FORMAT_ARG(2)
Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
860
861
862
863
864
865
static inline const char *vlc_pgettext( const char *ctx, const char *id )
{
    const char *tr = vlc_gettext( id );
    return (tr == ctx) ? id : tr;
}

866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
/*****************************************************************************
 * Loosy memory allocation functions. Do not use in new code.
 *****************************************************************************/
static inline void *xmalloc (size_t len)
{
    void *ptr = malloc (len);
    if (unlikely (ptr == NULL))
        abort ();
    return ptr;
}

static inline void *xrealloc (void *ptr, size_t len)
{
    void *nptr = realloc (ptr, len);
    if (unlikely (nptr == NULL))
        abort ();
    return nptr;
}

885
886
887
/*****************************************************************************
 * libvlc features
 *****************************************************************************/
888
889
890
891
VLC_EXPORT( const char *, VLC_Version, ( void ) LIBVLC_USED );
VLC_EXPORT( const char *, VLC_CompileBy, ( void ) LIBVLC_USED );
VLC_EXPORT( const char *, VLC_CompileHost, ( void ) LIBVLC_USED );
VLC_EXPORT( const char *, VLC_Compiler, ( void ) LIBVLC_USED );
892

893
/*****************************************************************************
894
 * Additional vlc stuff
895
 *****************************************************************************/
896
#include "vlc_messages.h"
Sam Hocevar's avatar
Sam Hocevar committed
897
#include "vlc_objects.h"
898
#include "vlc_variables.h"
zorglub's avatar
zorglub committed
899
#include "vlc_modules.h"
Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
900
#include "vlc_main.h"
zorglub's avatar
zorglub committed
901
#include "vlc_configuration.h"
902

dionoea's avatar
dionoea committed
903
#if defined( WIN32 ) || defined( UNDER_CE )
dionoea's avatar
dionoea committed
904
#   define DIR_SEP_CHAR '\\'
dionoea's avatar
dionoea committed
905
#   define DIR_SEP "\\"
906
907
#   define PATH_SEP_CHAR ';'
#   define PATH_SEP ";"
dionoea's avatar
dionoea committed
908
#else
dionoea's avatar
dionoea committed
909
#   define DIR_SEP_CHAR '/'
dionoea's avatar
dionoea committed
910
#   define DIR_SEP "/"
911
912
#   define PATH_SEP_CHAR ':'
#   define PATH_SEP ":"
dionoea's avatar
dionoea committed
913
#endif
914

915
916
917
918
919
920
#define LICENSE_MSG \
  _("This program comes with NO WARRANTY, to the extent permitted by " \
    "law.\nYou may redistribute it under the terms of the GNU General " \
    "Public License;\nsee the file named COPYING for details.\n" \
    "Written by the VideoLAN team; see the AUTHORS file.\n")

921
#endif /* !VLC_COMMON_H */