/* * 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