home *** CD-ROM | disk | FTP | other *** search
/ mail.altrad.com / 2015.02.mail.altrad.com.tar / mail.altrad.com / TEST / vlc-2-0-5-win32.exe / sdk / include / vlc / plugins / vlc_common.h < prev    next >
C/C++ Source or Header  |  2012-12-12  |  30KB  |  1,030 lines

  1. /*****************************************************************************
  2.  * common.h: common definitions
  3.  * Collection of useful common types and macros definitions
  4.  *****************************************************************************
  5.  * Copyright (C) 1998-2011 VLC authors and VideoLAN
  6.  *
  7.  * Authors: Samuel Hocevar <sam@via.ecp.fr>
  8.  *          Vincent Seguin <seguin@via.ecp.fr>
  9.  *          Gildas Bazin <gbazin@videolan.org>
  10.  *          R├⌐mi Denis-Courmont
  11.  *
  12.  * This program is free software; you can redistribute it and/or modify it
  13.  * under the terms of the GNU Lesser General Public License as published by
  14.  * the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details.
  21.  *
  22.  * You should have received a copy of the GNU Lesser General Public License
  23.  * along with this program; if not, write to the Free Software Foundation,
  24.  * 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. /* Helper for GCC version checks */
  60. #ifdef __GNUC__
  61. # define VLC_GCC_VERSION(maj,min) \
  62.     ((__GNUC__ > (maj)) || (__GNUC__ == (maj) && __GNUC_MINOR__ >= (min)))
  63. #else
  64. # define VLC_GCC_VERSION(maj,min) (0)
  65. #endif
  66.  
  67. /* Try to fix format strings for all versions of mingw and mingw64 */
  68. #if defined( _WIN32 ) && defined( __USE_MINGW_ANSI_STDIO )
  69.  #undef PRId64
  70.  #define PRId64 "lld"
  71.  #undef PRIi64
  72.  #define PRIi64 "lli"
  73.  #undef PRIu64
  74.  #define PRIu64 "llu"
  75.  #undef PRIo64
  76.  #define PRIo64 "llo"
  77.  #undef PRIx64
  78.  #define PRIx64 "llx"
  79.  #define snprintf __mingw_snprintf
  80.  #define vsnprintf __mingw_vsnprintf
  81. #endif
  82.  
  83. /* Function attributes for compiler warnings */
  84. #ifdef __GNUC__
  85. # define VLC_DEPRECATED __attribute__((deprecated))
  86.  
  87. # if defined( _WIN32 ) && VLC_GCC_VERSION(4,4)
  88. #  define VLC_FORMAT(x,y) __attribute__ ((format(gnu_printf,x,y)))
  89. # else
  90. #  define VLC_FORMAT(x,y) __attribute__ ((format(printf,x,y)))
  91. # endif
  92. # define VLC_FORMAT_ARG(x) __attribute__ ((format_arg(x)))
  93.  
  94. # define VLC_MALLOC __attribute__ ((malloc))
  95. # define VLC_NORETURN __attribute__ ((noreturn))
  96.  
  97. # if VLC_GCC_VERSION(3,4)
  98. #  define VLC_USED __attribute__ ((warn_unused_result))
  99. # else
  100. #  define VLC_USED
  101. # endif
  102.  
  103. #else
  104. # define VLC_DEPRECATED
  105. # define VLC_FORMAT(x,y)
  106. # define VLC_FORMAT_ARG(x)
  107. # define VLC_MALLOC
  108. # define VLC_NORETURN
  109. # define VLC_USED
  110. #endif
  111.  
  112.  
  113. /* Branch prediction */
  114. #ifdef __GNUC__
  115. #   define likely(p)   __builtin_expect(!!(p), 1)
  116. #   define unlikely(p) __builtin_expect(!!(p), 0)
  117. #else
  118. #   define likely(p)   (!!(p))
  119. #   define unlikely(p) (!!(p))
  120. #endif
  121.  
  122. /* Linkage */
  123. #ifdef __cplusplus
  124. # define VLC_EXTERN extern "C"
  125. #else
  126. # define VLC_EXTERN
  127. #endif
  128.  
  129. #if defined (WIN32) && defined (DLL_EXPORT)
  130. # define VLC_EXPORT __declspec(dllexport)
  131. #elif VLC_GCC_VERSION(4,0)
  132. # define VLC_EXPORT __attribute__((visibility("default")))
  133. #else
  134. # define VLC_EXPORT
  135. #endif
  136.  
  137. #define VLC_API VLC_EXTERN VLC_EXPORT
  138.  
  139.  
  140. /*****************************************************************************
  141.  * Basic types definitions
  142.  *****************************************************************************/
  143. #if defined( WIN32 ) || defined( UNDER_CE )
  144. #   include <malloc.h>
  145. #   ifndef PATH_MAX
  146. #       define PATH_MAX MAX_PATH
  147. #   endif
  148. #endif
  149.  
  150. #ifdef __SYMBIAN32__
  151.  #include <sys/syslimits.h>
  152. #endif
  153.  
  154. /* Counter for statistics and profiling */
  155. typedef unsigned long       count_t;
  156.  
  157. /* Audio volume */
  158. typedef uint16_t            audio_volume_t;
  159.  
  160. /**
  161.  * High precision date or time interval
  162.  *
  163.  * Store a high precision date or time interval. The maximum precision is the
  164.  * microsecond, and a 64 bits integer is used to avoid overflows (maximum
  165.  * time interval is then 292271 years, which should be long enough for any
  166.  * video). Dates are stored as microseconds since a common date (usually the
  167.  * epoch). Note that date and time intervals can be manipulated using regular
  168.  * arithmetic operators, and that no special functions are required.
  169.  */
  170. typedef int64_t mtime_t;
  171.  
  172. /**
  173.  * The vlc_fourcc_t type.
  174.  *
  175.  * See http://www.webartz.com/fourcc/ for a very detailed list.
  176.  */
  177. typedef uint32_t vlc_fourcc_t;
  178.  
  179. #ifdef WORDS_BIGENDIAN
  180. #   define VLC_FOURCC( a, b, c, d ) \
  181.         ( ((uint32_t)d) | ( ((uint32_t)c) << 8 ) \
  182.            | ( ((uint32_t)b) << 16 ) | ( ((uint32_t)a) << 24 ) )
  183. #   define VLC_TWOCC( a, b ) \
  184.         ( (uint16_t)(b) | ( (uint16_t)(a) << 8 ) )
  185.  
  186. #else
  187. #   define VLC_FOURCC( a, b, c, d ) \
  188.         ( ((uint32_t)a) | ( ((uint32_t)b) << 8 ) \
  189.            | ( ((uint32_t)c) << 16 ) | ( ((uint32_t)d) << 24 ) )
  190. #   define VLC_TWOCC( a, b ) \
  191.         ( (uint16_t)(a) | ( (uint16_t)(b) << 8 ) )
  192.  
  193. #endif
  194.  
  195. /**
  196.  * Translate a vlc_fourcc into its string representation. This function
  197.  * assumes there is enough room in psz_fourcc to store 4 characters in.
  198.  *
  199.  * \param fcc a vlc_fourcc_t
  200.  * \param psz_fourcc string to store string representation of vlc_fourcc in
  201.  */
  202. static inline void vlc_fourcc_to_char( vlc_fourcc_t fcc, char *psz_fourcc )
  203. {
  204.     memcpy( psz_fourcc, &fcc, 4 );
  205. }
  206.  
  207. #define vlc_fourcc_to_char( a, b ) \
  208.         vlc_fourcc_to_char( (vlc_fourcc_t)(a), (char *)(b) )
  209.  
  210. /*****************************************************************************
  211.  * Classes declaration
  212.  *****************************************************************************/
  213.  
  214. /* Internal types */
  215. typedef struct vlc_list_t vlc_list_t;
  216. typedef struct vlc_object_t vlc_object_t;
  217. typedef struct libvlc_int_t libvlc_int_t;
  218. typedef struct date_t date_t;
  219.  
  220. /* Playlist */
  221.  
  222. /* FIXME */
  223. /**
  224.  * Playlist commands
  225.  */
  226. typedef enum {
  227.     PLAYLIST_PLAY,      /**< No arg.                            res=can fail*/
  228.     PLAYLIST_VIEWPLAY,  /**< arg1= playlist_item_t*,*/
  229.                         /**  arg2 = playlist_item_t*          , res=can fail */
  230.     PLAYLIST_PAUSE,     /**< No arg                             res=can fail*/
  231.     PLAYLIST_STOP,      /**< No arg                             res=can fail*/
  232.     PLAYLIST_SKIP,      /**< arg1=int,                          res=can fail*/
  233. } playlist_command_t;
  234.  
  235.  
  236. typedef struct playlist_t playlist_t;
  237. typedef struct playlist_item_t playlist_item_t;
  238. typedef struct playlist_view_t playlist_view_t;
  239. typedef struct services_discovery_t services_discovery_t;
  240. typedef struct services_discovery_sys_t services_discovery_sys_t;
  241. typedef struct playlist_add_t playlist_add_t;
  242.  
  243. /* Modules */
  244. typedef struct module_t module_t;
  245. typedef struct module_config_t module_config_t;
  246.  
  247. typedef struct config_category_t config_category_t;
  248.  
  249. /* Input */
  250. typedef struct input_thread_t input_thread_t;
  251. typedef struct input_item_t input_item_t;
  252. typedef struct input_item_node_t input_item_node_t;
  253. typedef struct access_t access_t;
  254. typedef struct access_sys_t access_sys_t;
  255. typedef struct stream_t     stream_t;
  256. typedef struct stream_sys_t stream_sys_t;
  257. typedef struct demux_t  demux_t;
  258. typedef struct demux_sys_t demux_sys_t;
  259. typedef struct es_out_t     es_out_t;
  260. typedef struct es_out_id_t  es_out_id_t;
  261. typedef struct es_out_sys_t es_out_sys_t;
  262. typedef struct seekpoint_t seekpoint_t;
  263. typedef struct info_t info_t;
  264. typedef struct info_category_t info_category_t;
  265. typedef struct input_attachment_t input_attachment_t;
  266.  
  267. /* Format */
  268. typedef struct audio_format_t audio_format_t;
  269. typedef struct video_format_t video_format_t;
  270. typedef struct subs_format_t subs_format_t;
  271. typedef struct es_format_t es_format_t;
  272. typedef struct video_palette_t video_palette_t;
  273.  
  274. /* Audio */
  275. typedef struct audio_output audio_output_t;
  276. typedef struct aout_sys_t aout_sys_t;
  277. typedef struct aout_fifo_t aout_fifo_t;
  278. typedef struct aout_input_t aout_input_t;
  279. typedef struct block_t aout_buffer_t;
  280. typedef audio_format_t audio_sample_format_t;
  281.  
  282. /* Video */
  283. typedef struct vout_thread_t vout_thread_t;
  284.  
  285. typedef video_format_t video_frame_format_t;
  286. typedef struct picture_t picture_t;
  287. typedef struct picture_sys_t picture_sys_t;
  288.  
  289. /* Subpictures */
  290. typedef struct spu_t spu_t;
  291. typedef struct subpicture_t subpicture_t;
  292. typedef struct subpicture_sys_t subpicture_sys_t;
  293. typedef struct subpicture_region_t subpicture_region_t;
  294.  
  295. typedef struct image_handler_t image_handler_t;
  296.  
  297. /* Stream output */
  298. typedef struct sout_instance_t sout_instance_t;
  299. typedef struct sout_instance_sys_t sout_instance_sys_t;
  300.  
  301. typedef struct sout_input_t sout_input_t;
  302. typedef struct sout_packetizer_input_t sout_packetizer_input_t;
  303.  
  304. typedef struct sout_access_out_t sout_access_out_t;
  305. typedef struct sout_access_out_sys_t   sout_access_out_sys_t;
  306.  
  307. typedef struct sout_mux_t sout_mux_t;
  308. typedef struct sout_mux_sys_t sout_mux_sys_t;
  309.  
  310. typedef struct sout_stream_t    sout_stream_t;
  311. typedef struct sout_stream_sys_t sout_stream_sys_t;
  312.  
  313. typedef struct config_chain_t       config_chain_t;
  314. typedef struct session_descriptor_t session_descriptor_t;
  315.  
  316. /* Decoders */
  317. typedef struct decoder_t         decoder_t;
  318. typedef struct decoder_sys_t     decoder_sys_t;
  319. typedef struct decoder_synchro_t decoder_synchro_t;
  320.  
  321. /* Encoders */
  322. typedef struct encoder_t      encoder_t;
  323. typedef struct encoder_sys_t  encoder_sys_t;
  324.  
  325. /* Filters */
  326. typedef struct filter_t filter_t;
  327. typedef struct filter_sys_t filter_sys_t;
  328.  
  329. /* Network */
  330. typedef struct virtual_socket_t v_socket_t;
  331. typedef struct vlc_acl_t vlc_acl_t;
  332. typedef struct vlc_url_t vlc_url_t;
  333.  
  334. /* Misc */
  335. typedef struct iso639_lang_t iso639_lang_t;
  336.  
  337. /* block */
  338. typedef struct block_t      block_t;
  339. typedef struct block_fifo_t block_fifo_t;
  340.  
  341. /* httpd */
  342. typedef struct httpd_t          httpd_t;
  343. typedef struct httpd_host_t     httpd_host_t;
  344. typedef struct httpd_url_t      httpd_url_t;
  345. typedef struct httpd_client_t   httpd_client_t;
  346. typedef struct httpd_callback_sys_t httpd_callback_sys_t;
  347. typedef struct httpd_message_t  httpd_message_t;
  348. typedef int    (*httpd_callback_t)( httpd_callback_sys_t *, httpd_client_t *, httpd_message_t *answer, const httpd_message_t *query );
  349. typedef struct httpd_file_t     httpd_file_t;
  350. typedef struct httpd_file_sys_t httpd_file_sys_t;
  351. typedef int (*httpd_file_callback_t)( httpd_file_sys_t *, httpd_file_t *, uint8_t *psz_request, uint8_t **pp_data, int *pi_data );
  352. typedef struct httpd_handler_t  httpd_handler_t;
  353. typedef struct httpd_handler_sys_t httpd_handler_sys_t;
  354. 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 );
  355. typedef struct httpd_redirect_t httpd_redirect_t;
  356. typedef struct httpd_stream_t httpd_stream_t;
  357.  
  358. /* Hashing */
  359. typedef struct md5_s md5_t;
  360.  
  361. /* XML */
  362. typedef struct xml_t xml_t;
  363. typedef struct xml_sys_t xml_sys_t;
  364. typedef struct xml_reader_t xml_reader_t;
  365. typedef struct xml_reader_sys_t xml_reader_sys_t;
  366.  
  367. /* vod server */
  368. typedef struct vod_t     vod_t;
  369. typedef struct vod_sys_t vod_sys_t;
  370. typedef struct vod_media_t vod_media_t;
  371.  
  372. /* osdmenu */
  373. typedef struct osd_menu_t   osd_menu_t;
  374. typedef struct osd_state_t  osd_state_t;
  375. typedef struct osd_event_t  osd_event_t;
  376. typedef struct osd_button_t osd_button_t;
  377. typedef struct osd_menu_state_t osd_menu_state_t;
  378.  
  379. /* VLM */
  380. typedef struct vlm_t         vlm_t;
  381. typedef struct vlm_message_t vlm_message_t;
  382.  
  383. /* misc */
  384. typedef struct vlc_meta_t    vlc_meta_t;
  385.  
  386. /* Stats */
  387. typedef struct counter_t     counter_t;
  388. typedef struct counter_sample_t counter_sample_t;
  389. typedef struct stats_handler_t stats_handler_t;
  390. typedef struct input_stats_t input_stats_t;
  391.  
  392. /* Update */
  393. typedef struct update_t update_t;
  394. typedef struct update_iterator_t update_iterator_t;
  395.  
  396. /* Meta engine */
  397. typedef struct meta_engine_t meta_engine_t;
  398.  
  399. /* stat/lstat/fstat */
  400. #ifdef WIN32
  401. # include <sys/stat.h>
  402.  
  403. # ifndef UNDER_CE
  404. struct _stati64;
  405. #  define stat _stati64
  406. #  define fstat _fstati64
  407. #endif
  408.  
  409. /* You should otherwise use vlc_stat and vlc_lstat. */
  410. #else
  411. struct stat;
  412. #endif
  413.  
  414. /**
  415.  * VLC value structure
  416.  */
  417. typedef union
  418. {
  419.     int64_t         i_int;
  420.     bool            b_bool;
  421.     float           f_float;
  422.     char *          psz_string;
  423.     void *          p_address;
  424.     vlc_object_t *  p_object;
  425.     vlc_list_t *    p_list;
  426.     mtime_t         i_time;
  427.     struct { int32_t x; int32_t y; } coords;
  428.  
  429. } vlc_value_t;
  430.  
  431. /**
  432.  * VLC list structure
  433.  */
  434. struct vlc_list_t
  435. {
  436.     int             i_count;
  437.     vlc_value_t *   p_values;
  438.     int *           pi_types;
  439.  
  440. };
  441.  
  442. /*****************************************************************************
  443.  * Error values (shouldn't be exposed)
  444.  *****************************************************************************/
  445. #define VLC_SUCCESS         -0                                   /* No error */
  446. #define VLC_ENOMEM          -1                          /* Not enough memory */
  447. #define VLC_ETIMEOUT        -3                                    /* Timeout */
  448.  
  449. #define VLC_ENOMOD         -10                           /* Module not found */
  450.  
  451. #define VLC_ENOOBJ         -20                           /* Object not found */
  452.  
  453. #define VLC_ENOVAR         -30                         /* Variable not found */
  454. #define VLC_EBADVAR        -31                         /* Bad variable value */
  455.  
  456. #define VLC_ENOITEM        -40                           /**< Item not found */
  457.  
  458. #define VLC_EEXIT         -255                             /* Program exited */
  459. #define VLC_EEXITSUCCESS  -999                /* Program exited successfully */
  460. #define VLC_EGENERIC      -666                              /* Generic error */
  461.  
  462. /*****************************************************************************
  463.  * Variable callbacks
  464.  *****************************************************************************/
  465. typedef int ( * vlc_callback_t ) ( vlc_object_t *,      /* variable's object */
  466.                                    char const *,            /* variable name */
  467.                                    vlc_value_t,                 /* old value */
  468.                                    vlc_value_t,                 /* new value */
  469.                                    void * );                /* callback data */
  470.  
  471. /*****************************************************************************
  472.  * OS-specific headers and thread types
  473.  *****************************************************************************/
  474. #if defined( WIN32 ) || defined( UNDER_CE )
  475. /* WIN32_LEAN_AND_MEAN is needed to be able to include winsock2.h because else,
  476.  * windows.h will also include winsock.h and declarations will conflict */
  477. # define WIN32_LEAN_AND_MEAN
  478. # include <windows.h>
  479. #endif
  480.  
  481. #ifdef __OS2__
  482. #   define OS2EMX_PLAIN_CHAR
  483. #   define INCL_BASE
  484. #   define INCL_PM
  485. #   include <os2.h>
  486. #endif
  487.  
  488. #include "vlc_mtime.h"
  489. #include "vlc_threads.h"
  490.  
  491. /**
  492.  * Memory storage space for an atom. Never access it directly.
  493.  */
  494. typedef union
  495. {
  496.     volatile uintptr_t u;
  497.     volatile intptr_t  s;
  498. } vlc_atomic_t;
  499.  
  500. /*****************************************************************************
  501.  * Common structure members
  502.  *****************************************************************************/
  503.  
  504. /* VLC_COMMON_MEMBERS : members common to all basic vlc objects */
  505. #define VLC_COMMON_MEMBERS                                                  \
  506. /** \name VLC_COMMON_MEMBERS                                                \
  507.  * these members are common for all vlc objects                             \
  508.  */                                                                         \
  509. /**@{*/                                                                     \
  510.     const char *psz_object_type;                                            \
  511.                                                                             \
  512.     /* Messages header */                                                   \
  513.     char *psz_header;                                                       \
  514.     int  i_flags;                                                           \
  515.                                                                             \
  516.     /* Object properties */                                                 \
  517.     volatile bool b_die;                   /**< set by the outside */ \
  518.     bool b_force;      /**< set by the outside (eg. module_need()) */ \
  519.                                                                             \
  520.     /* Stuff related to the libvlc structure */                             \
  521.     libvlc_int_t *p_libvlc;                  /**< (root of all evil) - 1 */ \
  522.                                                                             \
  523.     vlc_object_t *  p_parent;                            /**< our parent */ \
  524.                                                                             \
  525. /**@}*/                                                                     \
  526.  
  527. /* VLC_OBJECT: attempt at doing a clever cast */
  528. #if VLC_GCC_VERSION(4,0)
  529. # ifndef __cplusplus
  530. #  define VLC_OBJECT( x ) \
  531.     __builtin_choose_expr( \
  532.         __builtin_offsetof(__typeof__(*(x)), psz_object_type), \
  533.         (void)0 /* screw you */, \
  534.         (vlc_object_t *)(x))
  535. # else
  536. #  define VLC_OBJECT( x ) \
  537.     ((vlc_object_t *)(x) \
  538.       + 0 * __builtin_offsetof(__typeof__(*(x)), psz_object_type))
  539. # endif
  540. #else
  541. # define VLC_OBJECT( x ) ((vlc_object_t *)(x))
  542. #endif
  543.  
  544. typedef struct gc_object_t
  545. {
  546.     vlc_atomic_t    refs;
  547.     void          (*pf_destructor) (struct gc_object_t *);
  548. } gc_object_t;
  549.  
  550. /**
  551.  * These members are common to all objects that wish to be garbage-collected.
  552.  */
  553. #define VLC_GC_MEMBERS gc_object_t vlc_gc_data;
  554.  
  555. VLC_API void * vlc_gc_init(gc_object_t *, void (*)(gc_object_t *));
  556. VLC_API void * vlc_hold(gc_object_t *);
  557. VLC_API void vlc_release(gc_object_t *);
  558.  
  559. #define vlc_gc_init( a,b ) vlc_gc_init( &(a)->vlc_gc_data, (b) )
  560. #define vlc_gc_incref( a ) vlc_hold( &(a)->vlc_gc_data )
  561. #define vlc_gc_decref( a ) vlc_release( &(a)->vlc_gc_data )
  562. #define vlc_priv( gc, t ) ((t *)(((char *)(gc)) - offsetof(t, vlc_gc_data)))
  563.  
  564. /*****************************************************************************
  565.  * Macros and inline functions
  566.  *****************************************************************************/
  567.  
  568. /* CEIL: division with round to nearest greater integer */
  569. #define CEIL(n, d)  ( ((n) / (d)) + ( ((n) % (d)) ? 1 : 0) )
  570.  
  571. /* PAD: PAD(n, d) = CEIL(n ,d) * d */
  572. #define PAD(n, d)   ( ((n) % (d)) ? ((((n) / (d)) + 1) * (d)) : (n) )
  573.  
  574. /* __MAX and __MIN: self explanatory */
  575. #ifndef __MAX
  576. #   define __MAX(a, b)   ( ((a) > (b)) ? (a) : (b) )
  577. #endif
  578. #ifndef __MIN
  579. #   define __MIN(a, b)   ( ((a) < (b)) ? (a) : (b) )
  580. #endif
  581.  
  582. /* clip v in [min, max] */
  583. #define VLC_CLIP(v, min, max)    __MIN(__MAX((v), (min)), (max))
  584.  
  585. VLC_USED
  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. VLC_USED
  599. static inline uint8_t clip_uint8_vlc( int32_t a )
  600. {
  601.     if( a&(~255) ) return (-a)>>31;
  602.     else           return a;
  603. }
  604.  
  605. /** Count leading zeroes */
  606. VLC_USED
  607. static inline unsigned clz (unsigned x)
  608. {
  609. #if VLC_GCC_VERSION(3,4)
  610.     return __builtin_clz (x);
  611. #else
  612.     unsigned i = sizeof (x) * 8;
  613.  
  614.     while (x)
  615.     {
  616.         x = x >> 1;
  617.         i--;
  618.     }
  619.     return i;
  620. #endif
  621. }
  622.  
  623. #define clz8( x ) (clz(x) - ((sizeof(unsigned) - sizeof (uint8_t)) * 8))
  624. #define clz16( x ) (clz(x) - ((sizeof(unsigned) - sizeof (uint16_t)) * 8))
  625. /* XXX: this assumes that int is 32-bits or more */
  626. #define clz32( x ) (clz(x) - ((sizeof(unsigned) - sizeof (uint32_t)) * 8))
  627.  
  628. /** Bit weight */
  629. VLC_USED
  630. static inline unsigned popcount (unsigned x)
  631. {
  632. #if VLC_GCC_VERSION(3,4)
  633.     return __builtin_popcount (x);
  634. #else
  635.     unsigned count = 0;
  636.     while (x)
  637.     {
  638.         count += x & 1;
  639.         x = x >> 1;
  640.     }
  641.     return count;
  642. #endif
  643. }
  644.  
  645. #ifdef __OS2__
  646. #   undef bswap16
  647. #   undef bswap32
  648. #   undef bswap64
  649. #endif
  650.  
  651. /** Byte swap (16 bits) */
  652. VLC_USED
  653. static inline uint16_t bswap16 (uint16_t x)
  654. {
  655.     return (x << 8) | (x >> 8);
  656. }
  657.  
  658. /** Byte swap (32 bits) */
  659. VLC_USED
  660. static inline uint32_t bswap32 (uint32_t x)
  661. {
  662. #if VLC_GCC_VERSION(4,3)
  663.     return __builtin_bswap32 (x);
  664. #else
  665.     return ((x & 0x000000FF) << 24)
  666.          | ((x & 0x0000FF00) <<  8)
  667.          | ((x & 0x00FF0000) >>  8)
  668.          | ((x & 0xFF000000) >> 24);
  669. #endif
  670. }
  671.  
  672. /** Byte swap (64 bits) */
  673. VLC_USED
  674. static inline uint64_t bswap64 (uint64_t x)
  675. {
  676. #if VLC_GCC_VERSION(4,3)
  677.     return __builtin_bswap64 (x);
  678. #elif !defined (__cplusplus)
  679.     return ((x & 0x00000000000000FF) << 56)
  680.          | ((x & 0x000000000000FF00) << 40)
  681.          | ((x & 0x0000000000FF0000) << 24)
  682.          | ((x & 0x00000000FF000000) <<  8)
  683.          | ((x & 0x000000FF00000000) >>  8)
  684.          | ((x & 0x0000FF0000000000) >> 24)
  685.          | ((x & 0x00FF000000000000) >> 40)
  686.          | ((x & 0xFF00000000000000) >> 56);
  687. #else
  688.     return ((x & 0x00000000000000FFLLU) << 56)
  689.          | ((x & 0x000000000000FF00LLU) << 40)
  690.          | ((x & 0x0000000000FF0000LLU) << 24)
  691.          | ((x & 0x00000000FF000000LLU) <<  8)
  692.          | ((x & 0x000000FF00000000LLU) >>  8)
  693.          | ((x & 0x0000FF0000000000LLU) >> 24)
  694.          | ((x & 0x00FF000000000000LLU) >> 40)
  695.          | ((x & 0xFF00000000000000LLU) >> 56);
  696. #endif
  697. }
  698.  
  699.  
  700. /* Free and set set the variable to NULL */
  701. #define FREENULL(a) do { free( a ); a = NULL; } while(0)
  702.  
  703. #define EMPTY_STR(str) (!str || !*str)
  704.  
  705. VLC_API char const * vlc_error( int ) VLC_USED;
  706.  
  707. #include <vlc_arrays.h>
  708.  
  709. /* MSB (big endian)/LSB (little endian) conversions - network order is always
  710.  * MSB, and should be used for both network communications and files. */
  711.  
  712. #ifdef WORDS_BIGENDIAN
  713. # define hton16(i) ((uint16_t)(i))
  714. # define hton32(i) ((uint32_t)(i))
  715. # define hton64(i) ((uint64_t)(i))
  716. #else
  717. # define hton16(i) bswap16(i)
  718. # define hton32(i) bswap32(i)
  719. # define hton64(i) bswap64(i)
  720. #endif
  721. #define ntoh16(i) hton16(i)
  722. #define ntoh32(i) hton32(i)
  723. #define ntoh64(i) hton64(i)
  724.  
  725. /** Reads 16 bits in network byte order */
  726. VLC_USED
  727. static inline uint16_t U16_AT (const void *p)
  728. {
  729.     uint16_t x;
  730.  
  731.     memcpy (&x, p, sizeof (x));
  732.     return ntoh16 (x);
  733. }
  734.  
  735. /** Reads 32 bits in network byte order */
  736. VLC_USED
  737. static inline uint32_t U32_AT (const void *p)
  738. {
  739.     uint32_t x;
  740.  
  741.     memcpy (&x, p, sizeof (x));
  742.     return ntoh32 (x);
  743. }
  744.  
  745. /** Reads 64 bits in network byte order */
  746. VLC_USED
  747. static inline uint64_t U64_AT (const void *p)
  748. {
  749.     uint64_t x;
  750.  
  751.     memcpy (&x, p, sizeof (x));
  752.     return ntoh64 (x);
  753. }
  754.  
  755. #define GetWBE(p)  U16_AT(p)
  756. #define GetDWBE(p) U32_AT(p)
  757. #define GetQWBE(p) U64_AT(p)
  758.  
  759. /** Reads 16 bits in little-endian order */
  760. VLC_USED
  761. static inline uint16_t GetWLE (const void *p)
  762. {
  763.     uint16_t x;
  764.  
  765.     memcpy (&x, p, sizeof (x));
  766. #ifdef WORDS_BIGENDIAN
  767.     x = bswap16 (x);
  768. #endif
  769.     return x;
  770. }
  771.  
  772. /** Reads 32 bits in little-endian order */
  773. VLC_USED
  774. static inline uint32_t GetDWLE (const void *p)
  775. {
  776.     uint32_t x;
  777.  
  778.     memcpy (&x, p, sizeof (x));
  779. #ifdef WORDS_BIGENDIAN
  780.     x = bswap32 (x);
  781. #endif
  782.     return x;
  783. }
  784.  
  785. /** Reads 64 bits in little-endian order */
  786. VLC_USED
  787. static inline uint64_t GetQWLE (const void *p)
  788. {
  789.     uint64_t x;
  790.  
  791.     memcpy (&x, p, sizeof (x));
  792. #ifdef WORDS_BIGENDIAN
  793.     x = bswap64 (x);
  794. #endif
  795.     return x;
  796. }
  797.  
  798. /** Writes 16 bits in network byte order */
  799. static inline void SetWBE (void *p, uint16_t w)
  800. {
  801.     w = hton16 (w);
  802.     memcpy (p, &w, sizeof (w));
  803. }
  804.  
  805. /** Writes 32 bits in network byte order */
  806. static inline void SetDWBE (void *p, uint32_t dw)
  807. {
  808.     dw = hton32 (dw);
  809.     memcpy (p, &dw, sizeof (dw));
  810. }
  811.  
  812. /** Writes 64 bits in network byte order */
  813. static inline void SetQWBE (void *p, uint64_t qw)
  814. {
  815.     qw = hton64 (qw);
  816.     memcpy (p, &qw, sizeof (qw));
  817. }
  818.  
  819. /** Writes 16 bits in little endian order */
  820. static inline void SetWLE (void *p, uint16_t w)
  821. {
  822. #ifdef WORDS_BIGENDIAN
  823.     w = bswap16 (w);
  824. #endif
  825.     memcpy (p, &w, sizeof (w));
  826. }
  827.  
  828. /** Writes 32 bits in little endian order */
  829. static inline void SetDWLE (void *p, uint32_t dw)
  830. {
  831. #ifdef WORDS_BIGENDIAN
  832.     dw = bswap32 (dw);
  833. #endif
  834.     memcpy (p, &dw, sizeof (dw));
  835. }
  836.  
  837. /** Writes 64 bits in little endian order */
  838. static inline void SetQWLE (void *p, uint64_t qw)
  839. {
  840. #ifdef WORDS_BIGENDIAN
  841.     qw = bswap64 (qw);
  842. #endif
  843.     memcpy (p, &qw, sizeof (qw));
  844. }
  845.  
  846. /* */
  847. #define VLC_UNUSED(x) (void)(x)
  848.  
  849. /* Stuff defined in src/extras/libc.c */
  850.  
  851. #if defined(WIN32) || defined(UNDER_CE)
  852. /* win32, cl and icl support */
  853. #   if defined( _MSC_VER ) || !defined( __MINGW32__ )
  854. #       define __attribute__(x)
  855. #       define S_IFBLK         0x3000  /* Block */
  856. #       define S_ISBLK(m)      (0)
  857. #       define S_ISCHR(m)      (0)
  858. #       define S_ISFIFO(m)     (((m)&_S_IFMT) == _S_IFIFO)
  859. #       define S_ISREG(m)      (((m)&_S_IFMT) == _S_IFREG)
  860. #   endif
  861.  
  862. /* several type definitions */
  863. #   if defined( __MINGW32__ )
  864. #       if !defined( _OFF_T_ )
  865.             typedef long long _off_t;
  866.             typedef _off_t off_t;
  867. #           define _OFF_T_
  868. #       else
  869. #           ifdef off_t
  870. #               undef off_t
  871. #           endif
  872. #           define off_t long long
  873. #       endif
  874. #   endif
  875.  
  876. #   if defined( _MSC_VER )
  877. #       if !defined( _OFF_T_DEFINED )
  878.             typedef __int64 off_t;
  879. #           define _OFF_T_DEFINED
  880. #       else
  881.             /* for wx compatibility typedef long off_t; */
  882. #           define off_t __int64
  883. #       endif
  884. #   endif
  885.  
  886. #   if defined( __BORLANDC__ )
  887. #       undef off_t
  888. #       define off_t unsigned __int64
  889. #   endif
  890.  
  891. #   ifndef O_NONBLOCK
  892. #       define O_NONBLOCK 0
  893. #   endif
  894.  
  895. #   ifndef alloca
  896. #       define alloca _alloca
  897. #   endif
  898.  
  899. #   include <tchar.h>
  900. #endif
  901.  
  902. VLC_API bool vlc_ureduce( unsigned *, unsigned *, uint64_t, uint64_t, uint64_t );
  903.  
  904. /* Aligned memory allocator */
  905. #ifdef __APPLE__
  906. #include <AvailabilityMacros.h>
  907. #endif
  908.  
  909. #ifdef WIN32
  910. # include <malloc.h>
  911. # define vlc_memalign(align, size) (__mingw_aligned_malloc(size, align))
  912. # define vlc_free(base)            (__mingw_aligned_free(base))
  913. #elif defined(__APPLE__) && !defined(MAC_OS_X_VERSION_10_6)
  914. static inline void *vlc_memalign(size_t align, size_t size)
  915. {
  916.     long diff;
  917.     void *ptr;
  918.  
  919.     ptr = malloc(size+align);
  920.     if(!ptr)
  921.         return ptr;
  922.     diff = ((-(long)ptr - 1)&(align-1)) + 1;
  923.     ptr  = (char*)ptr + diff;
  924.     ((char*)ptr)[-1]= diff;
  925.     return ptr;
  926. }
  927.  
  928. static void vlc_free(void *ptr)
  929. {
  930.     if (ptr)
  931.         free((char*)ptr - ((char*)ptr)[-1]);
  932. }
  933. #elif defined(__ANDROID__)
  934. # define vlc_memalign(align, size) memalign(align, size)
  935. # define vlc_free(base) free(base)
  936. #else
  937. static inline void *vlc_memalign(size_t align, size_t size)
  938. {
  939.     void *base;
  940.     if (unlikely(posix_memalign(&base, align, size)))
  941.         base = NULL;
  942.     return base;
  943. }
  944. # define vlc_free(base) free(base)
  945. #endif
  946.  
  947. VLC_API void vlc_tdestroy( void *, void (*)(void *) );
  948.  
  949. /* Fast large memory copy and memory set */
  950. VLC_API void * vlc_memcpy( void *, const void *, size_t );
  951. #define vlc_memset memset
  952.  
  953. /*****************************************************************************
  954.  * I18n stuff
  955.  *****************************************************************************/
  956. VLC_API char * vlc_gettext( const char *msgid ) VLC_FORMAT_ARG(1);
  957.  
  958. #define vlc_pgettext( ctx, id ) \
  959.         vlc_pgettext_aux( ctx "\004" id, id )
  960.  
  961. VLC_FORMAT_ARG(2)
  962. static inline const char *vlc_pgettext_aux( const char *ctx, const char *id )
  963. {
  964.     const char *tr = vlc_gettext( ctx );
  965.     return (tr == ctx) ? id : tr;
  966. }
  967.  
  968. /*****************************************************************************
  969.  * Loosy memory allocation functions. Do not use in new code.
  970.  *****************************************************************************/
  971. static inline void *xmalloc (size_t len)
  972. {
  973.     void *ptr = malloc (len);
  974.     if (unlikely (ptr == NULL))
  975.         abort ();
  976.     return ptr;
  977. }
  978.  
  979. static inline void *xrealloc (void *ptr, size_t len)
  980. {
  981.     void *nptr = realloc (ptr, len);
  982.     if (unlikely (nptr == NULL))
  983.         abort ();
  984.     return nptr;
  985. }
  986.  
  987. static inline void *xcalloc (size_t n, size_t size)
  988. {
  989.     void *ptr = calloc (n, size);
  990.     if (unlikely (ptr == NULL))
  991.         abort ();
  992.     return ptr;
  993. }
  994.  
  995. /*****************************************************************************
  996.  * libvlc features
  997.  *****************************************************************************/
  998. VLC_API const char * VLC_CompileBy( void ) VLC_USED;
  999. VLC_API const char * VLC_CompileHost( void ) VLC_USED;
  1000. VLC_API const char * VLC_Compiler( void ) VLC_USED;
  1001.  
  1002. /*****************************************************************************
  1003.  * Additional vlc stuff
  1004.  *****************************************************************************/
  1005. #include "vlc_messages.h"
  1006. #include "vlc_objects.h"
  1007. #include "vlc_variables.h"
  1008. #include "vlc_main.h"
  1009. #include "vlc_configuration.h"
  1010.  
  1011. #if defined( WIN32 ) || defined( UNDER_CE ) || defined( __SYMBIAN32__ ) || defined( __OS2__ )
  1012. #   define DIR_SEP_CHAR '\\'
  1013. #   define DIR_SEP "\\"
  1014. #   define PATH_SEP_CHAR ';'
  1015. #   define PATH_SEP ";"
  1016. #else
  1017. #   define DIR_SEP_CHAR '/'
  1018. #   define DIR_SEP "/"
  1019. #   define PATH_SEP_CHAR ':'
  1020. #   define PATH_SEP ":"
  1021. #endif
  1022.  
  1023. #define LICENSE_MSG \
  1024.   _("This program comes with NO WARRANTY, to the extent permitted by " \
  1025.     "law.\nYou may redistribute it under the terms of the GNU General " \
  1026.     "Public License;\nsee the file named COPYING for details.\n" \
  1027.     "Written by the VideoLAN team; see the AUTHORS file.\n")
  1028.  
  1029. #endif /* !VLC_COMMON_H */
  1030.