]> git.sesse.net Git - vlc/blob - include/vlc_common.h
* ALL: Major rework of the subpictures architecture.
[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                                                                             \
418     /* Object variables */                                                  \
419     vlc_mutex_t     var_lock;                                               \
420     int             i_vars;                                                 \
421     variable_t *    p_vars;                                                 \
422                                                                             \
423     /* Stuff related to the libvlc structure */                             \
424     libvlc_t *      p_libvlc;                      /**< root of all evil */ \
425     vlc_t *         p_vlc;                   /**< (root of all evil) - 1 */ \
426                                                                             \
427     volatile int    i_refcount;                         /**< usage count */ \
428     vlc_object_t *  p_parent;                            /**< our parent */ \
429     vlc_object_t ** pp_children;                       /**< our children */ \
430     volatile int    i_children;                                             \
431                                                                             \
432     /* Private data */                                                      \
433     void *          p_private;                                              \
434                                                                             \
435     /** Just a reminder so that people don't cast garbage */                \
436     int be_sure_to_add_VLC_COMMON_MEMBERS_to_struct;                        \
437 /**@}*/                                                                     \
438
439 /* VLC_OBJECT: attempt at doing a clever cast */
440 #define VLC_OBJECT( x ) \
441     ((vlc_object_t *)(x))+0*(x)->be_sure_to_add_VLC_COMMON_MEMBERS_to_struct
442
443 /*****************************************************************************
444  * Macros and inline functions
445  *****************************************************************************/
446 #ifdef NTOHL_IN_SYS_PARAM_H
447 #   include <sys/param.h>
448
449 #elif !defined(WIN32) && !defined( UNDER_CE )
450 #   include <netinet/in.h>
451
452 #endif /* NTOHL_IN_SYS_PARAM_H || WIN32 */
453
454 /* CEIL: division with round to nearest greater integer */
455 #define CEIL(n, d)  ( ((n) / (d)) + ( ((n) % (d)) ? 1 : 0) )
456
457 /* PAD: PAD(n, d) = CEIL(n ,d) * d */
458 #define PAD(n, d)   ( ((n) % (d)) ? ((((n) / (d)) + 1) * (d)) : (n) )
459
460 /* __MAX and __MIN: self explanatory */
461 #ifndef __MAX
462 #   define __MAX(a, b)   ( ((a) > (b)) ? (a) : (b) )
463 #endif
464 #ifndef __MIN
465 #   define __MIN(a, b)   ( ((a) < (b)) ? (a) : (b) )
466 #endif
467
468 /* Dynamic array handling: realloc array, move data, increment position */
469 #define INSERT_ELEM( p_ar, i_oldsize, i_pos, elem )                           \
470     do                                                                        \
471     {                                                                         \
472         if( i_oldsize )                                                       \
473         {                                                                     \
474             (p_ar) = realloc( p_ar, ((i_oldsize) + 1) * sizeof( *(p_ar) ) );  \
475         }                                                                     \
476         else                                                                  \
477         {                                                                     \
478             (p_ar) = malloc( ((i_oldsize) + 1) * sizeof( *(p_ar) ) );         \
479         }                                                                     \
480         if( (i_oldsize) - (i_pos) )                                           \
481         {                                                                     \
482             memmove( (p_ar) + (i_pos) + 1,                                    \
483                      (p_ar) + (i_pos),                                        \
484                      ((i_oldsize) - (i_pos)) * sizeof( *(p_ar) ) );           \
485         }                                                                     \
486         (p_ar)[i_pos] = elem;                                                 \
487         (i_oldsize)++;                                                        \
488     }                                                                         \
489     while( 0 )
490
491 #define REMOVE_ELEM( p_ar, i_oldsize, i_pos )                                 \
492     do                                                                        \
493     {                                                                         \
494         if( (i_oldsize) - (i_pos) - 1 )                                       \
495         {                                                                     \
496             memmove( (p_ar) + (i_pos),                                        \
497                      (p_ar) + (i_pos) + 1,                                    \
498                      ((i_oldsize) - (i_pos) - 1) * sizeof( *(p_ar) ) );       \
499         }                                                                     \
500         if( i_oldsize > 1 )                                                   \
501         {                                                                     \
502             (p_ar) = realloc( p_ar, ((i_oldsize) - 1) * sizeof( *(p_ar) ) );  \
503         }                                                                     \
504         else                                                                  \
505         {                                                                     \
506             free( p_ar );                                                     \
507             (p_ar) = NULL;                                                    \
508         }                                                                     \
509         (i_oldsize)--;                                                        \
510     }                                                                         \
511     while( 0 )
512
513
514 #define TAB_APPEND( count, tab, p )             \
515     if( (count) > 0 )                           \
516     {                                           \
517         (tab) = realloc( tab, sizeof( void ** ) * ( (count) + 1 ) ); \
518     }                                           \
519     else                                        \
520     {                                           \
521         (tab) = malloc( sizeof( void ** ) );    \
522     }                                           \
523     (tab)[count] = (p);        \
524     (count)++
525
526 #define TAB_FIND( count, tab, p, index )        \
527     {                                           \
528         int _i_;                                \
529         (index) = -1;                           \
530         for( _i_ = 0; _i_ < (count); _i_++ )    \
531         {                                       \
532             if( (tab)[_i_] == (p) )  \
533             {                                   \
534                 (index) = _i_;                  \
535                 break;                          \
536             }                                   \
537         }                                       \
538     }
539
540 #define TAB_REMOVE( count, tab, p )             \
541     {                                           \
542         int _i_index_;                          \
543         TAB_FIND( count, tab, p, _i_index_ );   \
544         if( _i_index_ >= 0 )                    \
545         {                                       \
546             if( (count) > 1 )                     \
547             {                                   \
548                 memmove( ((void**)(tab) + _i_index_),    \
549                          ((void**)(tab) + _i_index_+1),  \
550                          ( (count) - _i_index_ - 1 ) * sizeof( void* ) );\
551             }                                   \
552             (count)--;                          \
553             if( (count) == 0 )                  \
554             {                                   \
555                 free( tab );                    \
556                 (tab) = NULL;                   \
557             }                                   \
558         }                                       \
559     }
560
561 /* MSB (big endian)/LSB (little endian) conversions - network order is always
562  * MSB, and should be used for both network communications and files. Note that
563  * byte orders other than little and big endians are not supported, but only
564  * the VAX seems to have such exotic properties. */
565 static inline uint16_t U16_AT( void const * _p )
566 {
567     uint8_t * p = (uint8_t *)_p;
568     return ( ((uint16_t)p[0] << 8) | p[1] );
569 }
570 static inline uint32_t U32_AT( void const * _p )
571 {
572     uint8_t * p = (uint8_t *)_p;
573     return ( ((uint32_t)p[0] << 24) | ((uint32_t)p[1] << 16)
574               | ((uint32_t)p[2] << 8) | p[3] );
575 }
576 static inline uint64_t U64_AT( void const * _p )
577 {
578     uint8_t * p = (uint8_t *)_p;
579     return ( ((uint64_t)p[0] << 56) | ((uint64_t)p[1] << 48)
580               | ((uint64_t)p[2] << 40) | ((uint64_t)p[3] << 32)
581               | ((uint64_t)p[4] << 24) | ((uint64_t)p[5] << 16)
582               | ((uint64_t)p[6] << 8) | p[7] );
583 }
584
585 static inline uint16_t GetWLE( void const * _p )
586 {
587     uint8_t * p = (uint8_t *)_p;
588     return ( ((uint16_t)p[1] << 8) | p[0] );
589 }
590 static inline uint32_t GetDWLE( void const * _p )
591 {
592     uint8_t * p = (uint8_t *)_p;
593     return ( ((uint32_t)p[3] << 24) | ((uint32_t)p[2] << 16)
594               | ((uint32_t)p[1] << 8) | p[0] );
595 }
596 static inline uint64_t GetQWLE( void const * _p )
597 {
598     uint8_t * p = (uint8_t *)_p;
599     return ( ((uint64_t)p[7] << 56) | ((uint64_t)p[6] << 48)
600               | ((uint64_t)p[5] << 40) | ((uint64_t)p[4] << 32)
601               | ((uint64_t)p[3] << 24) | ((uint64_t)p[2] << 16)
602               | ((uint64_t)p[1] << 8) | p[0] );
603 }
604
605 #define GetWBE( p )     U16_AT( p )
606 #define GetDWBE( p )    U32_AT( p )
607 #define GetQWBE( p )    U64_AT( p )
608
609 /* Helper writer functions */
610
611 #define SetWLE( p, v ) _SetWLE( (uint8_t*)p, v)
612 static inline void _SetWLE( uint8_t *p, uint16_t i_dw )
613 {
614     p[1] = ( i_dw >>  8 )&0xff;
615     p[0] = ( i_dw       )&0xff;
616 }
617
618 #define SetDWLE( p, v ) _SetDWLE( (uint8_t*)p, v)
619 static inline void _SetDWLE( uint8_t *p, uint32_t i_dw )
620 {
621     p[3] = ( i_dw >> 24 )&0xff;
622     p[2] = ( i_dw >> 16 )&0xff;
623     p[1] = ( i_dw >>  8 )&0xff;
624     p[0] = ( i_dw       )&0xff;
625 }
626 #define SetQWLE( p, v ) _SetQWLE( (uint8_t*)p, v)
627 static inline void _SetQWLE( uint8_t *p, uint64_t i_qw )
628 {
629     SetDWLE( p,   i_qw&0xffffffff );
630     SetDWLE( p+4, ( i_qw >> 32)&0xffffffff );
631 }
632
633 #if WORDS_BIGENDIAN
634 #   define hton16(i)   ( i )
635 #   define hton32(i)   ( i )
636 #   define hton64(i)   ( i )
637 #   define ntoh16(i)   ( i )
638 #   define ntoh32(i)   ( i )
639 #   define ntoh64(i)   ( i )
640 #else
641 #   define hton16(i)   U16_AT(&i)
642 #   define hton32(i)   U32_AT(&i)
643 #   define hton64(i)   U64_AT(&i)
644 #   define ntoh16(i)   U16_AT(&i)
645 #   define ntoh32(i)   U32_AT(&i)
646 #   define ntoh64(i)   U64_AT(&i)
647 #endif
648
649 /* Format string sanity checks */
650 #ifdef HAVE_ATTRIBUTE_FORMAT
651 #   define ATTRIBUTE_FORMAT(x,y) __attribute__ ((format(printf,x,y)))
652 #else
653 #   define ATTRIBUTE_FORMAT(x,y)
654 #endif
655
656 /* Alignment of critical static data structures */
657 #ifdef ATTRIBUTE_ALIGNED_MAX
658 #   define ATTR_ALIGN(align) __attribute__ ((__aligned__ ((ATTRIBUTE_ALIGNED_MAX < align) ? ATTRIBUTE_ALIGNED_MAX : align)))
659 #else
660 #   define ATTR_ALIGN(align)
661 #endif
662
663 /* Alignment of critical dynamic data structure
664  *
665  * Not all platforms support memalign so we provide a vlc_memalign wrapper
666  * void *vlc_memalign( size_t align, size_t size, void **pp_orig )
667  * *pp_orig is the pointer that has to be freed afterwards.
668  */
669 #if 0
670 #ifdef HAVE_POSIX_MEMALIGN
671 #   define vlc_memalign(align,size,pp_orig) \
672     ( !posix_memalign( pp_orig, align, size ) ? *(pp_orig) : NULL )
673 #endif
674 #endif
675 #ifdef HAVE_MEMALIGN
676     /* Some systems have memalign() but no declaration for it */
677     void * memalign( size_t align, size_t size );
678
679 #   define vlc_memalign(pp_orig,align,size) \
680     ( *(pp_orig) = memalign( align, size ) )
681
682 #else /* We don't have any choice but to align manually */
683 #   define vlc_memalign(pp_orig,align,size) \
684     (( *(pp_orig) = malloc( size + align - 1 )) \
685         ? (void *)( (((unsigned long)*(pp_orig)) + (unsigned long)(align-1) ) \
686                        & (~(unsigned long)(align-1)) ) \
687         : NULL )
688
689 #endif
690
691 /* Stuff defined in src/extras/libc.c */
692 #ifndef HAVE_STRDUP
693 #   define strdup vlc_strdup
694     VLC_EXPORT( char *, vlc_strdup, ( const char *s ) );
695 #elif !defined(__PLUGIN__)
696 #   define vlc_strdup NULL
697 #endif
698
699 #if !defined(HAVE_VASPRINTF) || defined(SYS_DARWIN) || defined(SYS_BEOS)
700 #   define vasprintf vlc_vasprintf
701     VLC_EXPORT( int, vlc_vasprintf, (char **, const char *, va_list ) );
702 #elif !defined(__PLUGIN__)
703 #   define vlc_vasprintf NULL
704 #endif
705
706 #if !defined(HAVE_ASPRINTF) || defined(SYS_DARWIN) || defined(SYS_BEOS)
707 #   define asprintf vlc_asprintf
708     VLC_EXPORT( int, vlc_asprintf, (char **, const char *, ... ) );
709 #elif !defined(__PLUGIN__)
710 #   define vlc_asprintf NULL
711 #endif
712
713 #ifndef HAVE_STRNDUP
714 #   if defined(STRNDUP_IN_GNOME_H) && \
715         (defined(MODULE_NAME_IS_gnome)||defined(MODULE_NAME_IS_gnome_main)||\
716          defined(MODULE_NAME_IS_gnome2)||defined(MODULE_NAME_IS_gnome2_main))
717         /* Do nothing: gnome.h defines strndup for us */
718 #   else
719 #       define strndup vlc_strndup
720         VLC_EXPORT( char *, vlc_strndup, ( const char *s, size_t n ) );
721 #   endif
722 #elif !defined(__PLUGIN__)
723 #   define vlc_strndup NULL
724 #endif
725
726 #ifndef HAVE_ATOF
727 #   define atof vlc_atof
728     VLC_EXPORT( double, vlc_atof, ( const char *nptr ) );
729 #elif !defined(__PLUGIN__)
730 #   define vlc_atof NULL
731 #endif
732
733 #ifndef HAVE_ATOLL
734 #   define atoll vlc_atoll
735     VLC_EXPORT( int64_t, vlc_atoll, ( const char *nptr ) );
736 #elif !defined(__PLUGIN__)
737 #   define vlc_atoll NULL
738 #endif
739
740 #ifndef HAVE_GETENV
741 #   define getenv vlc_getenv
742     VLC_EXPORT( char *, vlc_getenv, ( const char *name ) );
743 #elif !defined(__PLUGIN__)
744 #   define vlc_getenv NULL
745 #endif
746
747 #ifndef HAVE_STRCASECMP
748 #   ifndef HAVE_STRICMP
749 #       define strcasecmp vlc_strcasecmp
750         VLC_EXPORT( int, vlc_strcasecmp, ( const char *s1, const char *s2 ) );
751 #   else
752 #       define strcasecmp stricmp
753 #       if !defined(__PLUGIN__)
754 #           define vlc_strcasecmp NULL
755 #       endif
756 #   endif
757 #elif !defined(__PLUGIN__)
758 #   define vlc_strcasecmp NULL
759 #endif
760
761 #ifndef HAVE_STRNCASECMP
762 #   ifndef HAVE_STRNICMP
763 #       define strncasecmp vlc_strncasecmp
764         VLC_EXPORT( int, vlc_strncasecmp, ( const char *s1, const char *s2, size_t n ) );
765 #   else
766 #       define strncasecmp strnicmp
767 #       if !defined(__PLUGIN__)
768 #           define vlc_strncasecmp NULL
769 #       endif
770 #   endif
771 #elif !defined(__PLUGIN__)
772 #   define vlc_strncasecmp NULL
773 #endif
774
775 #ifndef HAVE_STRCASESTR
776 #   ifndef HAVE_STRISTR
777 #       define strcasestr vlc_strcasestr
778         VLC_EXPORT( char *, vlc_strcasestr, ( const char *s1, const char *s2 ) );
779 #   else
780 #       define strcasestr stristr
781 #       if !defined(__PLUGIN__)
782 #           define vlc_strcasestr NULL
783 #       endif
784 #   endif
785 #elif !defined(__PLUGIN__)
786 #   define vlc_strcasestr NULL
787 #endif
788
789 /* Format type specifiers for 64 bits numbers */
790 #if !defined(WIN32) && !defined(UNDER_CE)
791 #   define I64Fd "%lld"
792 #   define I64Fi "%lli"
793 #   define I64Fo "%llo"
794 #   define I64Fu "%llu"
795 #   define I64Fx "%llx"
796 #   define I64FX "%llX"
797 #else
798 #   define I64Fd "%I64d"
799 #   define I64Fi "%I64i"
800 #   define I64Fo "%I64o"
801 #   define I64Fu "%I64u"
802 #   define I64Fx "%I64x"
803 #   define I64FX "%I64X"
804 #endif /* defined(WIN32)||defined(UNDER_CE) */
805
806 /* 64 bits integer constant suffix */
807 #if defined( __MINGW32__ ) || (!defined(WIN32) && !defined(UNDER_CE))
808 #   define I64C(x)         x##LL
809 #   define UI64C(x)        x##ULL
810 #else
811 #   define I64C(x)         x##i64
812 #   define UI64C(x)        x##ui64
813 #endif /* defined(WIN32)||defined(UNDER_CE) */
814
815 #if defined(WIN32) || defined(UNDER_CE)
816 /* win32, cl and icl support */
817 #   if defined( _MSC_VER ) || !defined( __MINGW32__ )
818 #       define __attribute__(x)
819 #       define __inline__      __inline
820 #       define S_IFBLK         0x3000  /* Block */
821 #       define S_ISBLK(m)      (0)
822 #       define S_ISCHR(m)      (0)
823 #       define S_ISFIFO(m)     (((m)&_S_IFMT) == _S_IFIFO)
824 #       define S_ISREG(m)      (((m)&_S_IFMT) == _S_IFREG)
825 #   endif
826
827 /* several type definitions */
828 #   if defined( __MINGW32__ )
829 #       if !defined( _OFF_T_ )
830 typedef long long _off_t;
831 typedef _off_t off_t;
832 #           define _OFF_T_
833 #       else
834 #           ifdef off_t
835 #               undef off_t
836 #           endif
837 #           define off_t long long
838 #       endif
839 #   endif
840
841 #   if defined( _MSC_VER )
842 #       if !defined( _OFF_T_DEFINED )
843 typedef __int64 off_t;
844 #           define _OFF_T_DEFINED
845 #       else
846 #           define off_t __int64
847 #       endif
848 #   endif
849
850 #   if defined( __BORLANDC__ )
851 #       undef off_t
852 #       define off_t unsigned __int64
853 #   endif
854
855 #   ifndef O_NONBLOCK
856 #       define O_NONBLOCK 0
857 #   endif
858
859 #   ifndef alloca
860 #       define alloca _alloca
861 #   endif
862
863     /* These two are not defined in mingw32 (bug?) */
864 #   ifndef snprintf
865 #       define snprintf _snprintf
866 #   endif
867 #   ifndef vsnprintf
868 #       define vsnprintf _vsnprintf
869 #   endif
870
871 #endif
872
873 /* lseek (defined in src/extras/libc.c) */
874 #ifndef HAVE_LSEEK
875 #   define lseek vlc_lseek
876     VLC_EXPORT( off_t, vlc_lseek, ( int fildes, off_t offset, int whence ) );
877 #elif !defined(__PLUGIN__)
878 #   define vlc_lseek NULL
879 #endif
880
881 /* vlc_wraptext (defined in src/extras/libc.c) */
882 #define wraptext vlc_wraptext
883 VLC_EXPORT( char *, vlc_wraptext, ( const char *, int, vlc_bool_t ) );
884
885 /*****************************************************************************
886  * CPU capabilities
887  *****************************************************************************/
888 #define CPU_CAPABILITY_NONE    0
889 #define CPU_CAPABILITY_486     (1<<0)
890 #define CPU_CAPABILITY_586     (1<<1)
891 #define CPU_CAPABILITY_PPRO    (1<<2)
892 #define CPU_CAPABILITY_MMX     (1<<3)
893 #define CPU_CAPABILITY_3DNOW   (1<<4)
894 #define CPU_CAPABILITY_MMXEXT  (1<<5)
895 #define CPU_CAPABILITY_SSE     (1<<6)
896 #define CPU_CAPABILITY_SSE2    (1<<7)
897 #define CPU_CAPABILITY_ALTIVEC (1<<16)
898 #define CPU_CAPABILITY_FPU     (1<<31)
899
900 /*****************************************************************************
901  * I18n stuff
902  *****************************************************************************/
903 VLC_EXPORT( char *, vlc_dgettext, ( const char *package, const char *msgid ) );
904
905 #if defined( ENABLE_NLS ) && \
906      (defined(MODULE_NAME_IS_gnome)||defined(MODULE_NAME_IS_gnome_main)||\
907       defined(MODULE_NAME_IS_gnome2)||defined(MODULE_NAME_IS_gnome2_main)||\
908       defined(MODULE_NAME_IS_pda))
909     /* Declare nothing: gnome.h will do it for us */
910 #elif defined( ENABLE_NLS )
911 #if defined( HAVE_INCLUDED_GETTEXT )
912 #   include "libintl.h"
913 #else
914 #   include <libintl.h>
915 #endif
916 #   undef _
917 #if defined( __BORLANDC__ )
918 #define _(String) vlc_dgettext (PACKAGE_TARNAME, String)
919 #else
920 #   define _(String) vlc_dgettext (PACKAGE, String)
921 #endif
922 #   define N_(String) ((char*)(String))
923 #else
924 #   define _(String) ((char*)(String))
925 #   define N_(String) ((char*)(String))
926 #endif
927
928 /*****************************************************************************
929  * Additional vlc stuff
930  *****************************************************************************/
931 #include "vlc_symbols.h"
932 #include "os_specific.h"
933 #include "vlc_messages.h"
934 #include "variables.h"
935 #include "vlc_objects.h"
936 #include "vlc_threads_funcs.h"
937 #include "mtime.h"
938 #include "modules.h"
939 #include "main.h"
940 #include "configuration.h"
941
942 #if defined( __BORLANDC__ )
943 #   undef PACKAGE
944 #   define PACKAGE
945 #endif
946