mscommon.h 8.23 KB
Newer Older
aymeric's avatar
aymeric committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
/*
mediastreamer2 library - modular sound and video processing and streaming
Copyright (C) 2006  Simon MORLAT (simon.morlat@linphone.org)

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.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

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-1307, USA.
*/
#ifndef mscommon_h
#define mscommon_h

22 23 24
#include <ortp/logging.h>
#include <ortp/port.h>
#include <ortp/str_utils.h>
Ghislain MARY's avatar
Ghislain MARY committed
25
#include <ortp/payloadtype.h>
26
#include <time.h>
jehan's avatar
jehan committed
27 28 29
#if defined(__APPLE__) 
#include "TargetConditionals.h"
#endif
aymeric's avatar
aymeric committed
30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52

#define ms_malloc	ortp_malloc
#define ms_malloc0	ortp_malloc0
#define ms_realloc	ortp_realloc
#define ms_new		ortp_new
#define ms_new0		ortp_new0
#define ms_free		ortp_free
#define ms_strdup	ortp_strdup
#define ms_strdup_printf	ortp_strdup_printf

#define ms_mutex_t		ortp_mutex_t
#define ms_mutex_init		ortp_mutex_init
#define ms_mutex_destroy	ortp_mutex_destroy
#define ms_mutex_lock		ortp_mutex_lock
#define ms_mutex_unlock		ortp_mutex_unlock

#define ms_cond_t		ortp_cond_t
#define ms_cond_init		ortp_cond_init
#define ms_cond_wait		ortp_cond_wait
#define ms_cond_signal		ortp_cond_signal
#define ms_cond_broadcast	ortp_cond_broadcast
#define ms_cond_destroy		ortp_cond_destroy

Simon Morlat's avatar
Simon Morlat committed
53 54 55 56 57 58
#if defined(_MSC_VER)
#define MS2_PUBLIC	__declspec(dllexport)
#else
#define MS2_PUBLIC
#endif

59 60 61 62 63 64
#if defined(_WIN32_WCE)
time_t ms_time (time_t *t);
#else
#define ms_time time
#endif

aymeric's avatar
aymeric committed
65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
#ifdef WIN32
static inline void ms_debug(const char *fmt,...)
{
  va_list args;
  va_start (args, fmt);
  ortp_logv(ORTP_DEBUG, fmt, args);
  va_end (args);
}
#else
#ifdef DEBUG
static inline void ms_debug(const char *fmt,...)
{
  va_list args;
  va_start (args, fmt);
  ortp_logv(ORTP_DEBUG, fmt, args);
  va_end (args);
}
#else
#define ms_debug(...)
#endif	
#endif

#define ms_message	ortp_message
#define ms_warning	ortp_warning
#define ms_error	ortp_error
#define ms_fatal	ortp_fatal

