X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=include%2Fvlc_common.h;h=3432149a5ebcc3677242ea0133428a2f48c08ae8;hb=0b88e7753a08b42a15d6e01cae20bfeed192d56a;hp=065b99f4261d056bb037b0556cec18b37e80ba06;hpb=a5e3711fb88b0d73c998dab67f0b70eb8f2123d7;p=vlc diff --git a/include/vlc_common.h b/include/vlc_common.h index 065b99f426..3432149a5e 100644 --- a/include/vlc_common.h +++ b/include/vlc_common.h @@ -3,7 +3,7 @@ * Collection of useful common types and macros definitions ***************************************************************************** * Copyright (C) 1998, 1999, 2000 VideoLAN - * $Id: vlc_common.h,v 1.7 2002/06/07 23:53:44 sam Exp $ + * $Id: vlc_common.h,v 1.26 2002/08/30 22:22:24 massiot Exp $ * * Authors: Samuel Hocevar * Vincent Seguin @@ -25,13 +25,22 @@ *****************************************************************************/ /***************************************************************************** - * Compiler-specific workarounds + * Required vlc headers *****************************************************************************/ +#if defined( __BORLANDC__ ) +# undef PACKAGE +#endif + +#include "config.h" + #if defined( __BORLANDC__ ) # undef HAVE_VARIADIC_MACROS # undef HAVE_STDINT_H #endif +#include "vlc_config.h" +#include "modules_inner.h" + /***************************************************************************** * Required system headers *****************************************************************************/ @@ -117,84 +126,113 @@ typedef u8 yuv_data_t; *****************************************************************************/ typedef s64 mtime_t; +/***************************************************************************** + * The vlc_fourcc_t type. + ***************************************************************************** + * See http://www.webartz.com/fourcc/ for a very detailed list. + *****************************************************************************/ +typedef u32 vlc_fourcc_t; + +#ifdef WORDS_BIGENDIAN +# define VLC_FOURCC( a, b, c, d ) \ + ( ((u32)d) | ( ((u32)c) << 8 ) | ( ((u32)b) << 16 ) | ( ((u32)a) << 24 ) ) +# define VLC_TWOCC( a, b ) \ + ( (u16)(b) | ( (u16)(a) << 8 ) ) + +#else +# define VLC_FOURCC( a, b, c, d ) \ + ( ((u32)a) | ( ((u32)b) << 8 ) | ( ((u32)c) << 16 ) | ( ((u32)d) << 24 ) ) +# define VLC_TWOCC( a, b ) \ + ( (u16)(a) | ( (u16)(b) << 8 ) ) + +#endif + /***************************************************************************** * Classes declaration *****************************************************************************/ /* Messages */ -VLC_DECLARE_STRUCT(msg_bank) -VLC_DECLARE_STRUCT(msg_subscription) +typedef struct msg_bank_t msg_bank_t; +typedef struct msg_subscription_t msg_subscription_t; /* Playlist */ -VLC_DECLARE_STRUCT(playlist) -VLC_DECLARE_STRUCT(playlist_item) +typedef struct playlist_t playlist_t; +typedef struct playlist_item_t playlist_item_t; /* Modules */ -VLC_DECLARE_STRUCT(module_bank) -VLC_DECLARE_STRUCT(module) -VLC_DECLARE_STRUCT(module_config) -VLC_DECLARE_STRUCT(module_symbols) -VLC_DECLARE_STRUCT(module_functions) +typedef struct module_bank_t module_bank_t; +typedef struct module_t module_t; +typedef struct module_config_t module_config_t; +typedef struct module_symbols_t module_symbols_t; /* Interface */ -VLC_DECLARE_STRUCT(intf_thread) -VLC_DECLARE_STRUCT(intf_sys) -VLC_DECLARE_STRUCT(intf_console) -VLC_DECLARE_STRUCT(intf_msg) -VLC_DECLARE_STRUCT(intf_channel) +typedef struct intf_thread_t intf_thread_t; +typedef struct intf_sys_t intf_sys_t; +typedef struct intf_console_t intf_console_t; +typedef struct intf_msg_t intf_msg_t; +typedef struct intf_channel_t intf_channel_t; /* Input */ -VLC_DECLARE_STRUCT(input_thread) -VLC_DECLARE_STRUCT(input_channel) -VLC_DECLARE_STRUCT(input_cfg) -VLC_DECLARE_STRUCT(input_area) -VLC_DECLARE_STRUCT(input_buffers) -VLC_DECLARE_STRUCT(input_socket) +typedef struct input_thread_t input_thread_t; +typedef struct input_channel_t input_channel_t; +typedef struct input_area_t input_area_t; +typedef struct input_buffers_t input_buffers_t; +typedef struct input_socket_t input_socket_t; +typedef struct input_info_t input_info_t; +typedef struct input_info_category_t input_info_category_t; +typedef struct access_sys_t access_sys_t; +typedef struct demux_sys_t demux_sys_t; +typedef struct es_descriptor_t es_descriptor_t; +typedef struct es_sys_t es_sys_t; +typedef struct pgrm_descriptor_t pgrm_descriptor_t; +typedef struct pgrm_sys_t pgrm_sys_t; +typedef struct stream_descriptor_t stream_descriptor_t; +typedef struct stream_sys_t stream_sys_t; /* Audio */ -VLC_DECLARE_STRUCT(aout_thread) -VLC_DECLARE_STRUCT(aout_sys) -VLC_DECLARE_STRUCT(aout_fifo) +typedef struct aout_instance_t aout_instance_t; +typedef struct aout_sys_t aout_sys_t; +typedef struct aout_fifo_t aout_fifo_t; +typedef struct aout_input_t aout_input_t; +typedef struct aout_buffer_t aout_buffer_t; +typedef struct audio_sample_format_t audio_sample_format_t; +typedef struct audio_date_t audio_date_t; /* Video */ -VLC_DECLARE_STRUCT(vout_thread) -VLC_DECLARE_STRUCT(vout_font) -VLC_DECLARE_STRUCT(vout_sys) -VLC_DECLARE_STRUCT(chroma_sys) -VLC_DECLARE_STRUCT(picture) -VLC_DECLARE_STRUCT(picture_sys) -VLC_DECLARE_STRUCT(picture_heap) -VLC_DECLARE_STRUCT(subpicture) -VLC_DECLARE_STRUCT(subpicture_sys) +typedef struct vout_thread_t vout_thread_t; +typedef struct vout_font_t vout_font_t; +typedef struct vout_sys_t vout_sys_t; +typedef struct chroma_sys_t chroma_sys_t; +typedef struct picture_t picture_t; +typedef struct picture_sys_t picture_sys_t; +typedef struct picture_heap_t picture_heap_t; +typedef struct subpicture_t subpicture_t; +typedef struct subpicture_sys_t subpicture_sys_t; + +/* Stream output */ +typedef struct sout_instance_t sout_instance_t; +typedef struct sout_fifo_t sout_fifo_t; /* Decoders */ -VLC_DECLARE_STRUCT(decoder_fifo) +typedef struct decoder_fifo_t decoder_fifo_t; /* Misc */ -VLC_DECLARE_STRUCT(macroblock) -VLC_DECLARE_STRUCT(data_packet) -VLC_DECLARE_STRUCT(data_buffer) -VLC_DECLARE_STRUCT(downmix) -VLC_DECLARE_STRUCT(imdct) -VLC_DECLARE_STRUCT(complex) -VLC_DECLARE_STRUCT(dm_par) -VLC_DECLARE_STRUCT(es_descriptor) -VLC_DECLARE_STRUCT(pgrm_descriptor) -VLC_DECLARE_STRUCT(stream_descriptor) -VLC_DECLARE_STRUCT(stream_position) -VLC_DECLARE_STRUCT(stream_ctrl) -VLC_DECLARE_STRUCT(pes_packet) -VLC_DECLARE_STRUCT(bit_stream) -VLC_DECLARE_STRUCT(network_socket) -VLC_DECLARE_STRUCT(iso639_lang) +typedef struct data_packet_t data_packet_t; +typedef struct data_buffer_t data_buffer_t; +typedef struct stream_position_t stream_position_t; +typedef struct stream_ctrl_t stream_ctrl_t; +typedef struct pes_packet_t pes_packet_t; +typedef struct bit_stream_t bit_stream_t; +typedef struct network_socket_t network_socket_t; +typedef struct iso639_lang_t iso639_lang_t; /***************************************************************************** * Plug-in stuff *****************************************************************************/ #ifndef __PLUGIN__ -# define VLC_EXPORT( type, name, args ) type name args; +# define VLC_EXPORT( type, name, args ) type name args #else -# define VLC_EXPORT( type, name, args ) ; +# define VLC_EXPORT( type, name, args ) struct _u_n_u_s_e_d_ extern module_symbols_t* p_symbols; #endif @@ -230,26 +268,40 @@ VLC_DECLARE_STRUCT(iso639_lang) volatile vlc_bool_t b_error; /* set by the object */ \ volatile vlc_bool_t b_die; /* set by the outside */ \ volatile vlc_bool_t b_dead; /* set by the object */ \ + volatile vlc_bool_t b_attached; /* set by the object */ \ \ vlc_t * p_vlc; /* root of all evil */ \ \ - volatile int i_refcount; \ - vlc_object_t ** pp_parents; /* our parents */ \ - volatile int i_parents; \ + volatile int i_refcount; /* usage count */ \ + vlc_object_t * p_parent; /* our parent */ \ vlc_object_t ** pp_children; /* our children */ \ volatile int i_children; \ \ + /* Private data */ \ + void * p_private; \ + \ /* Just a reminder so that people don't cast garbage */ \ int be_sure_to_add_VLC_COMMON_MEMBERS_to_struct; \ /* The real vlc_object_t type. Yes, it's that simple :-) */ -struct vlc_object_s +struct vlc_object_t { VLC_COMMON_MEMBERS }; -/* CAST_TO_VLC_OBJECT: attempt at doing a clever cast */ -#define CAST_TO_VLC_OBJECT( x ) \ +/* The object list */ +struct vlc_list_t +{ + int i_count; + vlc_object_t ** pp_objects; + + /* Private */ + int _i_extra; + vlc_object_t * _p_first; +}; + +/* VLC_OBJECT: attempt at doing a clever cast */ +#define VLC_OBJECT( x ) \ ((vlc_object_t *)(x))+0*(x)->be_sure_to_add_VLC_COMMON_MEMBERS_to_struct /***************************************************************************** @@ -258,98 +310,7 @@ struct vlc_object_s #ifdef NTOHL_IN_SYS_PARAM_H # include -#elif defined(WIN32) -/* Swap bytes in 16 bit value. */ -# define __bswap_constant_16(x) \ - ((((x) >> 8) & 0xff) | (((x) & 0xff) << 8)) - -# if defined __GNUC__ && __GNUC__ >= 2 -# define __bswap_16(x) \ - (__extension__ \ - ({ register unsigned short int __v; \ - if (__builtin_constant_p (x)) \ - __v = __bswap_constant_16 (x); \ - else \ - __asm__ __volatile__ ("rorw $8, %w0" \ - : "=r" (__v) \ - : "0" ((unsigned short int) (x)) \ - : "cc"); \ - __v; })) -# else -/* This is better than nothing. */ -# define __bswap_16(x) __bswap_constant_16 (x) -# endif - -/* Swap bytes in 32 bit value. */ -# define __bswap_constant_32(x) \ - ((((x) & 0xff000000) >> 24) | (((x) & 0x00ff0000) >> 8) | \ - (((x) & 0x0000ff00) << 8) | (((x) & 0x000000ff) << 24)) - -# if defined __GNUC__ && __GNUC__ >= 2 -/* To swap the bytes in a word the i486 processors and up provide the - `bswap' opcode. On i386 we have to use three instructions. */ -# if !defined __i486__ && !defined __pentium__ && !defined __pentiumpro__ -# define __bswap_32(x) \ - (__extension__ \ - ({ register unsigned int __v; \ - if (__builtin_constant_p (x)) \ - __v = __bswap_constant_32 (x); \ - else \ - __asm__ __volatile__ ("rorw $8, %w0;" \ - "rorl $16, %0;" \ - "rorw $8, %w0" \ - : "=r" (__v) \ - : "0" ((unsigned int) (x)) \ - : "cc"); \ - __v; })) -# else -# define __bswap_32(x) \ - (__extension__ \ - ({ register unsigned int __v; \ - if (__builtin_constant_p (x)) \ - __v = __bswap_constant_32 (x); \ - else \ - __asm__ __volatile__ ("bswap %0" \ - : "=r" (__v) \ - : "0" ((unsigned int) (x))); \ - __v; })) -# endif -# else -# define __bswap_32(x) __bswap_constant_32 (x) -# endif - -# if defined __GNUC__ && __GNUC__ >= 2 -/* Swap bytes in 64 bit value. */ -# define __bswap_constant_64(x) \ - ((((x) & 0xff00000000000000ull) >> 56) \ - | (((x) & 0x00ff000000000000ull) >> 40) \ - | (((x) & 0x0000ff0000000000ull) >> 24) \ - | (((x) & 0x000000ff00000000ull) >> 8) \ - | (((x) & 0x00000000ff000000ull) << 8) \ - | (((x) & 0x0000000000ff0000ull) << 24) \ - | (((x) & 0x000000000000ff00ull) << 40) \ - | (((x) & 0x00000000000000ffull) << 56)) - -# define __bswap_64(x) \ - (__extension__ \ - ({ union { __extension__ unsigned long long int __ll; \ - unsigned long int __l[2]; } __w, __r; \ - if (__builtin_constant_p (x)) \ - __r.__ll = __bswap_constant_64 (x); \ - else \ - { \ - __w.__ll = (x); \ - __r.__l[0] = __bswap_32 (__w.__l[1]); \ - __r.__l[1] = __bswap_32 (__w.__l[0]); \ - } \ - __r.__ll; })) -# else -# define __bswap_64(i) \ - (u64)((__bswap_32((i) & 0xffffffff) << 32) | \ - __bswap_32(((i) >> 32) & 0xffffffff )) -# endif - -#else /* NTOHL_IN_SYS_PARAM_H || WIN32 */ +#elif !defined(WIN32) /* NTOHL_IN_SYS_PARAM_H || WIN32 */ # include #endif /* NTOHL_IN_SYS_PARAM_H || WIN32 */ @@ -371,35 +332,39 @@ struct vlc_object_s /* MSB (big endian)/LSB (little endian) conversions - network order is always * MSB, and should be used for both network communications and files. Note that * byte orders other than little and big endians are not supported, but only - * the VAX seems to have such exotic properties - note that these 'functions' - * needs or the local equivalent. */ -#if !defined( WIN32 ) + * the VAX seems to have such exotic properties. */ +static inline u16 U16_AT( void * _p ) +{ + u8 * p = (u8 *)_p; + return ( ((u16)p[0] << 8) | p[1] ); +} +static inline u32 U32_AT( void * _p ) +{ + u8 * p = (u8 *)_p; + return ( ((u32)p[0] << 24) | ((u32)p[1] << 16) | ((u32)p[2] << 8) | p[3] ); +} +static inline u64 U64_AT( void * _p ) +{ + u8 * p = (u8 *)_p; + return ( ((u64)p[0] << 56) | ((u64)p[1] << 48) | ((u64)p[2] << 40) + | ((u64)p[3] << 32) | ((u64)p[4] << 24) | ((u64)p[5] << 16) + | ((u64)p[6] << 8) | p[7] ); +} #if WORDS_BIGENDIAN -# define hton16 htons -# define hton32 htonl +# define hton16(i) ( i ) +# define hton32(i) ( i ) # define hton64(i) ( i ) -# define ntoh16 ntohs -# define ntoh32 ntohl +# define ntoh16(i) ( i ) +# define ntoh32(i) ( i ) # define ntoh64(i) ( i ) #else -# define hton16 htons -# define hton32 htonl - static inline u64 __hton64( u64 i ) - { - return ((u64)(htonl((i) & 0xffffffff)) << 32) - | htonl(((i) >> 32) & 0xffffffff ); - } -# define hton64(i) __hton64( i ) -# define ntoh16 ntohs -# define ntoh32 ntohl -# define ntoh64 hton64 +# define hton16(i) U16_AT(&i) +# define hton32(i) U32_AT(&i) +# define hton64(i) U64_AT(&i) +# define ntoh16(i) U16_AT(&i) +# define ntoh32(i) U32_AT(&i) +# define ntoh64(i) U64_AT(&i) #endif -#endif /* !defined( WIN32 ) */ - -/* Macros with automatic casts */ -#define U64_AT(p) ( ntoh64 ( *( (u64 *)(p) ) ) ) -#define U32_AT(p) ( ntoh32 ( *( (u32 *)(p) ) ) ) -#define U16_AT(p) ( ntoh16 ( *( (u16 *)(p) ) ) ) /* Alignment of critical static data structures */ #ifdef ATTRIBUTE_ALIGNED_MAX @@ -436,32 +401,15 @@ struct vlc_object_s #endif - -#define I64C(x) x##LL +/* strndup (defined in src/misc/extras.c) */ +#ifndef HAVE_STRNDUP +char * strndup( const char *s, size_t n ); +#endif -#if defined( WIN32 ) -/* The ntoh* and hton* bytes swapping functions are provided by winsock - * but for conveniency and speed reasons it is better to implement them - * ourselves. ( several plugins use them and it is too much hassle to link - * winsock with each of them ;-) - */ -# ifdef WORDS_BIGENDIAN -# define ntoh32(x) (x) -# define ntoh16(x) (x) -# define ntoh64(x) (x) -# define hton32(x) (x) -# define hton16(x) (x) -# define hton64(x) (x) -# else -# define ntoh32(x) __bswap_32 (x) -# define ntoh16(x) __bswap_16 (x) -# define ntoh64(x) __bswap_32 (x) -# define hton32(x) __bswap_32 (x) -# define hton16(x) __bswap_16 (x) -# define hton64(x) __bswap_64 (x) -# endif +#define I64C(x) x##LL +#ifdef WIN32 /* win32, cl and icl support */ # if defined( _MSC_VER ) || !defined( __MINGW32__ ) # define __attribute__(x) @@ -506,8 +454,12 @@ typedef __int64 off_t; # define O_NONBLOCK 0 # endif + /* These two are not defined in mingw32 (bug?) */ # ifndef snprintf -# define snprintf _snprintf /* snprintf not defined in mingw32 (bug?) */ +# define snprintf _snprintf +# endif +# ifndef vsnprintf +# define vsnprintf _vsnprintf # endif #endif @@ -529,12 +481,7 @@ typedef __int64 off_t; /***************************************************************************** * I18n stuff *****************************************************************************/ -#ifndef PACKAGE /* Borland C++ uses this ! */ -#define PACKAGE VLC_PACKAGE -#endif -#define VERSION VLC_VERSION - -#if defined( ENABLE_NLS ) && defined ( HAVE_GETTEXT ) && !defined( __BORLANDC__ ) && !defined( MODULE_NAME_IS_gnome ) +#if defined( ENABLE_NLS ) && defined ( HAVE_GETTEXT ) && !defined( __BORLANDC__ ) && !defined( NEED_GNOMESUPPORT_H ) # include # undef _ # define _(String) dgettext (PACKAGE, String) @@ -543,12 +490,26 @@ typedef __int64 off_t; # else # define N_(String) (String) # endif -#elif !defined( MODULE_NAME_IS_gnome ) +#elif !defined( NEED_GNOMESUPPORT_H ) # define _(String) (String) # define N_(String) (String) #endif /***************************************************************************** - * Plug-in stuff + * Additional vlc stuff *****************************************************************************/ #include "vlc_symbols.h" +#include "os_specific.h" +#include "vlc_messages.h" +#include "vlc_threads_funcs.h" +#include "mtime.h" +#include "modules.h" +#include "main.h" +#include "configuration.h" +#include "vlc_objects.h" + +#if defined( __BORLANDC__ ) +# undef PACKAGE +# define PACKAGE +#endif +