/* * 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 msfactory_h #define msfactory_h #include "mediastreamer2/msfilter.h" #include "mediastreamer2/devices.h" /*do not use these fields directly*/ struct _MSFactory{ MSList *desc_list; MSList *stats_list; MSList *offer_answer_provider_list; #ifdef _WIN32 MSList *ms_plugins_loaded_list; #endif MSList *formats; MSList *platform_tags; char *plugins_dir; struct _MSVideoPresetsManager *video_presets_manager; int cpu_count; struct _MSEventQueue *evq; int max_payload_size; int mtu; struct _MSSndCardManager* sndcardmanager; struct _MSWebCamManager* wbcmanager; void (*voip_uninit_func)(struct _MSFactory*); bool_t statistics_enabled; bool_t voip_initd; MSDevicesInfo *devices_info; char *image_resources_dir; char *echo_canceller_filtername; int expected_video_bandwidth; }; typedef struct _MSFactory MSFactory; #ifdef __cplusplus extern "C" { #endif #ifndef MS2_DEPRECATED #if defined(_MSC_VER) #define MS2_DEPRECATED __declspec(deprecated) #else #define MS2_DEPRECATED __attribute__ ((deprecated)) #endif #endif /** * Create a mediastreamer2 factory. This is the root object that will create everything else from mediastreamer2. **/ MS2_PUBLIC MSFactory *ms_factory_new(void); /** * Create a mediastreamer2 factory and initialize all voip related filter, card and webcam managers. **/ MS2_PUBLIC MSFactory* ms_factory_new_with_voip(void); /** * Create a mediastreamer2 factory, initialize all voip related filters, cards and webcam managers and load the plugins from the specified directory. * @param[in] plugins_dir The path where to find the mediastreamer2 plugins to be loaded * @param[in] images_dir The path where to find the images */ MS2_PUBLIC MSFactory *ms_factory_new_with_voip_and_directories(const char *plugins_dir, const char *images_dir); /** * Create the fallback factory (for compatibility with applications not using MSFactory to create ms2 object) **/ MS2_DEPRECATED MS2_PUBLIC MSFactory *ms_factory_create_fallback(void); /** * Used by the legacy functions before MSFactory was added. * Do not use in an application. **/ MS2_DEPRECATED MS2_PUBLIC MSFactory *ms_factory_get_fallback(void); /** * Destroy the factory. * This should be done after destroying all objects created by the factory. **/ MS2_PUBLIC void ms_factory_destroy(MSFactory *factory); /* * Obtain the soundcard manager. **/ MS2_PUBLIC struct _MSSndCardManager* ms_factory_get_snd_card_manager(MSFactory *f); /** * Obtain the webcam manager. */ MS2_PUBLIC struct _MSWebCamManager* ms_factory_get_web_cam_manager(MSFactory* f); /** * Register a filter descriptor (MSFilterDesc) into the factory. **/ MS2_PUBLIC void ms_factory_register_filter(MSFactory *factory, MSFilterDesc *desc); /** * Retrieve capture filter that supports encoding to codec name. * * @param mime A string indicating the codec. * * @return a MSFilterDesc if successfull, NULL otherwise. */ MS2_PUBLIC MSFilterDesc * ms_factory_get_encoding_capturer(MSFactory *factory, const char *mime); /** * Retrieve render filter that supports decoding to codec name. * * @param mime A string indicating the codec. * * @return a MSFilterDesc if successfull, NULL otherwise. */ MS2_PUBLIC MSFilterDesc * ms_factory_get_decoding_renderer(MSFactory *factory, const char *mime); /** * Retrieve encoders according to codec name. * * @param mime A string indicating the codec. * * @return a MSFilterDesc if successfull, NULL otherwise. */ MS2_PUBLIC MSFilterDesc * ms_factory_get_encoder(MSFactory *factory, const char *mime); /** * Retrieve decoders according to codec name. * * @param mime A string indicating the codec. * * @return a MSFilterDesc if successfull, NULL otherwise. */ MS2_PUBLIC MSFilterDesc * ms_factory_get_decoder(MSFactory *factory, const char *mime); /** * Lookup a mediastreamer2 filter using its name. * If found, the descriptor (MSFilterDesc) is returned. * This descriptor can be used to instanciate the filter using ms_filter_new_from_desc() * This function can be useful to query the presence of a filter loaded as a plugin, for example. * * @param filter_name The filter name. **/ MS2_PUBLIC MSFilterDesc *ms_factory_lookup_filter_by_name(const MSFactory *factory, const char *filter_name); /** * Lookup a mediastreamer2 filter using its id. * If found, the descriptor (MSFilterDesc) is returned. * This descriptor can be used to instanciate the filter using ms_filter_new_from_desc() * This function can be useful to query the presence of a filter loaded as a plugin, for example. * * @param id The filter id. **/ MS2_PUBLIC MSFilterDesc* ms_factory_lookup_filter_by_id( MSFactory* factory, MSFilterId id); /** * Returns a list of filter descriptions implementing a given interface. * The list itself must be freed by the caller of this function, but not the MSFilterDesc pointed by the list elements. * @param id a filter interface id * @return a newly allocated MSList of #MSFilterDesc. **/ MS2_PUBLIC MSList *ms_factory_lookup_filter_by_interface(MSFactory *factory, MSFilterInterfaceId id); /** * Returns a list of all filter descriptions. * @return a newly allocated MSList of #MSFilterDesc. **/ MS2_PUBLIC const MSList *ms_factory_get_filter_decs(const MSFactory *factory); /** * Create encoder filter according to codec name. * * @param mime A string indicating the codec. * * @return a MSFilter if successfull, NULL otherwise. */ MS2_PUBLIC MSFilter * ms_factory_create_encoder(MSFactory *factory, const char *mime); /** * Create decoder filter according to codec name. * * @param mime A string indicating the codec. * * @return a MSFilter if successfull, NULL otherwise. */ MS2_PUBLIC MSFilter * ms_factory_create_decoder(MSFactory *factory, const char *mime); /** * Check if a encode or decode filter exists for a codec name. * * @param mime A string indicating the codec. * * @return TRUE if successfull, FALSE otherwise. */ MS2_PUBLIC bool_t ms_factory_codec_supported(MSFactory *factory, const char *mime); /** * Check if an encoder filter exists for a codec name. * * @param mime A string indicating the codec. * * @return TRUE if successfull, FALSE otherwise. */ MS2_PUBLIC bool_t ms_factory_has_encoder(MSFactory *factory, const char *mime); /** * Check if a decoder filter exists for a codec name. * * @param mime A string indicating the codec. * * @return TRUE if successfull, FALSE otherwise. */ MS2_PUBLIC bool_t ms_factory_has_decoder(MSFactory *factory, const char *mime); /** * Create decoder filter according to a filter's MSFilterId. * * @param id A MSFilterId identifier for the filter. * * @return a MSFilter if successfull, NULL otherwise. */ MS2_PUBLIC MSFilter *ms_factory_create_filter(MSFactory *factory, MSFilterId id); /** * Create decoder filter according to a filter's name. * * @param name A name for the filter. * * @return a MSFilter if successfull, NULL otherwise. */ MS2_PUBLIC MSFilter *ms_factory_create_filter_from_name(MSFactory *factory, const char *name); /** * Create decoder filter according to a filter's description. * * The primary use is to create your own filter's in your * application and avoid registration inside mediastreamer2. * * @param desc A MSFilterDesc for the filter. * * @return a MSFilter if successfull, NULL otherwise. */ MS2_PUBLIC MSFilter *ms_factory_create_filter_from_desc(MSFactory *factory, MSFilterDesc *desc); /** * Enable filter statistics measurement at run time. **/ MS2_PUBLIC void ms_factory_enable_statistics(MSFactory* obj, bool_t enabled); /** * Obtain a list of MSFilterStats. **/ MS2_PUBLIC const MSList * ms_factory_get_statistics(MSFactory* obj); /** * Reset filter's statistics. **/ MS2_PUBLIC void ms_factory_reset_statistics(MSFactory *obj); /** * Output statistics to logs. **/ MS2_PUBLIC void ms_factory_log_statistics(MSFactory *obj); /** * Get number of available cpus for processing. * The factory initializes this value to the number of logicial processors * available on the machine where it runs. **/ MS2_PUBLIC unsigned int ms_factory_get_cpu_count(MSFactory *obj); /** * Set the number of available cpus for processing. **/ MS2_PUBLIC void ms_factory_set_cpu_count(MSFactory *obj, unsigned int c); MS2_PUBLIC void ms_factory_add_platform_tag(MSFactory *obj, const char *tag); MS2_PUBLIC MSList * ms_factory_get_platform_tags(MSFactory *obj); MS2_PUBLIC char * ms_factory_get_platform_tags_as_string(MSFactory *obj); MS2_PUBLIC struct _MSVideoPresetsManager * ms_factory_get_video_presets_manager(MSFactory *factory); MS2_PUBLIC void ms_factory_init_plugins(MSFactory *obj); /** * Set directory where plugins are to be loaded. **/ MS2_PUBLIC void ms_factory_set_plugins_dir(MSFactory *obj, const char *path); /** * Allows to load plugins from a list that contains their names instead of listing files from a directory. **/ MS2_PUBLIC int ms_factory_load_plugins_from_list(MSFactory *factory, const bctbx_list_t *plugins_list, const char *optionnal_plugins_path); /** * Loads files in parameter directory matching template libms.PLUGIN_EXT. **/ MS2_PUBLIC int ms_factory_load_plugins(MSFactory *factory, const char *dir); MS2_PUBLIC void ms_factory_uninit_plugins(MSFactory *obj); /** * Init VOIP features (registration of codecs, sound card and webcam managers). **/ MS2_PUBLIC void ms_factory_init_voip(MSFactory *obj); MS2_PUBLIC void ms_factory_uninit_voip(MSFactory *obj); /** * Creates an event queue. * Only one can exist so if it has already been created the same one will be returned. * @param[in] obj MSFactory object. * @return The created event queue. */ MS2_PUBLIC struct _MSEventQueue * ms_factory_create_event_queue(MSFactory *obj); MS2_PUBLIC void ms_factory_destroy_event_queue(MSFactory *obj); /** * Gets the event queue associated with the factory. * Can be NULL if no event queue has been created. * @param[in] obj MSFactory object. * @return The event queue associated with the factory. */ MS2_PUBLIC struct _MSEventQueue * ms_factory_get_event_queue(MSFactory *obj); MS2_PUBLIC void ms_factory_set_event_queue(MSFactory *obj,struct _MSEventQueue *q); MS2_PUBLIC int ms_factory_get_payload_max_size(const MSFactory *factory); MS2_PUBLIC void ms_factory_set_payload_max_size(MSFactory *obj, int size); MS2_PUBLIC void ms_factory_set_mtu(MSFactory *obj, int mtu); MS2_PUBLIC int ms_factory_get_mtu(const MSFactory *obj); /** * Set the name of the echo canceller filter to use. * @param[in] obj MSFactory object * @param[in] filtername The name of the echo canceller filter to use */ MS2_PUBLIC void ms_factory_set_echo_canceller_filter_name(MSFactory *obj, const char *filtername); /** * Get the name of the echo canceller filter being used. * @param[in] obj MSFactory object * @return The name of the echo canceller filter being used */ MS2_PUBLIC const char * ms_factory_get_echo_canceller_filter_name(const MSFactory *obj); MS2_PUBLIC const struct _MSFmtDescriptor * ms_factory_get_audio_format(MSFactory *obj, const char *mime, int rate, int channels, const char *fmtp); MS2_PUBLIC const struct _MSFmtDescriptor * ms_factory_get_video_format(MSFactory *obj, const char *mime, MSVideoSize size, float fps, const char *fmtp); MS2_PUBLIC const MSFmtDescriptor *ms_factory_get_format(MSFactory *obj, const MSFmtDescriptor *ref); /** * Specifies if a filter is enabled or not. Only enabled filter are return by functions like ms_filter_get_encoder * @param factory * @param name A name for the filter. * @param enable, true/false * @return 0 in case of success * */ MS2_PUBLIC int ms_factory_enable_filter_from_name(MSFactory *factory, const char *name, bool_t enable); /** * Specifies if a filter is enabled or not. Only enabled filter are return by functions like ms_filter_get_encoder * * @param factory * @param name A name for the filter. * @return true/false if enabled * */ MS2_PUBLIC bool_t ms_factory_filter_from_name_enabled(const MSFactory *factory, const char *name); #ifndef MS_OFFER_ANSWER_CONTEXT_DEFINED #define MS_OFFER_ANSWER_CONTEXT_DEFINED typedef struct _MSOfferAnswerContext MSOfferAnswerContext; #endif typedef struct _MSOfferAnswerProvider MSOfferAnswerProvider; /** * Registers an offer-answer provider. An offer answer provider is a kind of factory that creates * context objects able to execute the particular offer/answer logic for a given codec. * Indeed, several codecs have complex parameter handling specified in their RFC, and hence cannot be * treated in a generic way by the global SDP offer answer logic. * Mediastreamer2 plugins can then register with this method their offer/answer logic together with the encoder * and decoder filters, so that it can be used by the signaling layer of the application. * @param factory * @param offer_answer_prov the offer answer provider descriptor. **/ MS2_PUBLIC void ms_factory_register_offer_answer_provider(MSFactory *f, MSOfferAnswerProvider *offer_answer_prov); /** * Retrieve an offer answer provider previously registered, giving the codec name. * @param f the factory * @param mime_type the codec mime type. * @return an MSOfferAnswerProvider or NULL if none was registered for this codec. **/ MS2_PUBLIC MSOfferAnswerProvider * ms_factory_get_offer_answer_provider(MSFactory *f, const char *mime_type); /** * Directly creates an offer-answer context giving the codec mime-type. * @param f the factory * @param the mime-type of the codec. * @return an MSOfferAnswerContext or NULL if none was registered for this codec. **/ MS2_PUBLIC MSOfferAnswerContext * ms_factory_create_offer_answer_context(MSFactory *f, const char *mime_type); MS2_PUBLIC MSDevicesInfo* ms_factory_get_devices_info(MSFactory *f); /** * Get the path where the image resources (mainly the nowebcam image) are located. * @param[in] f MSFactory object * @return The path where the image resources are located */ MS2_PUBLIC const char * ms_factory_get_image_resources_dir(const MSFactory *f); /** * Set the path where the image resources are located * @param[in] f MSFactory object * @param[in] path The path where the image resources are located */ MS2_PUBLIC void ms_factory_set_image_resources_dir(MSFactory *f, const char *path); MS2_PUBLIC void ms_factory_set_expected_bandwidth(MSFactory *f, int bitrate); MS2_PUBLIC int ms_factory_get_expected_bandwidth(MSFactory *f); /** * Get the name of the default video renderer for the current platform. * @param[in] f MSFactory object * @return The name of the video filter choosen as default renderer */ MS2_PUBLIC const char *ms_factory_get_default_video_renderer(MSFactory *f); #ifdef __cplusplus } #endif #endif