/*
* Copyright (c) 2010-2019 Belledonne Communications SARL.
*
* This file is part of mediastreamer2.
*
* 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 3 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, see .
*/
#ifndef mscommon_h
#define mscommon_h
#include
#include
#include
#include
#include
#include
#include
#if defined(__APPLE__)
#include "TargetConditionals.h"
#endif
#if defined(__arm__) || defined(__arm64__) || defined(__aarch64__) || defined(_M_ARM)
#define MS_HAS_ARM 1
#endif
#if defined(__ARM_NEON__) || defined(__ARM_NEON)
#define MS_HAS_ARM_NEON 1
#endif
#if MS_HAS_ARM_NEON && !(defined(__arm64__) || defined(__aarch64__))
#define MS_HAS_ARM_NEON_32 1
#endif
#ifndef MS2_DEPRECATED
#if defined(_MSC_VER)
#define MS2_DEPRECATED __declspec(deprecated)
#else
#define MS2_DEPRECATED __attribute__ ((deprecated))
#endif
#endif
#define MS_UNUSED(x) ((void)(x))
#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_strndup ortp_strndup
#define ms_strdup_printf ortp_strdup_printf
#define ms_strcat_printf ortp_strcat_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
#define MS_DEFAULT_MAX_PAYLOAD_SIZE 1440
#define MS2_INLINE ORTP_INLINE
#ifdef _WIN32
#if defined(__MINGW32__) || !defined(WINAPI_FAMILY_PARTITION) || !defined(WINAPI_PARTITION_DESKTOP)
#define MS2_WINDOWS_DESKTOP 1
#elif defined(WINAPI_FAMILY_PARTITION)
#if defined(WINAPI_PARTITION_DESKTOP) && WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
#define MS2_WINDOWS_DESKTOP 1
#elif defined(WINAPI_PARTITION_PHONE_APP) && WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_PHONE_APP)
#define MS2_WINDOWS_PHONE 1
#elif defined(WINAPI_PARTITION_APP) && WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP)
#define MS2_WINDOWS_DESKTOP 1
#endif
#endif
#ifdef ENABLE_MICROSOFT_STORE_APP
_Check_return_ WINOLEAPI
CoCreateInstanceFromApp(
_In_ REFCLSID Clsid,
_In_opt_ IUnknown* punkOuter,
_In_ DWORD dwClsCtx,
_In_opt_ PVOID reserved,
_In_ DWORD dwCount,
_Inout_updates_(dwCount) MULTI_QI* pResults
);
#endif
__inline _Check_return_ HRESULT CoCreateInstanceBT(
_In_ REFCLSID rclsid,
_In_opt_ LPUNKNOWN pUnkOuter,
_In_ DWORD dwClsContext,
_In_ REFIID riid,
_COM_Outptr_ _At_(*ppv, _Post_readable_size_(_Inexpressible_(varies))) LPVOID FAR* ppv)
{
#ifdef ENABLE_MICROSOFT_STORE_APP
MULTI_QI OneQI;
HRESULT hr;
OneQI.pItf = NULL;
#ifdef __cplusplus
OneQI.pIID = &riid;
#else
OneQI.pIID = riid;
#endif
hr = CoCreateInstanceFromApp( rclsid, pUnkOuter, dwClsContext, NULL, 1, &OneQI );
#ifdef _PREFAST_
if (SUCCEEDED(hr) && SUCCEEDED(OneQI.hr))
_Analysis_assume_(OneQI.pItf != NULL);
else
_Analysis_assume_(OneQI.pItf == NULL);
#endif
*ppv = OneQI.pItf;
return FAILED(hr) ? hr : OneQI.hr;
#else
return CoCreateInstance(rclsid, pUnkOuter, dwClsContext, riid, ppv );
#endif //ENABLE_MICROSOFT_STORE_APP
}
__inline _Check_return_ HRESULT CoCreateInstanceExBT(
_In_ REFCLSID Clsid,
_In_opt_ IUnknown * punkOuter,
_In_ DWORD dwClsCtx,
_In_opt_ COSERVERINFO * pServerInfo,
_In_ DWORD dwCount,
_Inout_updates_(dwCount) MULTI_QI *pResults )
{
#ifdef ENABLE_MICROSOFT_STORE_APP
return CoCreateInstanceFromApp(Clsid, punkOuter, dwClsCtx, pServerInfo, dwCount, pResults);
#else
return CoCreateInstanceEx(Clsid, punkOuter, dwClsCtx, pServerInfo, dwCount, pResults);
#endif //ENABLE_MICROSOFT_STORE_APP
}
#endif
#if defined(_MSC_VER)
#ifdef MS2_STATIC
#define MS2_PUBLIC
#define MS2_VAR_PUBLIC extern
#else
#ifdef MS2_EXPORTS
#define MS2_PUBLIC __declspec(dllexport)
#define MS2_VAR_PUBLIC extern __declspec(dllexport)
#else
#define MS2_PUBLIC __declspec(dllimport)
#define MS2_VAR_PUBLIC extern __declspec(dllimport)
#endif
#endif
#else
#define MS2_PUBLIC
#define MS2_VAR_PUBLIC extern
#endif
#if defined(_WIN32_WCE)
time_t ms_time (time_t *t);
#else
#define ms_time time
#endif
#ifdef DEBUG
static MS2_INLINE void ms_debug(const char *fmt,...)
{
va_list args;
va_start (args, fmt);
bctbx_logv(BCTBX_LOG_DOMAIN, BCTBX_LOG_DEBUG, fmt, args);
va_end (args);
}
#else
#define ms_debug(fmt, ...)
#endif
#define ms_message bctbx_message
#define ms_warning bctbx_warning
#define ms_error bctbx_error
#define ms_fatal bctbx_fatal
#define ms_return_val_if_fail(_expr_,_ret_)\
if (!(_expr_)) { ms_fatal("assert "#_expr_ "failed"); return (_ret_);}
#define ms_return_if_fail(_expr_) \
if (!(_expr_)){ ms_fatal("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
#define ms_thread_self ortp_thread_self
typedef ortpTimeSpec MSTimeSpec;
#define ms_get_cur_time ortp_get_cur_time
#define ms_get_cur_time_ms ortp_get_cur_time_ms
typedef bctbx_compare_func MSCompareFunc;
typedef void (*MSIterateFunc)(void *a);
typedef void (*MSIterate2Func)(void *a, void *b);
typedef void (*MSIterate3Func)(void *a, void *b, void *c);
#ifdef __cplusplus
extern "C"{
#endif
/*for stun*/
typedef struct { unsigned char octet[12]; } UInt96;
typedef struct { unsigned char octet[16]; } UInt128;
MS2_PUBLIC void ms_thread_exit(void* ret_val);
#define MSList bctbx_list_t
/**
* @addtogroup ms_list
* @{
**/
/** Inserts a new element containing data to the end of a given list
* @param list list where data should be added. If NULL, a new list will be created.
* @param data data to insert into the list
* @return first element of the list
* @deprecated Use bctbx_list_append() instead
**/
MS2_PUBLIC MS2_DEPRECATED MSList * ms_list_append(MSList *list, void * data);
/** Inserts given element to the end of a given list
* @param list list where data should be added. If NULL, a new list will be created.
* @param new_elem element to append
* @return first element of the list
* @deprecated Use bctbx_list_append_link() instead
**/
MS2_PUBLIC MS2_DEPRECATED MSList *ms_list_append_link(MSList *list, MSList *new_elem);
/** Inserts a new element containing data to the start of a given list
* @param list list where data should be added. If NULL, a new list will be created.
* @param data data to insert into the list
* @return first element of the list - the one which was just created.
* @deprecated Use bctbx_list_prepend() instead
**/
MS2_PUBLIC MS2_DEPRECATED MSList * ms_list_prepend(MSList *list, void * data);
/** Frees all elements of a given list
* Note that data contained in each element will not be freed. If you need to clean
* them, consider using @ms_list_free_with_data
* @param list object to free.
* @return NULL
* @deprecated Use bctbx_list_free() instead
**/
MS2_PUBLIC MS2_DEPRECATED MSList * ms_list_free(MSList *list);
/** Frees all elements of a given list after having called freefunc on each element
* @param list object to free.
* @param freefunc function to invoke on each element data before destroying the element
* @return NULL
* @deprecated Use bctbx_list_free_with_data() instead
**/
MS2_PUBLIC MS2_DEPRECATED MSList * ms_list_free_with_data(MSList *list, void (*freefunc)(void*));
/** Concatenates second list to the end of first list
* @param first First list
* @param second Second list to append at the end of first list.
* @return first element of the merged list
* @deprecated Use bctbx_list_concat() instead
**/
MS2_PUBLIC MS2_DEPRECATED MSList * ms_list_concat(MSList *first, MSList *second);
/** Finds and remove the first element containing the given data. Nothing is done if element is not found.
* @param list List in which data must be removed
* @param data Data to remove
* @return first element of the modified list
* @deprecated Use bctbx_list_remove() instead
**/
MS2_PUBLIC MS2_DEPRECATED MSList * ms_list_remove(MSList *list, void *data);
/** Finds and remove any elements according to the given predicate function
* @param list List in which data must be removed
* @param compare_func Function to invoke on each element. If it returns TRUE, the given element will be deleted.
* @param user_data User data to pass to compare_func function
* @return first element of the modified list
* @deprecated Use bctbx_list_remove_custom() instead
**/
MS2_PUBLIC MS2_DEPRECATED MSList * ms_list_remove_custom(MSList *list, MSCompareFunc compare_func, const void *user_data);
/** Returns size of a given list
* @param list List to measure
* @return Size of list
* @deprecated Use bctbx_list_size() instead
**/
MS2_PUBLIC MS2_DEPRECATED int ms_list_size(const MSList *list);
/** Invoke function on each element of the list
* @param list List object
* @param iterate_func Function to invoke on each element.
* @deprecated Use bctbx_list_for_each() instead
**/
MS2_PUBLIC MS2_DEPRECATED void ms_list_for_each(const MSList *list, MSIterateFunc iterate_func);
/** Invoke function on each element of the list
* @param list List object
* @param iterate_func Function to invoke on each element.
* @param user_data User data to pass to iterate_func function.
* @deprecated Use bctbx_list_for_each2() instead
**/
MS2_PUBLIC MS2_DEPRECATED void ms_list_for_each2(const MSList *list, MSIterate2Func iterate_func, void *user_data);
MS2_PUBLIC MS2_DEPRECATED void ms_list_for_each3(const MSList *list, MSIterate3Func iterate_func, void *user_data, void *factory);
/** Finds and remove given element in list.
* @param list List in which element must be removed
* @param element element to remove
* @return first element of the modified list
* @deprecated Use bctbx_list_remove_link() instead
**/
MS2_PUBLIC MS2_DEPRECATED MSList *ms_list_remove_link(MSList *list, MSList *elem);
/** Finds first element containing data in the given list.
* @param list List in which element must be found
* @param data data to find
* @return element containing data, or NULL if not found
* @deprecated Use bctbx_list_find() instead
**/
MS2_PUBLIC MS2_DEPRECATED MSList *ms_list_find(MSList *list, void *data);
/** Finds first element according to the given predicate function
* @param list List in which element must be found
* @param compare_func Function to invoke on each element. If it returns TRUE, the given element will be returned.
* @param user_data User data to pass to compare_func function
* @return Element matching the predicate, or NULL if none is found.
* @deprecated Use bctbx_list_find_custom() instead
**/
MS2_PUBLIC MS2_DEPRECATED MSList *ms_list_find_custom(MSList *list, MSCompareFunc compare_func, const void *user_data);
/** Returns the nth element data of the list
* @param list List object
* @param index data index which must be returned.
* @return Element at the given index. NULL if index is invalid (negative or greater or equal to ms_list_size).
* @deprecated Use bctbx_list_nth_data() instead
**/
MS2_PUBLIC MS2_DEPRECATED void * ms_list_nth_data(const MSList *list, int index);
/** Returns the index of the given element
* @param list List object
* @param elem Element to search for.
* @return Index of the given element. -1 if not found.
* @deprecated Use bctbx_list_position() instead
**/
MS2_PUBLIC MS2_DEPRECATED int ms_list_position(const MSList *list, MSList *elem);
/** Returns the index of the first element containing data
* @param list List object
* @param data Data to search for.
* @return Index of the element containing data. -1 if not found.
* @deprecated Use bctbx_list_index() instead
**/
MS2_PUBLIC MS2_DEPRECATED int ms_list_index(const MSList *list, void *data);
/** Inserts a new element containing data at the place given by compare_func
* @param list list where data should be added. If NULL, a new list will be created.
* @param data data to insert into the list
* @param compare_func function determining where should the new element be placed
* @return first element of the list.
* @deprecated Use bctbx_list_insert_sorted() instead
**/
MS2_PUBLIC MS2_DEPRECATED MSList *ms_list_insert_sorted(MSList *list, void *data, MSCompareFunc compare_func);
/** Inserts a new element containing data before the given element
* @param list list where data should be added. If NULL, a new list will be created.
* @param before element parent to the one we will insert.
* @param data data to insert into the list
* @return first element of the modified list.
* @deprecated Use bctbx_list_insert() instead
**/
MS2_PUBLIC MS2_DEPRECATED MSList *ms_list_insert(MSList *list, MSList *before, void *data);
/** Copies a list in another one, duplicating elements but not data
* @param list list to copy
* @return Newly created list
* @deprecated Use bctbx_list_copy() instead
**/
MS2_PUBLIC MS2_DEPRECATED MSList *ms_list_copy(const MSList *list);
/** Copies a list in another one, duplicating elements according to the given function
* @param list list to copy
* @param copyfunc function to invoke on each element which will return the new list data value
* @return Newly created list
* @deprecated Use bctbx_list_copy_with_data() instead
**/
MS2_PUBLIC MS2_DEPRECATED MSList *ms_list_copy_with_data(const MSList *list, void *(*copyfunc)(void *));
/**
* @deprecated @deprecated Use bctbx_list_next() instead
*/
MS2_PUBLIC MS2_DEPRECATED MSList* ms_list_next(const MSList *list);
/** @} */
MS2_PUBLIC char * ms_tags_list_as_string(const MSList *list);
MS2_PUBLIC bool_t ms_tags_list_contains_tag(const MSList *list, const char *tag);
#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.
*
*/
/**
* @addtogroup mediastreamer2_init
* @{
*/
/**
* Helper macro for backward compatibility.
* Use ms_base_init() and ms_voip_init() instead.
*/
#define ms_init() ms_base_init(), ms_voip_init(), ms_plugins_init()
/**
* Helper macro for backward compatibility.
* Use ms_base_exit() and ms_voip_exit() instead.
*/
#define ms_exit() ms_voip_exit(), ms_plugins_exit(), ms_base_exit()
/**
* Initialize the mediastreamer2 base library.
*
* This must be called once before calling any other API.
* @deprecated use ms_factory_new()
*/
MS2_PUBLIC MS2_DEPRECATED void ms_base_init(void);
/**
* Initialize the mediastreamer2 VoIP library.
*
* This must be called one before calling any other API.
* @deprecated use ms_factory_new_with_voip().
*/
MS2_PUBLIC MS2_DEPRECATED void ms_voip_init(void);
/**
* 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().
* @deprecated use ms_factory_init_plugins(), or ms_factory_new_with_voip() that does it automatically.
*/
MS2_PUBLIC MS2_DEPRECATED void ms_plugins_init(void);
/**
* Set the directory from where the plugins are to be loaded when calling ms_plugins_init().
* @param[in] path The path to the plugins directory.
* @deprecated use ms_factory_set_plugins_dir().
*/
MS2_PUBLIC MS2_DEPRECATED void ms_set_plugins_dir(const char *path);
/**
* Load plugins from a specific directory.
* This method basically loads all libraries in the specified directory and attempts to call a C function called
* \_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.
*
* @param directory A directory where plugins library are available.
*
* @return >0 if successfull, 0 if not plugins loaded, -1 otherwise.
* @deprecated use ms_factory_load_plugins().
*/
MS2_PUBLIC MS2_DEPRECATED int ms_load_plugins(const char *directory);
/**
* Release resource allocated in the mediastreamer2 base library.
*
* This must be called once before closing program.
* @deprecated use ms_factory_destroy().
*/
MS2_PUBLIC MS2_DEPRECATED void ms_base_exit(void);
/**
* Release resource allocated in the mediastreamer2 VoIP library.
*
* This must be called once before closing program.
* @deprecated use ms_factory_destroy().
*/
MS2_PUBLIC MS2_DEPRECATED void ms_voip_exit(void);
/**
* Unload the plugins loaded by ms_plugins_init().
* @deprecated use ms_factory_destroy().
*/
MS2_PUBLIC MS2_DEPRECATED void ms_plugins_exit(void);
struct _MSSndCardDesc;
MS2_PUBLIC void ms_sleep(int seconds);
MS2_PUBLIC void ms_usleep(uint64_t usec);
/**
* 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().
* The default value is 1440 computed as the standard internet MTU minus IPv6 header,
* UDP header and RTP header. As IPV4 header is smaller than IPv6 header, this
* value works for both.
* @deprecated use ms_factory_get_payload_max_size().
**/
MS2_PUBLIC MS2_DEPRECATED int ms_get_payload_max_size(void);
/**
* Set the maximum payload size allowed.
* @deprecated use ms_factory_set_payload_max_size().
**/
MS2_PUBLIC MS2_DEPRECATED void ms_set_payload_max_size(int size);
/**
* 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.
**/
MS2_PUBLIC int ms_discover_mtu(const char *destination_host);
/**
* 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]).
* @deprecated use ms_factory_set_mtu()
**/
MS2_PUBLIC MS2_DEPRECATED void ms_set_mtu(int mtu);
/**
* Get mediastreamer default mtu, used to compute the default RTP max payload size.
* @deprecated use ms_factory_get_mtu().
**/
MS2_PUBLIC MS2_DEPRECATED int ms_get_mtu(void);
/**
* Declare how many cpu (cores) are available on the platform
* @deprecated use ms_factory_set_cpu_count().
*/
MS2_PUBLIC MS2_DEPRECATED void ms_set_cpu_count(unsigned int c);
/**
* @deprecated use ms_factory_get_cpu_count().
**/
MS2_PUBLIC MS2_DEPRECATED unsigned int ms_get_cpu_count(void);
/**
* Adds a new entry in the SoundDeviceDescription table
*/
MS2_PUBLIC void ms_sound_device_description_add(const char *manufacturer, const char *model, const char *platform, unsigned int flags, int delay, int recommended_rate);
/**
* @return TRUE if address is ipv6
*/
MS2_PUBLIC bool_t ms_is_ipv6(const char *address);
/**
* @return TRUE if address is multicast
*/
bool_t ms_is_multicast_addr(const struct sockaddr *address);
/**
* @return TRUE if address is multicast
*/
MS2_PUBLIC bool_t ms_is_multicast(const char *address);
/**
* Utility function to load a file into memory.
* @param file a FILE handle
* @param nbytes (optional) number of bytes read
**/
MS2_PUBLIC char *ms_load_file_content(FILE *file, size_t *nbytes);
/**
* Utility function to load a file into memory.
* @param path a FILE handle
* @param nbytes (optional) number of bytes read
**/
MS2_PUBLIC char *ms_load_path_content(const char *path, size_t *nbytes);
/** @} */
#ifdef __cplusplus
}
#endif
#ifdef MS2_INTERNAL
# ifdef HAVE_CONFIG_H
# include "mediastreamer-config.h" /*necessary to know if ENABLE_NLS is there*/
# endif
#ifdef _WIN32
#include //for alloca
#ifdef _MSC_VER
#define alloca _alloca
#endif
#endif
# if defined(ENABLE_NLS)
#ifdef _MSC_VER
// prevent libintl.h from re-defining fprintf and vfprintf
#ifndef fprintf
#define fprintf fprintf
#endif
#ifndef vfprintf
#define vfprintf vfprintf
#endif
#define _GL_STDIO_H
#endif
# include
# define _(String) dgettext (GETTEXT_PACKAGE, String)
# else
# define _(String) (String)
# endif // ENABLE_NLS
#define N_(String) (String)
/*
* Used by audio encoders in case no default standardized maxptime defined.
*/
#ifndef MS_DEFAULT_MAX_PTIME
#define MS_DEFAULT_MAX_PTIME 140
#endif
#endif // MS2_INTERNAL
#ifdef __ANDROID__
#include "mediastreamer2/msjava.h"
#endif
#endif