common.h 6.3 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.24 2001/01/13 12:57:19 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;

Sam Hocevar's avatar
 
Sam Hocevar committed
64 65 66 67 68 69 70
/* DCT elements types */
#ifndef VDEC_DFT
typedef short dctelem_t;
#else
typedef int dctelem_t;
#endif

71
/*****************************************************************************
Vincent Seguin's avatar
Vincent Seguin committed
72
 * Classes declaration
73
 *****************************************************************************/
Vincent Seguin's avatar
Vincent Seguin committed
74

75 76 77 78 79 80 81 82 83 84 85 86
/* 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
87 88 89 90 91
/* Interface */
struct intf_thread_s;
struct intf_sys_s;
struct intf_console_s;
struct intf_msg_s;
92
struct intf_channel_s;
Vincent Seguin's avatar
Vincent Seguin committed
93 94 95 96 97

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;
98
typedef struct intf_channel_s *         p_intf_channel_t;
Vincent Seguin's avatar
Vincent Seguin committed
99 100 101

/* Input */
struct input_thread_s;
102
struct input_vlan_s;
Vincent Seguin's avatar
Vincent Seguin committed
103 104 105
struct input_cfg_s;

typedef struct input_thread_s *         p_input_thread_t;
106
typedef struct input_vlan_s *           p_input_vlan_t;
Vincent Seguin's avatar
Vincent Seguin committed
107 108 109 110
typedef struct input_cfg_s *            p_input_cfg_t;

/* Audio */
struct aout_thread_s;
111
struct aout_sys_s;
Vincent Seguin's avatar
Vincent Seguin committed
112 113

typedef struct aout_thread_s *          p_aout_thread_t;
114
typedef struct aout_sys_s *             p_aout_sys_t;
Vincent Seguin's avatar
Vincent Seguin committed
115 116 117

/* Video */
struct vout_thread_s;
Vincent Seguin's avatar
Vincent Seguin committed
118
struct vout_font_s;
Vincent Seguin's avatar
Vincent Seguin committed
119 120 121 122 123 124
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
125
typedef struct vout_font_s *            p_vout_font_t;
Vincent Seguin's avatar
Vincent Seguin committed
126 127 128 129 130
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;

131
/*****************************************************************************
Michel Kaempf's avatar
Michel Kaempf committed
132
 * Macros and inline functions
133
 *****************************************************************************/
Michel Kaempf's avatar
Michel Kaempf committed
134

Christophe Massiot's avatar
Christophe Massiot committed
135 136 137 138 139 140
#ifdef NTOHL_IN_SYS_PARAM_H
#   include <sys/param.h>
#else
#   include <netinet/in.h>
#endif

Michel Kaempf's avatar
Michel Kaempf committed
141 142 143 144 145 146 147
/* 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 */
148
#ifndef MAX
Michel Kaempf's avatar
Michel Kaempf committed
149
#define MAX(a, b)   ( ((a) > (b)) ? (a) : (b) )
150 151
#endif
#ifndef MIN
Michel Kaempf's avatar
Michel Kaempf committed
152
#define MIN(a, b)   ( ((a) < (b)) ? (a) : (b) )
153
#endif
Michel Kaempf's avatar
Michel Kaempf committed
154

Sam Hocevar's avatar
 
Sam Hocevar committed
155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179
/*
 * 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

180
/* MSB (big endian)/LSB (little endian) conversions - network order is always
Michel Kaempf's avatar
Michel Kaempf committed
181 182 183 184
 * 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
185 186 187
/* 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
188 189
#define hton16      htons
#define hton32      htonl
Sam Hocevar's avatar
 
Sam Hocevar committed
190
#define hton64(i)   ( i )
191
#define ntoh16      ntohs
Michel Kaempf's avatar
Michel Kaempf committed
192
#define ntoh32      ntohl
Sam Hocevar's avatar
 
Sam Hocevar committed
193 194
#define ntoh64(i)   ( i )
#else
Michel Kaempf's avatar
Michel Kaempf committed
195 196
#define hton16      htons
#define hton32      htonl
Sam Hocevar's avatar
 
Sam Hocevar committed
197
#define hton64(i)   ( ((u64)(htonl((i) & 0xffffffff)) << 32) | htonl(((i) >> 32) & 0xffffffff ) )
Michel Kaempf's avatar
Michel Kaempf committed
198 199
#define ntoh16      ntohs
#define ntoh32      ntohl
Sam Hocevar's avatar
 
Sam Hocevar committed
200
#define ntoh64      hton64
Michel Kaempf's avatar
Michel Kaempf committed
201 202
#endif

203
/* Macros with automatic casts */
Sam Hocevar's avatar
 
Sam Hocevar committed
204
#define U32_AT(p)   ( swab32 ( *( (u32 *)(p) ) ) )
Michel Kaempf's avatar
Michel Kaempf committed
205
#define U16_AT(p)   ( ntohs ( *( (u16 *)(p) ) ) )
Sam Hocevar's avatar
 
Sam Hocevar committed
206