home *** CD-ROM | disk | FTP | other *** search
/ Maximum CD 2009 May / maximum-cd-2009-05.iso / DiscContents / vlc-0.9.8a-win32.exe / sdk / include / vlc / plugins / vlc_common.h < prev    next >
Encoding:
C/C++ Source or Header  |  2008-12-06  |  31.4 KB  |  900 lines

  1. /*****************************************************************************
  2.  * common.h: common definitions
  3.  * Collection of useful common types and macros definitions
  4.  *****************************************************************************
  5.  * Copyright (C) 1998-2005 the VideoLAN team
  6.  * $Id: a16cf0103f5118fea8d71eb496acb17ff22acc28 $
  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., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
  25.  *****************************************************************************/
  26.  
  27. /**
  28.  * \file
  29.  * This file is a collection of common definitions and types
  30.  */
  31.  
  32. #ifndef VLC_COMMON_H
  33. # define VLC_COMMON_H 1
  34.  
  35. /*****************************************************************************
  36.  * Required vlc headers
  37.  *****************************************************************************/
  38. #if defined( _MSC_VER )
  39. #   pragma warning( disable : 4244 )
  40. #endif
  41.  
  42. #include "vlc_config.h"
  43.  
  44. /*****************************************************************************
  45.  * Required system headers
  46.  *****************************************************************************/
  47. #include <stdlib.h>
  48. #include <stdarg.h>
  49.  
  50. #include <string.h>
  51. #include <stdio.h>
  52. #include <inttypes.h>
  53. #include <stddef.h>
  54.  
  55. #ifndef __cplusplus
  56. # include <stdbool.h>
  57. #endif
  58.  
  59. /*****************************************************************************
  60.  * Basic types definitions
  61.  *****************************************************************************/
  62. #if defined( WIN32 ) || defined( UNDER_CE )
  63. #   include <malloc.h>
  64. #   ifndef PATH_MAX
  65. #       define PATH_MAX MAX_PATH
  66. #   endif
  67. #endif
  68.  
  69. /* Counter for statistics and profiling */
  70. typedef unsigned long       count_t;
  71.  
  72. /* Audio volume */
  73. typedef uint16_t            audio_volume_t;
  74.  
  75. /**
  76.  * High precision date or time interval
  77.  *
  78.  * Store a high precision date or time interval. The maximum precision is the
  79.  * microsecond, and a 64 bits integer is used to avoid overflows (maximum
  80.  * time interval is then 292271 years, which should be long enough for any
  81.  * video). Dates are stored as microseconds since a common date (usually the
  82.  * epoch). Note that date and time intervals can be manipulated using regular
  83.  * arithmetic operators, and that no special functions are required.
  84.  */
  85. typedef int64_t mtime_t;
  86.  
  87. /**
  88.  * The vlc_fourcc_t type.
  89.  *
  90.  * See http://www.webartz.com/fourcc/ for a very detailed list.
  91.  */
  92. typedef uint32_t vlc_fourcc_t;
  93.  
  94. #ifdef WORDS_BIGENDIAN
  95. #   define VLC_FOURCC( a, b, c, d ) \
  96.         ( ((uint32_t)d) | ( ((uint32_t)c) << 8 ) \
  97.            | ( ((uint32_t)b) << 16 ) | ( ((uint32_t)a) << 24 ) )
  98. #   define VLC_TWOCC( a, b ) \
  99.         ( (uint16_t)(b) | ( (uint16_t)(a) << 8 ) )
  100.  
  101. #else
  102. #   define VLC_FOURCC( a, b, c, d ) \
  103.         ( ((uint32_t)a) | ( ((uint32_t)b) << 8 ) \
  104.            | ( ((uint32_t)c) << 16 ) | ( ((uint32_t)d) << 24 ) )
  105. #   define VLC_TWOCC( a, b ) \
  106.         ( (uint16_t)(a) | ( (uint16_t)(b) << 8 ) )
  107.  
  108. #endif
  109.  
  110. static inline void __vlc_fourcc_to_char( vlc_fourcc_t fcc, char *psz_fourcc )
  111. {
  112.     memcpy( psz_fourcc, &fcc, 4 );
  113. }
  114.  
  115. #define vlc_fourcc_to_char( a, b ) \
  116.     __vlc_fourcc_to_char( (vlc_fourcc_t)(a), (char *)(b) )
  117.  
  118. /*****************************************************************************
  119.  * Classes declaration
  120.  *****************************************************************************/
  121.  
  122. /* Internal types */
  123. typedef struct vlc_list_t vlc_list_t;
  124. typedef struct vlc_object_t vlc_object_t;
  125. typedef struct libvlc_int_t libvlc_int_t;
  126. typedef struct variable_t variable_t;
  127. typedef struct date_t date_t;
  128. typedef struct dict_entry_t dict_entry_t;
  129. typedef struct dict_t dict_t;
  130. typedef struct gc_object_t gc_object_t ;
  131.  
  132. /* Messages */
  133. typedef struct msg_subscription_t msg_subscription_t;
  134.  
  135. /* Playlist */
  136.  
  137. /* FIXME */
  138. /**
  139.  * Playlist commands
  140.  */
  141. typedef enum {
  142.     PLAYLIST_PLAY,      /**< No arg.                            res=can fail*/
  143.     PLAYLIST_VIEWPLAY,  /**< arg1= playlist_item_t*,*/
  144.                         /**  arg2 = playlist_item_t*          , res=can fail */
  145.     PLAYLIST_PAUSE,     /**< No arg                             res=can fail*/
  146.     PLAYLIST_STOP,      /**< No arg                             res=can fail*/
  147.     PLAYLIST_SKIP,      /**< arg1=int,                          res=can fail*/
  148. } playlist_command_t;
  149.  
  150.  
  151. typedef struct playlist_t playlist_t;
  152. typedef struct playlist_item_t playlist_item_t;
  153. typedef struct playlist_view_t playlist_view_t;
  154. typedef struct playlist_export_t playlist_export_t;
  155. typedef struct services_discovery_t services_discovery_t;
  156. typedef struct services_discovery_sys_t services_discovery_sys_t;
  157. typedef struct playlist_add_t playlist_add_t;
  158. typedef struct playlist_preparse_t playlist_preparse_t;
  159. typedef struct playlist_fetcher_t playlist_fetcher_t;
  160.  
  161. /* Modules */
  162. typedef struct module_bank_t module_bank_t;
  163. typedef struct module_t module_t;
  164. typedef struct module_config_t module_config_t;
  165. typedef struct module_symbols_t module_symbols_t;
  166. typedef struct module_cache_t module_cache_t;
  167.  
  168. typedef struct config_category_t config_category_t;
  169.  
  170. /* Interface */
  171. typedef struct intf_thread_t intf_thread_t;
  172. typedef struct intf_sys_t intf_sys_t;
  173. typedef struct intf_console_t intf_console_t;
  174. typedef struct intf_msg_t intf_msg_t;
  175. typedef struct interaction_t interaction_t;
  176. typedef struct interaction_dialog_t interaction_dialog_t;
  177. typedef struct user_widget_t user_widget_t;
  178.  
  179. /* Input */
  180. typedef struct input_thread_t input_thread_t;
  181. typedef struct input_thread_sys_t input_thread_sys_t;
  182. typedef struct input_item_t input_item_t;
  183. typedef struct access_t access_t;
  184. typedef struct access_sys_t access_sys_t;
  185. typedef struct stream_t     stream_t;
  186. typedef struct stream_sys_t stream_sys_t;
  187. typedef struct demux_t  demux_t;
  188. typedef struct demux_meta_t demux_meta_t;
  189. typedef struct demux_sys_t demux_sys_t;
  190. typedef struct es_out_t     es_out_t;
  191. typedef struct es_out_id_t  es_out_id_t;
  192. typedef struct es_out_sys_t es_out_sys_t;
  193. typedef struct es_descriptor_t es_descriptor_t;
  194. typedef struct seekpoint_t seekpoint_t;
  195. typedef struct info_t info_t;
  196. typedef struct info_category_t info_category_t;
  197. typedef struct input_attachment_t input_attachment_t;
  198.  
  199. /* Format */
  200. typedef struct audio_format_t audio_format_t;
  201. typedef struct video_format_t video_format_t;
  202. typedef struct subs_format_t subs_format_t;
  203. typedef struct es_format_t es_format_t;
  204. typedef struct video_palette_t video_palette_t;
  205.  
  206. /* Audio */
  207. typedef struct aout_instance_t aout_instance_t;
  208. typedef struct aout_sys_t aout_sys_t;
  209. typedef struct aout_fifo_t aout_fifo_t;
  210. typedef struct aout_input_t aout_input_t;
  211. typedef struct aout_buffer_t aout_buffer_t;
  212. typedef audio_format_t audio_sample_format_t;
  213. typedef struct audio_date_t audio_date_t;
  214. typedef struct aout_filter_t aout_filter_t;
  215.  
  216. /* Video */
  217. typedef struct vout_thread_t vout_thread_t;
  218. typedef struct vout_sys_t vout_sys_t;
  219.  
  220. typedef video_format_t video_frame_format_t;
  221. typedef struct picture_t picture_t;
  222. typedef struct picture_sys_t picture_sys_t;
  223. typedef struct picture_heap_t picture_heap_t;
  224.  
  225. /* Subpictures */
  226. typedef struct spu_t spu_t;
  227. typedef struct subpicture_t subpicture_t;
  228. typedef struct subpicture_sys_t subpicture_sys_t;
  229. typedef struct subpicture_region_t subpicture_region_t;
  230. typedef struct text_style_t text_style_t;
  231.  
  232. typedef struct image_handler_t image_handler_t;
  233.  
  234. /* Stream output */
  235. typedef struct sout_instance_t sout_instance_t;
  236. typedef struct sout_instance_sys_t sout_instance_sys_t;
  237.  
  238. typedef struct sout_input_t sout_input_t;
  239. typedef struct sout_packetizer_input_t sout_packetizer_input_t;
  240.  
  241. typedef struct sout_access_out_t sout_access_out_t;
  242. typedef struct sout_access_out_sys_t   sout_access_out_sys_t;
  243.  
  244. typedef struct sout_mux_t sout_mux_t;
  245. typedef struct sout_mux_sys_t sout_mux_sys_t;
  246.  
  247. typedef struct sout_stream_t    sout_stream_t;
  248. typedef struct sout_stream_sys_t sout_stream_sys_t;
  249.  
  250. typedef struct config_chain_t       config_chain_t;
  251. typedef struct sap_session_t    sap_session_t;
  252. typedef struct sap_address_t sap_address_t;
  253. typedef struct session_descriptor_t session_descriptor_t;
  254. typedef struct announce_method_t announce_method_t;
  255. typedef struct announce_handler_t announce_handler_t;
  256. typedef struct sap_handler_t sap_handler_t;
  257.  
  258. typedef struct sout_param_t sout_param_t;
  259. typedef struct sout_pcat_t sout_pcat_t;
  260. typedef struct sout_std_t sout_std_t;
  261. typedef struct sout_display_t sout_display_t;
  262. typedef struct sout_duplicate_t sout_duplicate_t;
  263. typedef struct sout_transcode_t sout_transcode_t;
  264. typedef struct sout_chain_t sout_chain_t;
  265. typedef struct streaming_profile_t streaming_profile_t;
  266. typedef struct sout_module_t sout_module_t;
  267. typedef struct sout_gui_descr_t sout_gui_descr_t;
  268. typedef struct profile_parser_t profile_parser_t;
  269.  
  270. /* Decoders */
  271. typedef struct decoder_t         decoder_t;
  272. typedef struct decoder_sys_t     decoder_sys_t;
  273. typedef struct decoder_synchro_t decoder_synchro_t;
  274.  
  275. /* Encoders */
  276. typedef struct encoder_t      encoder_t;
  277. typedef struct encoder_sys_t  encoder_sys_t;
  278.  
  279. /* Filters */
  280. typedef struct filter_t filter_t;
  281. typedef struct filter_sys_t filter_sys_t;
  282.  
  283. /* Network */
  284. typedef struct network_socket_t network_socket_t;
  285. typedef struct virtual_socket_t v_socket_t;
  286. typedef struct sockaddr sockaddr;
  287. typedef struct addrinfo addrinfo;
  288. typedef struct vlc_acl_t vlc_acl_t;
  289. typedef struct vlc_url_t vlc_url_t;
  290.  
  291. /* Misc */
  292. typedef struct iso639_lang_t iso639_lang_t;
  293. typedef struct device_t device_t;
  294. typedef struct device_probe_t device_probe_t;
  295. typedef struct probe_sys_t probe_sys_t;
  296.  
  297. /* block */
  298. typedef struct block_t      block_t;
  299. typedef struct block_fifo_t block_fifo_t;
  300.  
  301. /* httpd */
  302. typedef struct httpd_t          httpd_t;
  303. typedef struct httpd_host_t     httpd_host_t;
  304. typedef struct httpd_url_t      httpd_url_t;
  305. typedef struct httpd_client_t   httpd_client_t;
  306. typedef struct httpd_callback_sys_t httpd_callback_sys_t;
  307. typedef struct httpd_message_t  httpd_message_t;
  308. typedef int    (*httpd_callback_t)( httpd_callback_sys_t *, httpd_client_t *, httpd_message_t *answer, const httpd_message_t *query );
  309. typedef struct httpd_file_t     httpd_file_t;
  310. typedef struct httpd_file_sys_t httpd_file_sys_t;
  311. typedef int (*httpd_file_callback_t)( httpd_file_sys_t *, httpd_file_t *, uint8_t *psz_request, uint8_t **pp_data, int *pi_data );
  312. typedef struct httpd_handler_t  httpd_handler_t;
  313. typedef struct httpd_handler_sys_t httpd_handler_sys_t;
  314. typedef int (*httpd_handler_callback_t)( httpd_handler_sys_t *, httpd_handler_t *, char *psz_url, uint8_t *psz_request, int i_type, uint8_t *p_in, int i_in, char *psz_remote_addr, char *psz_remote_host, uint8_t **pp_data, int *pi_data );
  315. typedef struct httpd_redirect_t httpd_redirect_t;
  316. typedef struct httpd_stream_t httpd_stream_t;
  317.  
  318. /* TLS support */
  319. typedef struct tls_server_t tls_server_t;
  320. typedef struct tls_session_t tls_session_t;
  321.  
  322. /* Hashing */
  323. typedef struct md5_s md5_t;
  324.  
  325. /* XML */
  326. typedef struct xml_t xml_t;
  327. typedef struct xml_sys_t xml_sys_t;
  328. typedef struct xml_reader_t xml_reader_t;
  329. typedef struct xml_reader_sys_t xml_reader_sys_t;
  330.  
  331. /* vod server */
  332. typedef struct vod_t     vod_t;
  333. typedef struct vod_sys_t vod_sys_t;
  334. typedef struct vod_media_t vod_media_t;
  335.  
  336. /* opengl */
  337. typedef struct opengl_t     opengl_t;
  338. typedef struct opengl_sys_t opengl_sys_t;
  339.  
  340. /* osdmenu */
  341. typedef struct osd_menu_t   osd_menu_t;
  342. typedef struct osd_state_t  osd_state_t;
  343. typedef struct osd_event_t  osd_event_t;
  344. typedef struct osd_button_t osd_button_t;
  345. typedef struct osd_menu_state_t osd_menu_state_t;
  346.  
  347. /* VLM */
  348. typedef struct vlm_t         vlm_t;
  349. typedef struct vlm_message_t vlm_message_t;
  350.  
  351. /* divers */
  352. typedef struct vlc_meta_t    vlc_meta_t;
  353. typedef struct meta_export_t meta_export_t;
  354.  
  355. /* Stats */
  356. typedef struct counter_t     counter_t;
  357. typedef struct counter_sample_t counter_sample_t;
  358. typedef struct stats_handler_t stats_handler_t;
  359. typedef struct input_stats_t input_stats_t;
  360. typedef struct global_stats_t global_stats_t;
  361.  
  362. /* Update */
  363. typedef struct update_t update_t;
  364. typedef struct update_iterator_t update_iterator_t;
  365.  
  366. /* Meta engine */
  367. typedef struct meta_engine_t meta_engine_t;
  368.  
  369. /* stat/lstat/fstat */
  370. #ifdef WIN32
  371. #include <sys/stat.h>
  372. struct _stati64;
  373. #define stat _stati64
  374. #define fstat _fstati64
  375. /* You should otherwise use utf8_stat and utf8_lstat. */
  376. #else
  377. struct stat;
  378. #endif
  379.  
  380. /**
  381.  * VLC value structure
  382.  */
  383. typedef union
  384. {
  385.     int             i_int;
  386.     bool            b_bool;
  387.     float           f_float;
  388.     char *          psz_string;
  389.     void *          p_address;
  390.     vlc_object_t *  p_object;
  391.     vlc_list_t *    p_list;
  392.     mtime_t         i_time;
  393.  
  394.     struct { char *psz_name; int i_object_id; } var;
  395.  
  396.    /* Make sure the structure is at least 64bits */
  397.     struct { char a, b, c, d, e, f, g, h; } padding;
  398.  
  399. } vlc_value_t;
  400.  
  401. /**
  402.  * VLC list structure
  403.  */
  404. struct vlc_list_t
  405. {
  406.     int             i_count;
  407.     vlc_value_t *   p_values;
  408.     int *           pi_types;
  409.  
  410. };
  411.  
  412. /**
  413.  * \defgroup var_type Variable types
  414.  * These are the different types a vlc variable can have.
  415.  * @{
  416.  */
  417. #define VLC_VAR_VOID      0x0010
  418. #define VLC_VAR_BOOL      0x0020
  419. #define VLC_VAR_INTEGER   0x0030
  420. #define VLC_VAR_HOTKEY    0x0031
  421. #define VLC_VAR_STRING    0x0040
  422. #define VLC_VAR_MODULE    0x0041
  423. #define VLC_VAR_FILE      0x0042
  424. #define VLC_VAR_DIRECTORY 0x0043
  425. #define VLC_VAR_VARIABLE  0x0044
  426. #define VLC_VAR_FLOAT     0x0050
  427. #define VLC_VAR_TIME      0x0060
  428. #define VLC_VAR_ADDRESS   0x0070
  429. #define VLC_VAR_MUTEX     0x0080
  430. #define VLC_VAR_LIST      0x0090
  431. /**@}*/
  432.  
  433. /*****************************************************************************
  434.  * Error values (shouldn't be exposed)
  435.  *****************************************************************************/
  436. #define VLC_SUCCESS         -0                                   /* No error */
  437. #define VLC_ENOMEM          -1                          /* Not enough memory */
  438. #define VLC_ETHREAD         -2                               /* Thread error */
  439. #define VLC_ETIMEOUT        -3                                    /* Timeout */
  440.  
  441. #define VLC_ENOMOD         -10                           /* Module not found */
  442.  
  443. #define VLC_ENOOBJ         -20                           /* Object not found */
  444.  
  445. #define VLC_ENOVAR         -30                         /* Variable not found */
  446. #define VLC_EBADVAR        -31                         /* Bad variable value */
  447.  
  448. #define VLC_ENOITEM        -40                           /**< Item not found */
  449.  
  450. #define VLC_EEXIT         -255                             /* Program exited */
  451. #define VLC_EEXITSUCCESS  -999                /* Program exited successfully */
  452. #define VLC_EGENERIC      -666                              /* Generic error */
  453.  
  454. /*****************************************************************************
  455.  * Variable callbacks
  456.  *****************************************************************************/
  457. typedef int ( * vlc_callback_t ) ( vlc_object_t *,      /* variable's object */
  458.                                    char const *,            /* variable name */
  459.                                    vlc_value_t,                 /* old value */
  460.                                    vlc_value_t,                 /* new value */
  461.                                    void * );                /* callback data */
  462.  
  463. /*****************************************************************************
  464.  * Plug-in stuff
  465.  *****************************************************************************/
  466.  
  467. #ifdef __cplusplus
  468. # define LIBVLC_EXTERN extern "C"
  469. #else
  470. # define LIBVLC_EXTERN extern
  471. #endif
  472. #if defined (WIN32) && defined (DLL_EXPORT)
  473. # define LIBVLC_EXPORT __declspec(dllexport)
  474. #else
  475. # define LIBVLC_EXPORT
  476. #endif
  477. #define VLC_EXPORT( type, name, args ) \
  478.                         LIBVLC_EXTERN LIBVLC_EXPORT type name args
  479.  
  480. /*****************************************************************************
  481.  * OS-specific headers and thread types
  482.  *****************************************************************************/
  483. #if defined( WIN32 ) || defined( UNDER_CE )
  484. #   define WIN32_LEAN_AND_MEAN
  485. #   include <windows.h>
  486. #   if defined( UNDER_CE )
  487. #      define IS_WINNT 0
  488. #   else
  489. #      define IS_WINNT ( GetVersion() < 0x80000000 )
  490. #   endif
  491. #endif
  492.  
  493. #include "vlc_mtime.h"
  494. #include "vlc_threads.h"
  495.  
  496. typedef struct vlc_object_internals_t vlc_object_internals_t;
  497.  
  498. /*****************************************************************************
  499.  * Common structure members
  500.  *****************************************************************************/
  501.  
  502. /* VLC_COMMON_MEMBERS : members common to all basic vlc objects */
  503. #define VLC_COMMON_MEMBERS                                                  \
  504. /** \name VLC_COMMON_MEMBERS                                                \
  505.  * these members are common for all vlc objects                             \
  506.  */                                                                         \
  507. /**@{*/                                                                     \
  508.     int   i_object_id;                                                      \
  509.     int   i_object_type;                                                    \
  510.     const char *psz_object_type;                                            \
  511.     char *psz_object_name;                                                  \
  512.                                                                             \
  513.     /* Messages header */                                                   \
  514.     char *psz_header;                                                       \
  515.     int  i_flags;                                                           \
  516.                                                                             \
  517.     /* Object properties */                                                 \
  518.     volatile bool b_error;                  /**< set by the object */ \
  519.     volatile bool b_die;                   /**< set by the outside */ \
  520.     volatile bool b_dead;                   /**< set by the object */ \
  521.     bool b_force;      /**< set by the outside (eg. module_Need()) */ \
  522.                                                                             \
  523.     /* Stuff related to the libvlc structure */                             \
  524.     libvlc_int_t *p_libvlc;                  /**< (root of all evil) - 1 */ \
  525.                                                                             \
  526.     vlc_object_t *  p_parent;                            /**< our parent */ \
  527.                                                                             \
  528.     /* Private data */                                                      \
  529.     void *          p_private;                                              \
  530.                                                                             \
  531.     /** Just a reminder so that people don't cast garbage */                \
  532.     int be_sure_to_add_VLC_COMMON_MEMBERS_to_struct;                        \
  533. /**@}*/                                                                     \
  534.  
  535. /* VLC_OBJECT: attempt at doing a clever cast */
  536. #ifdef __GNUC__
  537. # define VLC_OBJECT( x ) \
  538.     (((vlc_object_t *)(x))+0*(((typeof(x))0)->be_sure_to_add_VLC_COMMON_MEMBERS_to_struct))
  539. #else
  540. # define VLC_OBJECT( x ) ((vlc_object_t *)(x))
  541. #endif
  542.  
  543. #define VLC_GC_MEMBERS                                                       \
  544. /** \name VLC_GC_MEMBERS                                                     \
  545.  * these members are common to all objects that wish to be garbage-collected \
  546.  */                                                                          \
  547. /**@{*/                                                                      \
  548.     int i_gc_refcount;                                                       \
  549.     void (*pf_destructor) ( gc_object_t * );                                 \
  550.     void *p_destructor_arg;                                                  \
  551. /**@}*/
  552.  
  553. struct gc_object_t
  554. {
  555.     VLC_GC_MEMBERS
  556. };
  557.  
  558. VLC_EXPORT(void, __vlc_gc_incref, ( gc_object_t * p_gc ));
  559. VLC_EXPORT(void, __vlc_gc_decref, ( gc_object_t * p_gc ));
  560. VLC_EXPORT(void, __vlc_gc_init, ( gc_object_t * p_gc,
  561.     void (*pf_destructor)( gc_object_t * ), void * arg));
  562.  
  563. #define vlc_gc_incref( a ) __vlc_gc_incref( (gc_object_t *)a )
  564. #define vlc_gc_decref( a ) __vlc_gc_decref( (gc_object_t *)a )
  565. #define vlc_gc_init( a,b,c ) __vlc_gc_init( (gc_object_t *)a,b,c )
  566.  
  567.  
  568. /*****************************************************************************
  569.  * Macros and inline functions
  570.  *****************************************************************************/
  571.  
  572. /* CEIL: division with round to nearest greater integer */
  573. #define CEIL(n, d)  ( ((n) / (d)) + ( ((n) % (d)) ? 1 : 0) )
  574.  
  575. /* PAD: PAD(n, d) = CEIL(n ,d) * d */
  576. #define PAD(n, d)   ( ((n) % (d)) ? ((((n) / (d)) + 1) * (d)) : (n) )
  577.  
  578. /* __MAX and __MIN: self explanatory */
  579. #ifndef __MAX
  580. #   define __MAX(a, b)   ( ((a) > (b)) ? (a) : (b) )
  581. #endif
  582. #ifndef __MIN
  583. #   define __MIN(a, b)   ( ((a) < (b)) ? (a) : (b) )
  584. #endif
  585.  
  586. static inline int64_t GCD( int64_t a, int64_t b )
  587. {
  588.     while( b )
  589.     {
  590.         int64_t c = a % b;
  591.         a = b;
  592.         b = c;
  593.     }
  594.     return a;
  595. }
  596.  
  597. /* function imported from libavutil/common.h */
  598. static inline uint8_t clip_uint8_vlc( int32_t a )
  599. {
  600.     if( a&(~255) ) return (-a)>>31;
  601.     else           return a;
  602. }
  603.  
  604. /* Malloc with automatic error */
  605. #define MALLOC_VOID( var, type ) do { var = (type*)malloc( sizeof( type) ); \
  606.                                    if( !var ) return; } while(0)
  607. #define MALLOC_NULL( var, type ) do { var = (type*)malloc( sizeof( type) ); \
  608.                                    if( !var ) return NULL; } while(0)
  609. #define MALLOC_ERR( var, type ) do { var = (type*)malloc( sizeof( type) ); \
  610.                                    if( !var ) return VLC_ENOMEM; } while(0)
  611. #define MALLOC_GOTOERR( var, type ) do { var = (type*)malloc( sizeof( type) ); \
  612.                                       if( !var ) goto error; } while(0)
  613. #define DECMALLOC_VOID( var, type ) type* var = (type*)malloc( sizeof(type) );\
  614.                                     if( !var ) return;
  615. #define DECMALLOC_ERR( var, type )  type* var = (type*)malloc( sizeof(type) );\
  616.                                     if( !var ) return VLC_ENOMEM;
  617. #define DECMALLOC_NULL( var, type ) type* var = (type*)malloc( sizeof(type) );\
  618.                                     if( !var ) return NULL;
  619.  
  620. #define FREENULL(a) do { free( a ); a = NULL; } while(0)
  621.  
  622. #define EMPTY_STR(str) (!str || !*str)
  623.  
  624. VLC_EXPORT( char const *, vlc_error, ( int ) );
  625.  
  626. #include <vlc_arrays.h>
  627.  
  628. /* MSB (big endian)/LSB (little endian) conversions - network order is always
  629.  * MSB, and should be used for both network communications and files. */
  630. static inline uint16_t U16_AT( const void * _p )
  631. {
  632.     const uint8_t * p = (const uint8_t *)_p;
  633.     return ( ((uint16_t)p[0] << 8) | p[1] );
  634. }
  635. static inline uint32_t U32_AT( const void * _p )
  636. {
  637.     const uint8_t * p = (const uint8_t *)_p;
  638.     return ( ((uint32_t)p[0] << 24) | ((uint32_t)p[1] << 16)
  639.               | ((uint32_t)p[2] << 8) | p[3] );
  640. }
  641. static inline uint64_t U64_AT( const void * _p )
  642. {
  643.     const uint8_t * p = (const uint8_t *)_p;
  644.     return ( ((uint64_t)p[0] << 56) | ((uint64_t)p[1] << 48)
  645.               | ((uint64_t)p[2] << 40) | ((uint64_t)p[3] << 32)
  646.               | ((uint64_t)p[4] << 24) | ((uint64_t)p[5] << 16)
  647.               | ((uint64_t)p[6] << 8) | p[7] );
  648. }
  649.  
  650. static inline uint16_t GetWLE( const void * _p )
  651. {
  652.     const uint8_t * p = (const uint8_t *)_p;
  653.     return ( ((uint16_t)p[1] << 8) | p[0] );
  654. }
  655. static inline uint32_t GetDWLE( const void * _p )
  656. {
  657.     const uint8_t * p = (const uint8_t *)_p;
  658.     return ( ((uint32_t)p[3] << 24) | ((uint32_t)p[2] << 16)
  659.               | ((uint32_t)p[1] << 8) | p[0] );
  660. }
  661. static inline uint64_t GetQWLE( const void * _p )
  662. {
  663.     const uint8_t * p = (const uint8_t *)_p;
  664.     return ( ((uint64_t)p[7] << 56) | ((uint64_t)p[6] << 48)
  665.               | ((uint64_t)p[5] << 40) | ((uint64_t)p[4] << 32)
  666.               | ((uint64_t)p[3] << 24) | ((uint64_t)p[2] << 16)
  667.               | ((uint64_t)p[1] << 8) | p[0] );
  668. }
  669.  
  670. #define GetWBE( p )     U16_AT( p )
  671. #define GetDWBE( p )    U32_AT( p )
  672. #define GetQWBE( p )    U64_AT( p )
  673.  
  674. /* Helper writer functions */
  675. #define SetWLE( p, v ) _SetWLE( (uint8_t*)(p), v)
  676. static inline void _SetWLE( uint8_t *p, uint16_t i_dw )
  677. {
  678.     p[1] = ( i_dw >>  8 )&0xff;
  679.     p[0] = ( i_dw       )&0xff;
  680. }
  681.  
  682. #define SetDWLE( p, v ) _SetDWLE( (uint8_t*)(p), v)
  683. static inline void _SetDWLE( uint8_t *p, uint32_t i_dw )
  684. {
  685.     p[3] = ( i_dw >> 24 )&0xff;
  686.     p[2] = ( i_dw >> 16 )&0xff;
  687.     p[1] = ( i_dw >>  8 )&0xff;
  688.     p[0] = ( i_dw       )&0xff;
  689. }
  690. #define SetQWLE( p, v ) _SetQWLE( (uint8_t*)(p), v)
  691. static inline void _SetQWLE( uint8_t *p, uint64_t i_qw )
  692. {
  693.     SetDWLE( p,   i_qw&0xffffffff );
  694.     SetDWLE( p+4, ( i_qw >> 32)&0xffffffff );
  695. }
  696. #define SetWBE( p, v ) _SetWBE( (uint8_t*)(p), v)
  697. static inline void _SetWBE( uint8_t *p, uint16_t i_dw )
  698. {
  699.     p[0] = ( i_dw >>  8 )&0xff;
  700.     p[1] = ( i_dw       )&0xff;
  701. }
  702.  
  703. #define SetDWBE( p, v ) _SetDWBE( (uint8_t*)(p), v)
  704. static inline void _SetDWBE( uint8_t *p, uint32_t i_dw )
  705. {
  706.     p[0] = ( i_dw >> 24 )&0xff;
  707.     p[1] = ( i_dw >> 16 )&0xff;
  708.     p[2] = ( i_dw >>  8 )&0xff;
  709.     p[3] = ( i_dw       )&0xff;
  710. }
  711. #define SetQWBE( p, v ) _SetQWBE( (uint8_t*)(p), v)
  712. static inline void _SetQWBE( uint8_t *p, uint64_t i_qw )
  713. {
  714.     SetDWBE( p+4,   i_qw&0xffffffff );
  715.     SetDWBE( p, ( i_qw >> 32)&0xffffffff );
  716. }
  717.  
  718. #define hton16(i) htons(i)
  719. #define hton32(i) htonl(i)
  720. #define ntoh16(i) ntohs(i)
  721. #define ntoh32(i) ntohl(i)
  722.  
  723. static inline uint64_t ntoh64 (uint64_t ll)
  724. {
  725.     union { uint64_t qw; uint8_t b[16]; } v = { ll };
  726.     return ((uint64_t)v.b[0] << 56)
  727.          | ((uint64_t)v.b[1] << 48)
  728.          | ((uint64_t)v.b[2] << 40)
  729.          | ((uint64_t)v.b[3] << 32)
  730.          | ((uint64_t)v.b[4] << 24)
  731.          | ((uint64_t)v.b[5] << 16)
  732.          | ((uint64_t)v.b[6] <<  8)
  733.          | ((uint64_t)v.b[7] <<  0);
  734. }
  735. #define hton64(i) ntoh64(i)
  736.  
  737. /* Format string sanity checks */
  738. #ifdef __GNUC__
  739. #   define LIBVLC_FORMAT(x,y) __attribute__ ((format(printf,x,y)))
  740. #else
  741. #   define LIBVLC_FORMAT(x,y)
  742. #endif
  743.  
  744. /* */
  745. #define VLC_UNUSED(x) (void)(x)
  746.  
  747. /* Stuff defined in src/extras/libc.c */
  748. VLC_EXPORT( size_t, vlc_strlcpy, ( char *, const char *, size_t ) );
  749. VLC_EXPORT( long long, vlc_strtoll, ( const char *nptr, char **endptr, int base ) );
  750.  
  751. VLC_EXPORT( char *, vlc_strcasestr, ( const char *s1, const char *s2 ) );
  752.  
  753. #if defined(WIN32) || defined(UNDER_CE)
  754. /* win32, cl and icl support */
  755. #   if defined( _MSC_VER ) || !defined( __MINGW32__ )
  756. #       define __attribute__(x)
  757. #       define __inline__      __inline
  758. #       define S_IFBLK         0x3000  /* Block */
  759. #       define S_ISBLK(m)      (0)
  760. #       define S_ISCHR(m)      (0)
  761. #       define S_ISFIFO(m)     (((m)&_S_IFMT) == _S_IFIFO)
  762. #       define S_ISREG(m)      (((m)&_S_IFMT) == _S_IFREG)
  763. #   endif
  764.  
  765. /* several type definitions */
  766. #   if defined( __MINGW32__ )
  767. #       if !defined( _OFF_T_ )
  768.             typedef long long _off_t;
  769.             typedef _off_t off_t;
  770. #           define _OFF_T_
  771. #       else
  772. #           ifdef off_t
  773. #               undef off_t
  774. #           endif
  775. #           define off_t long long
  776. #       endif
  777. #   endif
  778.  
  779. #   if defined( _MSC_VER ) && !defined( __WXMSW__ )
  780. #       if !defined( _OFF_T_DEFINED )
  781.             typedef __int64 off_t;
  782. #           define _OFF_T_DEFINED
  783. #       else
  784.             /* for wx compatibility typedef long off_t; */
  785. #           define off_t __int64
  786. #       endif
  787. #   endif
  788.  
  789. #   if defined( __BORLANDC__ )
  790. #       undef off_t
  791. #       define off_t unsigned __int64
  792. #   endif
  793.  
  794. #   ifndef O_NONBLOCK
  795. #       define O_NONBLOCK 0
  796. #   endif
  797.  
  798. #   ifndef alloca
  799. #       define alloca _alloca
  800. #   endif
  801.  
  802.     /* These two are not defined in mingw32 (bug?) */
  803. #   ifndef snprintf
  804. #       define snprintf _snprintf
  805. #   endif
  806. #   ifndef vsnprintf
  807. #       define vsnprintf _vsnprintf
  808. #   endif
  809.  
  810. #   include <tchar.h>
  811. #endif
  812.  
  813. VLC_EXPORT( bool, vlc_ureduce, ( unsigned *, unsigned *, uint64_t, uint64_t, uint64_t ) );
  814.  
  815. /* vlc_wraptext (defined in src/extras/libc.c) */
  816. #define wraptext vlc_wraptext
  817. VLC_EXPORT( char *, vlc_wraptext, ( const char *, int ) );
  818.  
  819. /* iconv wrappers (defined in src/extras/libc.c) */
  820. typedef void *vlc_iconv_t;
  821. VLC_EXPORT( vlc_iconv_t, vlc_iconv_open, ( const char *, const char * ) );
  822. VLC_EXPORT( size_t, vlc_iconv, ( vlc_iconv_t, const char **, size_t *, char **, size_t * ) );
  823. VLC_EXPORT( int, vlc_iconv_close, ( vlc_iconv_t ) );
  824.  
  825. /* execve wrapper (defined in src/extras/libc.c) */
  826. VLC_EXPORT( int, __vlc_execve, ( vlc_object_t *p_object, int i_argc, char *const *pp_argv, char *const *pp_env, const char *psz_cwd, const char *p_in, size_t i_in, char **pp_data, size_t *pi_data ) );
  827. #define vlc_execve(a,b,c,d,e,f,g,h,i) __vlc_execve(VLC_OBJECT(a),b,c,d,e,f,g,h,i)
  828.  
  829. /* dir wrappers (defined in src/extras/libc.c) */
  830. VLC_EXPORT(int, vlc_wclosedir, ( void *_p_dir ));
  831.  
  832. /*****************************************************************************
  833.  * CPU capabilities
  834.  *****************************************************************************/
  835. #define CPU_CAPABILITY_NONE    0
  836. #define CPU_CAPABILITY_486     (1<<0)
  837. #define CPU_CAPABILITY_586     (1<<1)
  838. #define CPU_CAPABILITY_PPRO    (1<<2)
  839. #define CPU_CAPABILITY_MMX     (1<<3)
  840. #define CPU_CAPABILITY_3DNOW   (1<<4)
  841. #define CPU_CAPABILITY_MMXEXT  (1<<5)
  842. #define CPU_CAPABILITY_SSE     (1<<6)
  843. #define CPU_CAPABILITY_SSE2    (1<<7)
  844. #define CPU_CAPABILITY_ALTIVEC (1<<16)
  845. #define CPU_CAPABILITY_FPU     (1<<31)
  846. VLC_EXPORT( unsigned, vlc_CPU, ( void ) );
  847.  
  848. typedef void *(*vlc_memcpy_t) (void *tgt, const void *src, size_t n);
  849. typedef void *(*vlc_memset_t) (void *tgt, int c, size_t n);
  850.  
  851. VLC_EXPORT( void, vlc_fastmem_register, (vlc_memcpy_t cpy, vlc_memset_t set) );
  852. VLC_EXPORT( void *, vlc_memcpy, ( void *, const void *, size_t ) );
  853. VLC_EXPORT( void *, vlc_memset, ( void *, int, size_t ) );
  854.  
  855. /*****************************************************************************
  856.  * I18n stuff
  857.  *****************************************************************************/
  858. VLC_EXPORT( char *, vlc_gettext, ( const char *msgid ) );
  859.  
  860. /*****************************************************************************
  861.  * libvlc features
  862.  *****************************************************************************/
  863. VLC_EXPORT( const char *, VLC_Version, ( void ) );
  864. VLC_EXPORT( const char *, VLC_CompileBy, ( void ) );
  865. VLC_EXPORT( const char *, VLC_CompileHost, ( void ) );
  866. VLC_EXPORT( const char *, VLC_CompileDomain, ( void ) );
  867. VLC_EXPORT( const char *, VLC_Compiler, ( void ) );
  868. VLC_EXPORT( const char *, VLC_Error, ( int ) );
  869. VLC_EXPORT( const char *, VLC_Changeset, ( void ) );
  870.  
  871. /*****************************************************************************
  872.  * Additional vlc stuff
  873.  *****************************************************************************/
  874. #include "vlc_messages.h"
  875. #include "vlc_variables.h"
  876. #include "vlc_objects.h"
  877. #include "vlc_modules.h"
  878. #include "vlc_main.h"
  879. #include "vlc_configuration.h"
  880.  
  881. #if defined( WIN32 ) || defined( UNDER_CE )
  882. #   define DIR_SEP_CHAR '\\'
  883. #   define DIR_SEP "\\"
  884. #   define PATH_SEP_CHAR ';'
  885. #   define PATH_SEP ";"
  886. #else
  887. #   define DIR_SEP_CHAR '/'
  888. #   define DIR_SEP "/"
  889. #   define PATH_SEP_CHAR ':'
  890. #   define PATH_SEP ":"
  891. #endif
  892.  
  893. #define LICENSE_MSG \
  894.   _("This program comes with NO WARRANTY, to the extent permitted by " \
  895.     "law.\nYou may redistribute it under the terms of the GNU General " \
  896.     "Public License;\nsee the file named COPYING for details.\n" \
  897.     "Written by the VideoLAN team; see the AUTHORS file.\n")
  898.  
  899. #endif /* !VLC_COMMON_H */
  900.