common.h 6.2 KB
Newer Older
1
/*****************************************************************************
Michel Kaempf's avatar
Michel Kaempf committed
2
 * common.h: common definitions
3
 * Collection of useful common types and macros definitions
4
 *****************************************************************************
5
 * Copyright (C) 1998, 1999, 2000 VideoLAN
Sam Hocevar's avatar
 
Sam Hocevar committed
6
 * $Id: common.h,v 1.23 2001/01/11 15:35:35 sam Exp $
7
 *
8 9
 * Authors: Samuel Hocevar <sam@via.ecp.fr>
 *          Vincent Seguin <seguin@via.ecp.fr>
10 11 12 13 14
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
15
 * 
16 17
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 19
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
20
 *
21 22 23
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
24 25 26
 *****************************************************************************/

/*****************************************************************************
Michel Kaempf's avatar
Michel Kaempf committed
27 28
 * required headers:
 *  config.h
29
 *****************************************************************************/
Michel Kaempf's avatar
Michel Kaempf committed
30

31
/*****************************************************************************
Vincent Seguin's avatar
Vincent Seguin committed
32
 * Basic types definitions
33
 *****************************************************************************/
Michel Kaempf's avatar
Michel Kaempf committed
34

Michel Lespinasse's avatar
 
Michel Lespinasse committed
35
#include "int_types.h"
Michel Kaempf's avatar
Michel Kaempf committed
36 37

typedef u8                  byte_t;
38

Michel Kaempf's avatar
Michel Kaempf committed
39
/* Boolean type */
Sam Hocevar's avatar
 
Sam Hocevar committed
40
#ifdef BOOLEAN_T_IN_SYS_TYPES_H
41
#   include <sys/types.h>
Sam Hocevar's avatar
 
Sam Hocevar committed
42 43
#else
typedef int                 boolean_t;
Benoit Steiner's avatar
Benoit Steiner committed
44
#endif
45
#ifdef SYS_GNU
46 47 48 49
#   define _MACH_I386_BOOLEAN_H_
#endif

/* ptrdiff_t definition */
Christophe Massiot's avatar
Christophe Massiot committed
50
#ifdef HAVE_STDDEF_H
51 52 53
#   include <stddef.h>
#else
#   include <malloc.h>
Christophe Massiot's avatar
Christophe Massiot committed
54 55
#   ifndef _PTRDIFF_T
#       define _PTRDIFF_T
56 57
/* Not portable in a 64-bit environment. */
typedef int                 ptrdiff_t;
Christophe Massiot's avatar
Christophe Massiot committed
58
#   endif
59
#endif
Michel Kaempf's avatar
Michel Kaempf committed
60 61 62 63

/* Counter for statistics and profiling */
typedef unsigned long       count_t;

64
/*****************************************************************************
Vincent Seguin's avatar
Vincent Seguin committed
65
 * Classes declaration
66
 *****************************************************************************/
Vincent Seguin's avatar
Vincent Seguin committed
67

68 69 70 71 72 73 74 75 76 77 78 79
/* Plugins */
struct plugin_bank_s;
struct plugin_info_s;

typedef struct plugin_bank_s *          p_plugin_bank_t;
typedef struct plugin_info_s *          p_plugin_info_t;

/* Playlist */
struct playlist_s;

typedef struct playlist_s *             p_playlist_t;

Vincent Seguin's avatar
Vincent Seguin committed
80 81 82 83 84
/* Interface */
struct intf_thread_s;
struct intf_sys_s;
struct intf_console_s;
struct intf_msg_s;
85
struct intf_channel_s;
Vincent Seguin's avatar
Vincent Seguin committed
86 87 88 89 90

typedef struct intf_thread_s *          p_intf_thread_t;
typedef struct intf_sys_s *             p_intf_sys_t;
typedef struct intf_console_s *         p_intf_console_t;
typedef struct intf_msg_s *             p_intf_msg_t;
91
typedef struct intf_channel_s *         p_intf_channel_t;
Vincent Seguin's avatar
Vincent Seguin committed
92 93 94

/* Input */
struct input_thread_s;
95
struct input_vlan_s;
Vincent Seguin's avatar
Vincent Seguin committed
96 97 98
struct input_cfg_s;

typedef struct input_thread_s *         p_input_thread_t;
99
typedef struct input_vlan_s *           p_input_vlan_t;
Vincent Seguin's avatar
Vincent Seguin committed
100 101 102 103
typedef struct input_cfg_s *            p_input_cfg_t;

/* Audio */
struct aout_thread_s;
104
struct aout_sys_s;
Vincent Seguin's avatar
Vincent Seguin committed
105 106

typedef struct aout_thread_s *          p_aout_thread_t;
107
typedef struct aout_sys_s *             p_aout_sys_t;
Vincent Seguin's avatar
Vincent Seguin committed
108 109 110

/* Video */
struct vout_thread_s;
Vincent Seguin's avatar
Vincent Seguin committed
111
struct vout_font_s;
Vincent Seguin's avatar
Vincent Seguin committed
112 113 114 115 116 117
struct vout_sys_s;
struct vdec_thread_s;
struct vpar_thread_s;
struct video_parser_s;

