]> git.sesse.net Git - vlc/blob - include/vlc_common.h
* modules/stream_out/transcode.c: added support for subtitles overlaying when transco...
[vlc] / include / vlc_common.h
1 /*****************************************************************************
2  * common.h: common definitions
3  * Collection of useful common types and macros definitions
4  *****************************************************************************
5  * Copyright (C) 1998-2004 VideoLAN
6  * $Id$
7  *
8  * Authors: Samuel Hocevar <sam@via.ecp.fr>
9  *          Vincent Seguin <seguin@via.ecp.fr>
10  *          Gildas Bazin <gbazin@netcourrier.com>
11  *
12  * This program is free software; you can redistribute it and/or modify
13  * it under the terms of the GNU General Public License as published by
14  * the Free Software Foundation; either version 2 of the License, or
15  * (at your option) any later version.
16  *
17  * This program is distributed in the hope that it will be useful,
18  * but WITHOUT ANY WARRANTY; without even the implied warranty of
19  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
20  * GNU General Public License for more details.
21  *
22  * You should have received a copy of the GNU General Public License
23  * along with this program; if not, write to the Free Software
24  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
25  *****************************************************************************/
26
27 /**
28  * \file
29  * This file is a collection of common definitions and types
30  */
31
32 /*****************************************************************************
33  * Required vlc headers
34  *****************************************************************************/
35 #if defined( __BORLANDC__ )
36 #   undef PACKAGE
37 #endif
38
39 #include "config.h"
40
41 #if defined( __BORLANDC__ )
42 #   undef HAVE_VARIADIC_MACROS
43 #   undef HAVE_STDINT_H
44 #   undef HAVE_INTTYPES_H
45 #   undef off_t
46 #elif defined( _MSC_VER )
47 #   pragma warning( disable : 4244 )
48 #endif
49
50 #include "vlc_config.h"
51 #include "modules_inner.h"
52
53 /*****************************************************************************
54  * Required system headers
55  *****************************************************************************/
56 #include <stdlib.h>
57 #include <stdarg.h>
58
59 #ifdef HAVE_STRING_H
60 #   include <string.h>                                         /* strerror() */
61 #endif
62
63 #ifdef HAVE_SYS_TYPES_H
64 #   include <sys/types.h>
65 #endif
66
67 /*****************************************************************************
68  * Basic types definitions
69  *****************************************************************************/
70 #if defined( HAVE_STDINT_H )
71 #   include <stdint.h>
72 #elif defined( HAVE_INTTYPES_H )
73 #   include <inttypes.h>
74 #elif defined( SYS_CYGWIN )
75 #   include <sys/types.h>
76     /* Cygwin only defines half of these... */
77     typedef u_int8_t            uint8_t;
78     typedef u_int16_t           uint16_t;
79     typedef u_int32_t           uint32_t;
80     typedef u_int64_t           uint64_t;
81 #else
82     /* Fallback types (very x86-centric, sorry) */
83     typedef unsigned char       uint8_t;
84     typedef signed char         int8_t;
85     typedef unsigned short      uint16_t;
86     typedef signed short        int16_t;
87     typedef unsigned int        uint32_t;
88     typedef signed int          int32_t;
89 #   if defined( _MSC_VER ) \
90       || defined( UNDER_CE ) \
91       || ( defined( WIN32 ) && !defined( __MINGW32__ ) )
92     typedef unsigned __int64    uint64_t;
93     typedef signed __int64      int64_t;
94 #   else
95     typedef unsigned long long  uint64_t;
96     typedef signed long long    int64_t;
97 #   endif
98     typedef uint32_t            uintptr_t;
99     typedef int32_t             intptr_t;
100 #endif
101
102 typedef uint8_t                 byte_t;
103
104 /* ptrdiff_t definition */
105 #ifdef HAVE_STDDEF_H
106 #   include <stddef.h>
107 #else
108 #   include <malloc.h>
109 #   ifndef _PTRDIFF_T
110 #       define _PTRDIFF_T
111 /* Not portable in a 64-bit environment. */
112 typedef int                 ptrdiff_t;
113 #   endif
114 #endif
115
116 #if defined( WIN32 )
117 #   include <malloc.h>
118 #   ifndef PATH_MAX
119 #       define PATH_MAX MAX_PATH
120 #   endif
121 #endif
122
123 #if (defined( WIN32 ) || defined( UNDER_CE )) && !defined( _SSIZE_T_ )
124 typedef int                 ssize_t;
125 #endif
126
127 /* Counter for statistics and profiling */
128 typedef unsigned long       count_t;
129
130 /* DCT elements types */
131 typedef int16_t             dctelem_t;
132
133 /* Video buffer types */
134 typedef uint8_t             yuv_data_t;
135
136 /* Audio volume */
137 typedef uint16_t            audio_volume_t;
138
139 #ifndef HAVE_SOCKLEN_T
140 typedef int                 socklen_t;
141 #endif
142
143 /**
144  * High precision date or time interval
145  *
146  * Store a high precision date or time interval. The maximum precision is the
147  * microsecond, and a 64 bits integer is used to avoid overflows (maximum
148  * time interval is then 292271 years, which should be long enough for any
149  * video). Dates are stored as microseconds since a common date (usually the
150  * epoch). Note that date and time intervals can be manipulated using regular
151  * arithmetic operators, and that no special functions are required.
152  */
153 typedef int64_t mtime_t;
154
155 /**
156  * The vlc_fourcc_t type.
157  *
158  * See http://www.webartz.com/fourcc/ for a very detailed list.
159  */
160 typedef uint32_t vlc_fourcc_t;
161
162 #ifdef WORDS_BIGENDIAN
163 #   define VLC_FOURCC( a, b, c, d ) \
164         ( ((uint32_t)d) | ( ((uint32_t)c) << 8 ) \
165            | ( ((uint32_t)b) << 16 ) | ( ((uint32_t)a) << 24 ) )
166 #   define VLC_TWOCC( a, b ) \
167         ( (uint16_t)(b) | ( (uint16_t)(a) << 8 ) )
168
169 #else
170 #   define VLC_FOURCC( a, b, c, d ) \
171         ( ((uint32_t)a) | ( ((uint32_t)b) << 8 ) \
172            | ( ((uint32_t)c) << 16 ) | ( ((uint32_t)d) << 24 ) )
173 #   define VLC_TWOCC( a, b ) \
174         ( (uint16_t)(a) | ( (uint16_t)(b) << 8 ) )
175
176 #endif
177
178 /*****************************************************************************
179  * Classes declaration
180  *****************************************************************************/
181
182 /* Internal types */
183 typedef struct libvlc_t libvlc_t;
184 typedef struct vlc_t vlc_t;
185 typedef struct variable_t variable_t;
186 typedef struct date_t date_t;
187
188 /* Messages */
189 typedef struct msg_bank_t msg_bank_t;
190 typedef struct msg_subscription_t msg_subscription_t;
191
192 /* Playlist */
193
194 /* FIXME */
195 /**
196  * Playlist commands
197  */
198 typedef enum {
199     PLAYLIST_PLAY,                              /**< Starts playing. No arg. */
200     PLAYLIST_PAUSE,                     /**< Toggles playlist pause. No arg. */
201     PLAYLIST_STOP,                               /**< Stops playing. No arg. */
202     PLAYLIST_SKIP,                               /**< Skip X items and play. */
203     PLAYLIST_GOTO,                                       /**< Goto Xth item. */
204 } playlist_command_t;
205
206
207 typedef struct playlist_t playlist_t;
208 typedef struct playlist_item_t playlist_item_t;
209 typedef struct playlist_group_t playlist_group_t;
210 typedef struct playlist_export_t playlist_export_t;
211
212 /* Modules */
213 typedef struct module_bank_t module_bank_t;
214 typedef struct module_t module_t;
215 typedef struct module_config_t module_config_t;
216 typedef struct module_symbols_t module_symbols_t;
217 typedef struct module_cache_t module_cache_t;
218
219 /* Interface */
220 typedef struct intf_thread_t intf_thread_t;
221 typedef struct intf_sys_t intf_sys_t;
222 typedef struct intf_console_t intf_console_t;
223 typedef struct intf_msg_t intf_msg_t;
224 typedef struct intf_channel_t intf_channel_t;
225
226 /* Input */
227 typedef struct input_thread_t input_thread_t;
228 typedef struct input_thread_sys_t input_thread_sys_t;
229 typedef struct input_item_t input_item_t;
230 typedef struct input_area_t input_area_t;
231 typedef struct input_buffers_t input_buffers_t;
232 typedef struct input_socket_t input_socket_t;
233 typedef struct access_sys_t access_sys_t;
234 typedef struct demux_sys_t demux_sys_t;
235 typedef struct es_descriptor_t es_descriptor_t;
236 typedef struct es_sys_t es_sys_t;
237 typedef struct pgrm_descriptor_t pgrm_descriptor_t;
238 typedef struct pgrm_sys_t pgrm_sys_t;
239 typedef struct stream_descriptor_t stream_descriptor_t;
240 typedef struct seekpoint_t seekpoint_t;
241 typedef struct info_t info_t;
242 typedef struct info_category_t info_category_t;
243
244 /* Format */
245 typedef struct audio_format_t audio_format_t;
246 typedef struct video_format_t video_format_t;
247 typedef struct subs_format_t subs_format_t;
248 typedef struct es_format_t es_format_t;
249 typedef struct video_palette_t video_palette_t;
250
251 /* NInput */
252 typedef struct stream_sys_t stream_sys_t;
253 typedef struct stream_t     stream_t;
254 typedef struct es_out_t     es_out_t;
255 typedef struct es_out_id_t  es_out_id_t;
256 typedef struct es_out_sys_t es_out_sys_t;
257 typedef struct demux_t  demux_t;
258 typedef struct access_t access_t;
259
260 /* Audio */
261 typedef struct aout_instance_t aout_instance_t;
262 typedef struct aout_sys_t aout_sys_t;
263 typedef struct aout_fifo_t aout_fifo_t;
264 typedef struct aout_input_t aout_input_t;
265 typedef struct aout_buffer_t aout_buffer_t;
266 typedef audio_format_t audio_sample_format_t;
267 typedef struct audio_date_t audio_date_t;
268 typedef struct aout_filter_t aout_filter_t;
269
270 /* Video */
271 typedef struct vout_thread_t vout_thread_t;
272 typedef struct vout_sys_t vout_sys_t;
273 typedef struct chroma_sys_t chroma_sys_t;
274 typedef video_format_t video_frame_format_t;
275 typedef struct picture_t picture_t;
276 typedef struct picture_sys_t picture_sys_t;
277 typedef struct picture_heap_t picture_heap_t;
278 typedef struct subpicture_t subpicture_t;
279 typedef struct subpicture_sys_t subpicture_sys_t;
280 typedef struct subpicture_region_t subpicture_region_t;
281 typedef struct vout_synchro_t vout_synchro_t;
282 typedef struct text_renderer_sys_t text_renderer_sys_t;
283 typedef struct text_style_t text_style_t;
284
285 /* Stream output */
286 typedef struct sout_instance_t sout_instance_t;
287 typedef struct sout_instance_sys_t sout_instance_sys_t;
288
289 typedef struct sout_input_t sout_input_t;
290 typedef struct sout_packetizer_input_t sout_packetizer_input_t;
291
292 typedef struct sout_access_out_t sout_access_out_t;
293 typedef struct sout_access_out_sys_t   sout_access_out_sys_t;
294
295 typedef struct sout_mux_t sout_mux_t;
296 typedef struct sout_mux_sys_t sout_mux_sys_t;
297
298 typedef struct sout_stream_t    sout_stream_t;
299 typedef struct sout_stream_sys_t sout_stream_sys_t;
300
301 typedef struct sout_cfg_t       sout_cfg_t;
302 typedef struct sap_session_t    sap_session_t;
303 typedef struct sap_address_t sap_address_t;
304 typedef struct session_descriptor_t session_descriptor_t;
305 typedef struct announce_method_t announce_method_t;
306 typedef struct announce_handler_t announce_handler_t;
307 typedef struct sap_handler_t sap_handler_t;
308 //typedef struct slp_session_t    slp_session_t;
309
310 /* Decoders */
311 typedef struct decoder_t      decoder_t;
312 typedef struct decoder_sys_t  decoder_sys_t;
313
314 /* Encoders */
315 typedef struct encoder_t      encoder_t;
316 typedef struct encoder_sys_t  encoder_sys_t;
317
318 /* Filters */
319 typedef struct filter_t filter_t;
320 typedef struct filter_sys_t filter_sys_t;
321
322 /* Misc */
323 typedef struct data_packet_t data_packet_t;
324 typedef struct data_buffer_t data_buffer_t;
325 typedef struct stream_ctrl_t stream_ctrl_t;
326 typedef struct pes_packet_t pes_packet_t;
327 typedef struct network_socket_t network_socket_t;
328 typedef struct iso639_lang_t iso639_lang_t;
329
330 /* block */
331 typedef struct block_t      block_t;
332 typedef struct block_fifo_t block_fifo_t;
333
334 /* httpd */
335 typedef struct httpd_t          httpd_t;
336 typedef struct httpd_host_t     httpd_host_t;
337 typedef struct httpd_url_t      httpd_url_t;
338 typedef struct httpd_client_t   httpd_client_t;
339 typedef struct httpd_callback_sys_t httpd_callback_sys_t;
340 typedef struct httpd_message_t  httpd_message_t;
341 typedef int    (*httpd_callback_t)( httpd_callback_sys_t *, httpd_client_t *, httpd_message_t *answer, httpd_message_t *query );
342 typedef struct httpd_file_t     httpd_file_t;
343 typedef struct httpd_file_sys_t httpd_file_sys_t;
344 typedef int (*httpd_file_callback_t)( httpd_file_sys_t*, httpd_file_t *, uint8_t *psz_request, uint8_t **pp_data, int *pi_data );
345 typedef struct httpd_redirect_t httpd_redirect_t;
346 typedef struct httpd_stream_t httpd_stream_t;
347
348 /* opengl */
349 typedef struct opengl_t     opengl_t;
350 typedef struct opengl_sys_t opengl_sys_t;
351
352 /* divers */
353 typedef struct vlc_meta_t    vlc_meta_t;
354
355 typedef struct vlm_t         vlm_t;
356 typedef struct vlm_message_t vlm_message_t;
357
358
359 /*****************************************************************************
360  * Variable callbacks
361  *****************************************************************************/
362 typedef int ( * vlc_callback_t ) ( vlc_object_t *,      /* variable's object */
363                                    char const *,            /* variable name */
364                                    vlc_value_t,                 /* old value */
365                                    vlc_value_t,                 /* new value */
366                                    void * );                /* callback data */
367
368 /*****************************************************************************
369  * Plug-in stuff
370  *****************************************************************************/
371 #ifndef __PLUGIN__
372 #   define VLC_EXPORT( type, name, args ) type name args
373 #else
374 #   define VLC_EXPORT( type, name, args ) struct _u_n_u_s_e_d_
375     extern module_symbols_t* p_symbols;
376 #endif
377
378 /*****************************************************************************
379  * OS-specific headers and thread types
380  *****************************************************************************/
381 #if defined( WIN32 ) || defined( UNDER_CE )
382 #   define WIN32_LEAN_AND_MEAN
383 #   include <windows.h>
384 #   define IS_WINNT ( GetVersion() < 0x80000000 )
385 #endif
386
387 #include "vlc_threads.h"
388
389 /*****************************************************************************
390  * Common structure members
391  *****************************************************************************/
392
393 /* VLC_COMMON_MEMBERS : members common to all basic vlc objects */
394 #define VLC_COMMON_MEMBERS                                                  \
395 /** \name VLC_COMMON_MEMBERS                                                \
396  * these members are common for all vlc objects                             \
397  */                                                                         \
398 /**@{*/                                                                     \
399     int   i_object_id;                                                      \
400     int   i_object_type;                                                    \
401     char *psz_object_type;                                                  \
402     char *psz_object_name;                                                  \
403                                                                             \
404     /* Thread properties, if any */                                         \
405     vlc_bool_t   b_thread;                                                  \
406     vlc_thread_t thread_id;                                                 \
407                                                                             \
408     /* Object access lock */                                                \
409     vlc_mutex_t  object_lock;                                               \
410     vlc_cond_t   object_wait;                                               \
411                                                                             \
412     /* Object properties */                                                 \
413     volatile vlc_bool_t b_error;                  /**< set by the object */ \
414     volatile vlc_bool_t b_die;                   /**< set by the outside */ \
415     volatile vlc_bool_t b_dead;                   /**< set by the object */ \
416     volatile vlc_bool_t b_attached;               /**< set by the object */ \
417     vlc_bool_t b_force;      /**< set by the outside (eg. module_Need()) */ \
418                                                                             \
419     /* Object variables */                                                  \
420     vlc_mutex_t     var_lock;                                               \
421     int             i_vars;                                                 \
422     variable_t *    p_vars;                                                 \
423                                                                             \
424     /* Stuff related to the libvlc structure */                             \
425     libvlc_t *      p_libvlc;                      /**< root of all evil */ \
426     vlc_t *         p_vlc;                   /**< (root of all evil) - 1 */ \
427                                                                             \
428     volatile int    i_refcount;                         /**< usage count */ \
429     vlc_object_t *  p_parent;                            /**< our parent */ \
430     vlc_object_t ** pp_children;                       /**< our children */ \
431     volatile int    i_children;                                             \
432                                                                             \
433     /* Private data */                                                      \
434     void *          p_private;                                              \
435                                                                             \
436     /** Just a reminder so that people don't cast garbage */                \
437     int be_sure_to_add_VLC_COMMON_MEMBERS_to_struct;                        \
438 /**@}*/                                                                     \
439
440 /* VLC_OBJECT: attempt at doing a clever cast */
441 #define VLC_OBJECT( x ) \
442     ((vlc_object_t *)(x))+0*(x)->be_sure_to_add_VLC_COMMON_MEMBERS_to_struct
443
444 /*****************************************************************************
445  * Macros and inline functions
446  *****************************************************************************/
447 #ifdef NTOHL_IN_SYS_PARAM_H
448 #   include <sys/param.h>
449
450 #elif !defined(WIN32) && !defined( UNDER_CE )
451 #   include <netinet/in.h>
452
453 #endif /* NTOHL_IN_SYS_PARAM_H || WIN32 */
454
455 /* CEIL: division with round to nearest greater integer */
456 #define CEIL(n, d)  ( ((n) / (d)) + ( ((n) % (d)) ? 1 : 0) )
457
458 /* PAD: PAD(n, d) = CEIL(n ,d) * d */
459 #define PAD(n, d)   ( ((n) % (d)) ? ((((n) / (d)) + 1) * (d)) : (n) )
460
461 /* __MAX and __MIN: self explanatory */
462 #ifndef __MAX
463 #   define __MAX(a, b)   ( ((a) > (b)) ? (a) : (b) )
464 #endif
465 #ifndef __MIN
466 #   define __MIN(a, b)   ( ((a) < (b)) ? (a) : (b) )
467 #endif
468
469 /* Dynamic array handling: realloc array, move data, increment position */
470 #define INSERT_ELEM( p_ar, i_oldsize, i_pos, elem )                           \
471     do                                                                        \
472     {                                                                         \
473         if( i_oldsize )                                                       \
474         {                                                                     \
475             (p_ar) = realloc( p_ar, ((i_oldsize) + 1) * sizeof( *(p_ar) ) );  \
476         }                                                                     \
477         else                                                                  \
478         {                                                                     \
479             (p_ar) = malloc( ((i_oldsize) + 1) * sizeof( *(p_ar) ) );         \
480         }                                                                     \
481         if( (i_oldsize) - (i_pos) )                                           \
482         {                                                                     \
483             memmove( (p_ar) + (i_pos) + 1,                                    \
484                      (p_ar) + (i_pos),                                        \
485                      ((i_oldsize) - (i_pos)) * sizeof( *(p_ar) ) );           \
486         }                                                                     \
487         (p_ar)[i_pos] = elem;                                                 \
488         (i_oldsize)++;                                                        \
489     }                                                                         \
490     while( 0 )
491
492 #define REMOVE_ELEM( p_ar, i_oldsize, i_pos )                                 \
493     do                                                                        \
494     {                                                                         \
495         if( (i_oldsize) - (i_pos) - 1 )                                       \
496         {                                                                     \
497             memmove( (p_ar) + (i_pos),                                        \
498                      (p_ar) + (i_pos) + 1,                                    \
499                      ((i_oldsize) - (i_pos) - 1) * sizeof( *(p_ar) ) );       \
500         }                                                                     \
501         if( i_oldsize > 1 )                                                   \
502         {                                                                     \
503             (p_ar) = realloc( p_ar, ((i_oldsize) - 1) * sizeof( *(p_ar) ) );  \
504         }                                                                     \
505         else                                                                  \
506         {                                                                     \
507             free( p_ar );                                                     \
508             (p_ar) = NULL;                                                    \
509         }                                                                     \
510         (i_oldsize)--;                                                        \
511     }                                                                         \
512     while( 0 )
513
514
515 #define TAB_APPEND( count, tab, p )             \
516     if( (count) > 0 )                           \
517     {                                           \
518         (tab) = realloc( tab, sizeof( void ** ) * ( (count) + 1 ) ); \
519     }                                           \
520     else                                        \
521     {                                           \
522         (tab) = malloc( sizeof( void ** ) );    \
523     }                                           \
524     (tab)[count] = (p);        \
525     (count)++
526
527 #define TAB_FIND( count, tab, p, index )        \
528     {                                           \
529         int _i_;                                \
530         (index) = -1;                           \
531         for( _i_ = 0; _i_ < (count); _i_++ )    \
532         {                                       \
533             if( (tab)[_i_] == (p) )  \
534             {                                   \
535                 (index) = _i_;                  \
536                 break;                          \
537             }                                   \
538         }                                       \
539     }
540
541 #define TAB_REMOVE( count, tab, p )             \
542     {                                           \
543         int _i_index_;                          \
544         TAB_FIND( count, tab, p, _i_index_ );   \
545         if( _i_index_ >= 0 )                    \
546         {                                       \
547             if( (count) > 1 )                     \
548             {                                   \
549                 memmove( ((void**)(tab) + _i_index_),    \
550                          ((void**)(tab) + _i_index_+1),  \
551                          ( (count) - _i_index_ - 1 ) * sizeof( void* ) );\
552             }                                   \
553             (count)--;                          \
554             if( (count) == 0 )                  \
555             {                                   \
556                 free( tab );                    \
557                 (tab) = NULL;                   \
558             }                                   \
559         }                                       \
560     }
561
562 /* MSB (big endian)/LSB (little endian) conversions - network order is always
563  * MSB, and should be used for both network communications and files. Note that
564  * byte orders other than little and big endians are not supported, but only
565  * the VAX seems to have such exotic properties. */
566 static inline uint16_t U16_AT( void const * _p )
567 {
568     uint8_t * p = (uint8_t *)_p;
569     return ( ((uint16_t)p[0] << 8) | p[1] );
570 }
571 static inline uint32_t U32_AT( void const * _p )
572 {
573     uint8_t * p = (uint8_t *)_p;
574     return ( ((uint32_t)p[0] << 24) | ((uint32_t)p[1] << 16)
575               | ((uint32_t)p[2] << 8) | p[3] );
576 }
577 static inline uint64_t U64_AT( void const * _p )
578 {
579     uint8_t * p = (uint8_t *)_p;
580     return ( ((uint64_t)p[0] << 56) | ((uint64_t)p[1] << 48)
581               | ((uint64_t)p[2] << 40) | ((uint64_t)p[3] << 32)
582               | ((uint64_t)p[4] << 24) | ((uint64_t)p[5] << 16)
583               | ((uint64_t)p[6] << 8) | p[7] );
584 }
585
586 static inline uint16_t GetWLE( void const * _p )
587 {
588     uint8_t * p = (uint8_t *)_p;
589     return ( ((uint16_t)p[1] << 8) | p[0] );
590 }
591 static inline uint32_t GetDWLE( void const * _p )
592 {
593     uint8_t * p = (uint8_t *)_p;
594     return ( ((uint32_t)p[3] << 24) | ((uint32_t)p[2] << 16)
595               | ((uint32_t)p[1] << 8) | p[0] );
596 }
597 static inline uint64_t GetQWLE( void const * _p )
598 {
599     uint8_t * p = (uint8_t *)_p;
600     return ( ((uint64_t)p[7] << 56) | ((uint64_t)p[6] << 48)
601               | ((uint64_t)p[5] << 40) | ((uint64_t)p[4] << 32)
602               | ((uint64_t)p[3] << 24) | ((uint64_t)p[2] << 16)
603               | ((uint64_t)p[1] << 8) | p[0] );
604 }
605
606 #define GetWBE( p )     U16_AT( p )
607 #define GetDWBE( p )    U32_AT( p )
608 #define GetQWBE( p )    U64_AT( p )
609
610 /* Helper writer functions */
611
612 #define SetWLE( p, v ) _SetWLE( (uint8_t*)p, v)
613 static inline void _SetWLE( uint8_t *p, uint16_t i_dw )
614 {
615     p[1] = ( i_dw >>  8 )&0xff;
616     p[0] = ( i_dw       )&0xff;
617 }
618
619 #define SetDWLE( p, v ) _SetDWLE( (uint8_t*)p, v)
620 static inline void _SetDWLE( uint8_t *p, uint32_t i_dw )
621 {
622     p[3] = ( i_dw >> 24 )&0xff;
623     p[2] = ( i_dw >> 16 )&0xff;
624     p[1] = ( i_dw >>  8 )&0xff;
625     p[0] = ( i_dw       )&0xff;
626 }
627 #define SetQWLE( p, v ) _SetQWLE( (uint8_t*)p, v)
628 static inline void _SetQWLE( uint8_t *p, uint64_t i_qw )
629 {
630     SetDWLE( p,   i_qw&0xffffffff );
631     SetDWLE( p+4, ( i_qw >> 32)&0xffffffff );
632 }
633
634 #if WORDS_BIGENDIAN
635 #   define hton16(i)   ( i )
636 #   define hton32(i)   ( i )
637 #   define hton64(i)   ( i )
638 #   define ntoh16(i)   ( i )
639 #   define ntoh32(i)   ( i )
640 #   define ntoh64(i)   ( i )
641 #else
642 #   define hton16(i)   U16_AT(&i)
643 #   define hton32(i)   U32_AT(&i)
644 #   define hton64(i)   U64_AT(&i)
645 #   define ntoh16(i)   U16_AT(&i)
646 #   define ntoh32(i)   U32_AT(&i)
647 #   define ntoh64(i)   U64_AT(&i)
648 #endif
649
650 /* Format string sanity checks */
651 #ifdef HAVE_ATTRIBUTE_FORMAT
652 #   define ATTRIBUTE_FORMAT(x,y) __attribute__ ((format(printf,x,y)))
653 #else
654 #   define ATTRIBUTE_FORMAT(x,y)
655 #endif
656
657 /* Alignment of critical static data structures */
658 #ifdef ATTRIBUTE_ALIGNED_MAX
659 #   define ATTR_ALIGN(align) __attribute__ ((__aligned__ ((ATTRIBUTE_ALIGNED_MAX < align) ? ATTRIBUTE_ALIGNED_MAX : align)))
660 #else
661 #   define ATTR_ALIGN(align)
662 #endif
663
664 /* Alignment of critical dynamic data structure
665  *
666  * Not all platforms support memalign so we provide a vlc_memalign wrapper
667  * void *vlc_memalign( size_t align, size_t size, void **pp_orig )
668  * *pp_orig is the pointer that has to be freed afterwards.
669  */
670 #if 0
671 #ifdef HAVE_POSIX_MEMALIGN
672 #   define vlc_memalign(align,size,pp_orig) \
673     ( !posix_memalign( pp_orig, align, size ) ? *(pp_orig) : NULL )
674 #endif
675 #endif
676 #ifdef HAVE_MEMALIGN
677     /* Some systems have memalign() but no declaration for it */
678     void * memalign( size_t align, size_t size );
679
680 #   define vlc_memalign(pp_orig,align,size) \
681     ( *(pp_orig) = memalign( align, size ) )
682
683 #else /* We don't have any choice but to align manually */
684 #   define vlc_memalign(pp_orig,align,size) \
685     (( *(pp_orig) = malloc( size + align - 1 )) \
686         ? (void *)( (((unsigned long)*(pp_orig)) + (unsigned long)(align-1) ) \
687                        & (~(unsigned long)(align-1)) ) \
688         : NULL )
689
690 #endif
691
692 /* Stuff defined in src/extras/libc.c */
693 #ifndef HAVE_STRDUP
694 #   define strdup vlc_strdup
695     VLC_EXPORT( char *, vlc_strdup, ( const char *s ) );
696 #elif !defined(__PLUGIN__)
697 #   define vlc_strdup NULL
698 #endif
699
700 #if !defined(HAVE_VASPRINTF) || defined(SYS_DARWIN) || defined(SYS_BEOS)
701 #   define vasprintf vlc_vasprintf
702     VLC_EXPORT( int, vlc_vasprintf, (char **, const char *, va_list ) );
703 #elif !defined(__PLUGIN__)
704 #   define vlc_vasprintf NULL
705 #endif
706
707 #if !defined(HAVE_ASPRINTF) || defined(SYS_DARWIN) || defined(SYS_BEOS)
708 #   define asprintf vlc_asprintf
709     VLC_EXPORT( int, vlc_asprintf, (char **, const char *, ... ) );
710 #elif !defined(__PLUGIN__)
711 #   define vlc_asprintf NULL
712 #endif
713
714 #ifndef HAVE_STRNDUP
715 #   if defined(STRNDUP_IN_GNOME_H) && \
716         (defined(MODULE_NAME_IS_gnome)||defined(MODULE_NAME_IS_gnome_main)||\
717          defined(MODULE_NAME_IS_gnome2)||defined(MODULE_NAME_IS_gnome2_main))
718         /* Do nothing: gnome.h defines strndup for us */
719 #   else
720 #       define strndup vlc_strndup
721         VLC_EXPORT( char *, vlc_strndup, ( const char *s, size_t n ) );
722 #   endif
723 #elif !defined(__PLUGIN__)
724 #   define vlc_strndup NULL
725 #endif
726
727 #ifndef HAVE_ATOF
728 #   define atof vlc_atof
729     VLC_EXPORT( double, vlc_atof, ( const char *nptr ) );
730 #elif !defined(__PLUGIN__)
731 #   define vlc_atof NULL
732 #endif
733
734 #ifndef HAVE_ATOLL
735 #   define atoll vlc_atoll
736     VLC_EXPORT( int64_t, vlc_atoll, ( const char *nptr ) );
737 #elif !defined(__PLUGIN__)
738 #   define vlc_atoll NULL
739 #endif
740
741 #ifndef HAVE_GETENV
742 #   define getenv vlc_getenv
743     VLC_EXPORT( char *, vlc_getenv, ( const char *name ) );
744 #elif !defined(__PLUGIN__)
745 #   define vlc_getenv NULL
746 #endif
747
748 #ifndef HAVE_STRCASECMP
749 #   ifndef HAVE_STRICMP
750 #       define strcasecmp vlc_strcasecmp
751         VLC_EXPORT( int, vlc_strcasecmp, ( const char *s1, const char *s2 ) );
752 #   else
753 #       define strcasecmp stricmp
754 #       if !defined(__PLUGIN__)
755 #           define vlc_strcasecmp NULL
756 #       endif
757 #   endif
758 #elif !defined(__PLUGIN__)
759 #   define vlc_strcasecmp NULL
760 #endif
761
762 #ifndef HAVE_STRNCASECMP
763 #   ifndef HAVE_STRNICMP
764 #       define strncasecmp vlc_strncasecmp
765         VLC_EXPORT( int, vlc_strncasecmp, ( const char *s1, const char *s2, size_t n ) );
766 #   else
767 #       define strncasecmp strnicmp
768 #       if !defined(__PLUGIN__)
769 #           define vlc_strncasecmp NULL
770 #       endif
771 #   endif
772 #elif !defined(__PLUGIN__)
773 #   define vlc_strncasecmp NULL
774 #endif
775
776 #ifndef HAVE_STRCASESTR
777 #   ifndef HAVE_STRISTR
778 #       define strcasestr vlc_strcasestr
779         VLC_EXPORT( char *, vlc_strcasestr, ( const char *s1, const char *s2 ) );
780 #   else
781 #       define strcasestr stristr
782 #       if !defined(__PLUGIN__)
783 #           define vlc_strcasestr NULL
784 #       endif
785 #   endif
786 #elif !defined(__PLUGIN__)
787 #   define vlc_strcasestr NULL
788 #endif
789
790 /* Format type specifiers for 64 bits numbers */
791 #if !defined(WIN32) && !defined(UNDER_CE)
792 #   define I64Fd "%lld"
793 #   define I64Fi "%lli"
794 #   define I64Fo "%llo"
795 #   define I64Fu "%llu"
796 #   define I64Fx "%llx"
797 #   define I64FX "%llX"
798 #else
799 #   define I64Fd "%I64d"
800 #   define I64Fi "%I64i"
801 #   define I64Fo "%I64o"
802 #   define I64Fu "%I64u"
803 #   define I64Fx "%I64x"
804 #   define I64FX "%I64X"
805 #endif /* defined(WIN32)||defined(UNDER_CE) */
806
807 /* 64 bits integer constant suffix */
808 #if defined( __MINGW32__ ) || (!defined(WIN32) && !defined(UNDER_CE))
809 #   define I64C(x)         x##LL
810 #   define UI64C(x)        x##ULL
811 #else
812 #   define I64C(x)         x##i64
813 #   define UI64C(x)        x##ui64
814 #endif /* defined(WIN32)||defined(UNDER_CE) */
815
816 #if defined(WIN32) || defined(UNDER_CE)
817 /* win32, cl and icl support */
818 #   if defined( _MSC_VER ) || !defined( __MINGW32__ )
819 #       define __attribute__(x)
820 #       define __inline__      __inline
821 #       define S_IFBLK         0x3000  /* Block */
822 #       define S_ISBLK(m)      (0)
823 #       define S_ISCHR(m)      (0)
824 #       define S_ISFIFO(m)     (((m)&_S_IFMT) == _S_IFIFO)
825 #       define S_ISREG(m)      (((m)&_S_IFMT) == _S_IFREG)
826 #   endif
827
828 /* several type definitions */
829 #   if defined( __MINGW32__ )
830 #       if !defined( _OFF_T_ )
831 typedef long long _off_t;
832 typedef _off_t off_t;
833 #           define _OFF_T_
834 #       else
835 #           ifdef off_t
836 #               undef off_t
837 #           endif
838 #           define off_t long long
839 #       endif
840 #   endif
841
842 #   if defined( _MSC_VER )
843 #       if !defined( _OFF_T_DEFINED )
844 typedef __int64 off_t;
845 #           define _OFF_T_DEFINED
846 #       else
847 #           define off_t __int64
848 #       endif
849 #   endif
850
851 #   if defined( __BORLANDC__ )
852 #       undef off_t
853 #       define off_t unsigned __int64
854 #   endif
855
856 #   ifndef O_NONBLOCK
857 #       define O_NONBLOCK 0
858 #   endif
859
860 #   ifndef alloca
861 #       define alloca _alloca
862 #   endif
863
864     /* These two are not defined in mingw32 (bug?) */
865 #   ifndef snprintf
866 #       define snprintf _snprintf
867 #   endif
868 #   ifndef vsnprintf
869 #       define vsnprintf _vsnprintf
870 #   endif
871
872 #endif
873
874 /* lseek (defined in src/extras/libc.c) */
875 #ifndef HAVE_LSEEK
876 #   define lseek vlc_lseek
877     VLC_EXPORT( off_t, vlc_lseek, ( int fildes, off_t offset, int whence ) );
878 #elif !defined(__PLUGIN__)
879 #   define vlc_lseek NULL
880 #endif
881
882 /* vlc_wraptext (defined in src/extras/libc.c) */
883 #define wraptext vlc_wraptext
884 VLC_EXPORT( char *, vlc_wraptext, ( const char *, int, vlc_bool_t ) );
885
886 /*****************************************************************************
887  * CPU capabilities
888  *****************************************************************************/
889 #define CPU_CAPABILITY_NONE    0
890 #define CPU_CAPABILITY_486     (1<<0)
891 #define CPU_CAPABILITY_586     (1<<1)
892 #define CPU_CAPABILITY_PPRO    (1<<2)
893 #define CPU_CAPABILITY_MMX     (1<<3)
894 #define CPU_CAPABILITY_3DNOW   (1<<4)
895 #define CPU_CAPABILITY_MMXEXT  (1<<5)
896 #define CPU_CAPABILITY_SSE     (1<<6)
897 #define CPU_CAPABILITY_SSE2    (1<<7)
898 #define CPU_CAPABILITY_ALTIVEC (1<<16)
899 #define CPU_CAPABILITY_FPU     (1<<31)
900
901 /*****************************************************************************
902  * I18n stuff
903  *****************************************************************************/
904 VLC_EXPORT( char *, vlc_dgettext, ( const char *package, const char *msgid ) );
905
906 #if defined( ENABLE_NLS ) && \
907      (defined(MODULE_NAME_IS_gnome)||defined(MODULE_NAME_IS_gnome_main)||\
908       defined(MODULE_NAME_IS_gnome2)||defined(MODULE_NAME_IS_gnome2_main)||\
909       defined(MODULE_NAME_IS_pda))
910     /* Declare nothing: gnome.h will do it for us */
911 #elif defined( ENABLE_NLS )
912 #if defined( HAVE_INCLUDED_GETTEXT )
913 #   include "libintl.h"
914 #else
915 #   include <libintl.h>
916 #endif
917 #   undef _
918 #if defined( __BORLANDC__ )
919 #define _(String) vlc_dgettext (PACKAGE_TARNAME, String)
920 #else
921 #   define _(String) vlc_dgettext (PACKAGE, String)
922 #endif
923 #   define N_(String) ((char*)(String))
924 #else
925 #   define _(String) ((char*)(String))
926 #   define N_(String) ((char*)(String))
927 #endif
928
929 /*****************************************************************************
930  * Additional vlc stuff
931  *****************************************************************************/
932 #include "vlc_symbols.h"
933 #include "os_specific.h"
934 #include "vlc_messages.h"
935 #include "variables.h"
936 #include "vlc_objects.h"
937 #include "vlc_threads_funcs.h"
938 #include "mtime.h"
939 #include "modules.h"
940 #include "main.h"
941 #include "configuration.h"
942
943 #if defined( __BORLANDC__ )
944 #   undef PACKAGE
945 #   define PACKAGE
946 #endif
947