vlc_common.h
上传用户:riyaled888
上传日期:2009-03-27
资源大小:7338k
文件大小:36k
源码类别:

多媒体

开发平台:

MultiPlatform

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