typedef struct vout_thread_s *          p_vout_thread_t;
Vincent Seguin's avatar
Vincent Seguin committed
118
typedef struct vout_font_s *            p_vout_font_t;
Vincent Seguin's avatar
Vincent Seguin committed
119 120 121 122 123
typedef struct vout_sys_s *             p_vout_sys_t;
typedef struct vdec_thread_s *          p_vdec_thread_t;
typedef struct vpar_thread_s *          p_vpar_thread_t;
typedef struct video_parser_s *         p_video_parser_t;

124
/*****************************************************************************
Michel Kaempf's avatar
Michel Kaempf committed
125
 * Macros and inline functions
126
 *****************************************************************************/
Michel Kaempf's avatar
Michel Kaempf committed
127

Christophe Massiot's avatar
Christophe Massiot committed
128 129 130 131 132 133
#ifdef NTOHL_IN_SYS_PARAM_H
#   include <sys/param.h>
#else
#   include <netinet/in.h>
#endif

Michel Kaempf's avatar
Michel Kaempf committed
134 135 136 137 138 139 140
/* CEIL: division with round to nearest greater integer */
#define CEIL(n, d)  ( ((n) / (d)) + ( ((n) % (d)) ? 1 : 0) )

/* PAD: PAD(n, d) = CEIL(n ,d) * d */
#define PAD(n, d)   ( ((n) % (d)) ? ((((n) / (d)) + 1) * (d)) : (n) )

/* MAX and MIN: self explanatory */
141
#ifndef MAX
Michel Kaempf's avatar
Michel Kaempf committed
142
#define MAX(a, b)   ( ((a) > (b)) ? (a) : (b) )
143 144
#endif
#ifndef MIN
Michel Kaempf's avatar
Michel Kaempf committed
145
#define MIN(a, b)   ( ((a) < (b)) ? (a) : (b) )
146
#endif
Michel Kaempf's avatar
Michel Kaempf committed
147

Sam Hocevar's avatar
 
Sam Hocevar committed
148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172
/*
 * This is stolen from the livid source who stole it from the kernel
 */

#if defined(SYS_BEOS)
#   define swab32(x) B_BENDIAN_TO_HOST_INT32(x)
#else
#   ifdef WORDS_BIG_ENDIAN
#       define swab32(x) (x)
#   else
#       if defined (HAVE_X86_BSWAP)
static __inline__ const u32 __i386_swab32( u32 x )
{
    __asm__("bswap %0" : "=r" (x) : "0" (x));
    return x;
}
#           define swab32(x) __i386_swab32(x)
#       else
#           define swab32(x)                                                 \
            ( ( (u32)(((u8*)&x)[0]) << 24 ) | ( (u32)(((u8*)&x)[1]) << 16 ) |\
              ( (u32)(((u8*)&x)[2]) << 8 )  | ( (u32)(((u8*)&x)[3])) )
#       endif
#   endif
#endif

173
/* MSB (big endian)/LSB (little endian) conversions - network order is always
Michel Kaempf's avatar
Michel Kaempf committed
174 175 176 177
 * 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 <netinet/in.h> or the local equivalent. */
Sam Hocevar's avatar
 
Sam Hocevar committed
178 179 180
/* FIXME: hton64 should be declared as an extern inline function to avoid
 * border effects (see byteorder.h) */
#if WORDS_BIGENDIAN
Michel Kaempf's avatar
Michel Kaempf committed
181 182
#define hton16      htons
#define hton32      htonl
Sam Hocevar's avatar
 
Sam Hocevar committed
183
#define hton64(i)   ( i )
184
#define ntoh16      ntohs
Michel Kaempf's avatar
Michel Kaempf committed
185
#define ntoh32      ntohl
Sam Hocevar's avatar
 
Sam Hocevar committed
186 187
#define ntoh64(i)   ( i )
#else
Michel Kaempf's avatar
Michel Kaempf committed
188 189
#define hton16      htons
#define hton32      htonl
Sam Hocevar's avatar
 
Sam Hocevar committed
190
#define hton64(i)   ( ((u64)(htonl((i) & 0xffffffff)) << 32) | htonl(((i) >> 32) & 0xffffffff ) )
Michel Kaempf's avatar
Michel Kaempf committed
191 192
#define ntoh16      ntohs
#define ntoh32      ntohl
Sam Hocevar's avatar
 
Sam Hocevar committed
193
#define ntoh64      hton64
Michel Kaempf's avatar
Michel Kaempf committed
194 195
#endif

196
/* Macros with automatic casts */
Sam Hocevar's avatar
 
Sam Hocevar committed
197
#define U32_AT(p)   ( swab32 ( *( (u32 *)(p) ) ) )
Michel Kaempf's avatar
Michel Kaempf committed
198
#define U16_AT(p)   ( ntohs ( *( (u16 *)(p) ) ) )
Sam Hocevar's avatar
 
Sam Hocevar committed
199