#define ms_return_val_if_fail(_expr_,_ret_)\
	if (!(_expr_)) { ms_error("assert "#_expr_ "failed"); return (_ret_);}

#define ms_return_if_fail(_expr_) \
	if (!(_expr_)){ ms_error("assert "#_expr_ "failed"); return ;}

#define ms_thread_t		ortp_thread_t
#define ms_thread_create 	ortp_thread_create
#define ms_thread_join		ortp_thread_join
101

102 103 104
typedef ortpTimeSpec MSTimeSpec;

#define ms_get_cur_time ortp_get_cur_time
aymeric's avatar
aymeric committed
105 106 107 108 109 110 111 112 113 114 115 116 117

struct _MSList {
	struct _MSList *next;
	struct _MSList *prev;
	void *data;
};

typedef struct _MSList MSList;


#define ms_list_next(elem) ((elem)->next)


118 119
typedef int (*MSCompareFunc)(const void *a, const void *b);

aymeric's avatar
aymeric committed
120 121 122 123
#ifdef __cplusplus
extern "C"{
#endif

124
void ms_thread_exit(void* ret_val);
Simon Morlat's avatar
Simon Morlat committed
125
MS2_PUBLIC MSList * ms_list_append(MSList *elem, void * data);
Simon Morlat's avatar
Simon Morlat committed
126
MS2_PUBLIC MSList *ms_list_append_link(MSList *elem, MSList *new_elem);
Simon Morlat's avatar
Simon Morlat committed
127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142
MS2_PUBLIC MSList * ms_list_prepend(MSList *elem, void * data);
MS2_PUBLIC MSList * ms_list_free(MSList *elem);
MS2_PUBLIC MSList * ms_list_concat(MSList *first, MSList *second);
MS2_PUBLIC MSList * ms_list_remove(MSList *first, void *data);
MS2_PUBLIC int ms_list_size(const MSList *first);
MS2_PUBLIC void ms_list_for_each(const MSList *list, void (*func)(void *));
MS2_PUBLIC void ms_list_for_each2(const MSList *list, void (*func)(void *, void *), void *user_data);
MS2_PUBLIC MSList *ms_list_remove_link(MSList *list, MSList *elem);
MS2_PUBLIC MSList *ms_list_find(MSList *list, void *data);
MS2_PUBLIC MSList *ms_list_find_custom(MSList *list, MSCompareFunc compare_func, const void *user_data);
MS2_PUBLIC void * ms_list_nth_data(const MSList *list, int index);
MS2_PUBLIC int ms_list_position(const MSList *list, MSList *elem);
MS2_PUBLIC int ms_list_index(const MSList *list, void *data);
MS2_PUBLIC MSList *ms_list_insert_sorted(MSList *list, void *data, MSCompareFunc compare_func);
MS2_PUBLIC MSList *ms_list_insert(MSList *list, MSList *before, void *data);
MS2_PUBLIC MSList *ms_list_copy(const MSList *list);
aymeric's avatar
aymeric committed
143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165

#undef MIN
#define MIN(a,b)	((a)>(b) ? (b) : (a))
#undef MAX
#define MAX(a,b)	((a)>(b) ? (a) : (b))

/**
 * @file mscommon.h
 * @brief mediastreamer2 mscommon.h include file
 *
 * This file provide the API needed to initialize
 * and reset the mediastreamer2 library.
 *
 */

/**
 * @defgroup mediastreamer2_init Init API - manage mediastreamer2 library.
 * @ingroup mediastreamer2_api
 * @{
 */


/**
166 167 168
 * Helper macro for backward compatibility.
 * Use ms_base_init() and ms_voip_init() instead.
 */
169
#define ms_init()	ms_base_init(), ms_voip_init(), ms_plugins_init()
170 171 172 173 174 175 176 177 178 179

/**
 * Helper macro for backward compatibility.
 * Use ms_base_exit() and ms_voip_exit() instead.
 */
#define ms_exit()	ms_voip_exit(), ms_base_exit()


/**
 * Initialize the mediastreamer2 base library.
aymeric's avatar
aymeric committed
180 181 182
 *
 * This must be called once before calling any other API.
 */
183 184 185 186 187 188 189 190
MS2_PUBLIC void ms_base_init(void);

/**
 * Initialize the mediastreamer2 VoIP library.
 *
 * This must be called one before calling any other API.
 */
MS2_PUBLIC void ms_voip_init(void);
aymeric's avatar
aymeric committed
191

192 193 194 195 196 197 198 199
/**
 * Load the plugins from the default plugin directory.
 *
 * This is just a wrapper around ms_load_plugins().
 * This must be called after ms_base_init() and after ms_voip_init().
 */
MS2_PUBLIC void ms_plugins_init(void);

aymeric's avatar
aymeric committed
200 201
/**
 * Load plugins from a specific directory.
smorlat's avatar
smorlat committed
202 203 204 205
 * This method basically loads all libraries in the specified directory and attempts to call a C function called
 * \<libraryname\>_init. For example if a library 'libdummy.so' or 'libdummy.dll' is found, then the loader tries to locate
 * a C function called 'libdummy_init()' and calls it if it exists.
 * ms_load_plugins() can be used to load non-mediastreamer2 plugins as it does not expect mediastreamer2 specific entry points.
aymeric's avatar
aymeric committed
206 207 208 209 210
 *
 * @param directory   A directory where plugins library are available.
 *
 * Returns: >0 if successfull, 0 if not plugins loaded, -1 otherwise.
 */
Simon Morlat's avatar
Simon Morlat committed
211
MS2_PUBLIC int ms_load_plugins(const char *directory);
aymeric's avatar
aymeric committed
212 213

/**
214 215 216 217 218 219 220 221
 * Release resource allocated in the mediastreamer2 base library.
 *
 * This must be called once before closing program.
 */
MS2_PUBLIC void ms_base_exit(void);

/**
 * Release resource allocated in the mediastreamer2 VoIP library.
aymeric's avatar
aymeric committed
222 223 224
 *
 * This must be called once before closing program.
 */
225
MS2_PUBLIC void ms_voip_exit(void);
aymeric's avatar
aymeric committed
226 227 228

struct _MSSndCardDesc;

Simon Morlat's avatar
Simon Morlat committed
229
MS2_PUBLIC void ms_sleep(int seconds);
aymeric's avatar
aymeric committed
230

Simon Morlat's avatar
Simon Morlat committed
231
MS2_PUBLIC void ms_usleep(uint64_t usec);
232

aymeric's avatar
aymeric committed
233 234 235 236
/**
 * The max payload size allowed.
 * Filters that generate data that can be sent through RTP should make packets
 * whose size is below ms_get_payload_max_size().
jehan's avatar
jehan committed
237
 * The default value is 1440 computed as the standard internet MTU minus IPv6 header,
aymeric's avatar
aymeric committed
238 239 240 241
 * UDP header and RTP header. As IPV4 header is smaller than IPv6 header, this 
 * value works for both.
 * 
**/
Simon Morlat's avatar
Simon Morlat committed
242
MS2_PUBLIC int ms_get_payload_max_size();
aymeric's avatar
aymeric committed
243

Simon Morlat's avatar
Simon Morlat committed
244
MS2_PUBLIC void ms_set_payload_max_size(int size);
aymeric's avatar
aymeric committed
245 246 247 248 249 250

/**
 * Returns the network Max Transmission Unit to reach destination_host.
 * This will attempt to send one or more big packets to destination_host, to a random port.
 * Those packets are filled with zeroes.
**/
Simon Morlat's avatar
Simon Morlat committed
251
MS2_PUBLIC int ms_discover_mtu(const char *destination_host);
aymeric's avatar
aymeric committed
252 253 254 255 256

/**
 * Set mediastreamer default mtu, used to compute the default RTP max payload size.
 * This function will call ms_set_payload_max_size(mtu-[ipv6 header size]).
**/
Simon Morlat's avatar
Simon Morlat committed
257
MS2_PUBLIC void ms_set_mtu(int mtu);
aymeric's avatar
aymeric committed
258

259 260 261 262 263 264 265
/**
 * Declare how many cpu (cores) are available on the platform
 */
MS2_PUBLIC void ms_set_cpu_count(unsigned int c);
 
MS2_PUBLIC unsigned int ms_get_cpu_count();

aymeric's avatar
aymeric committed
266 267 268 269 270 271
/** @} */

#ifdef __cplusplus
}
#endif

Simon Morlat's avatar
Simon Morlat committed
272 273 274 275
#ifdef MS2_INTERNAL
#  ifdef HAVE_CONFIG_H
#  include "mediastreamer-config.h" /*necessary to know if ENABLE_NLS is there*/
#  endif
276 277 278 279 280 281 282 283

#ifdef WIN32
#include <malloc.h> //for alloca
#ifdef _MSC_VER
#define alloca _alloca
#endif
#endif

Simon Morlat's avatar
Simon Morlat committed
284 285 286 287 288 289 290 291
#  if defined(ENABLE_NLS)
#    include <libintl.h>
#    define _(String) dgettext (GETTEXT_PACKAGE, String)
#  else
#    define _(String) (String)
#  endif // ENABLE_NLS
#define N_(String) (String)
#endif // MS2_INTERNAL
292 293 294 295

#ifdef ANDROID
#include "mediastreamer2/msjava.h"
#endif
aymeric's avatar
aymeric committed
296
#endif
Simon Morlat's avatar
Simon Morlat committed
297