From: Sangchul Lee Date: Thu, 5 Nov 2020 10:51:13 +0000 (+0900) Subject: webrtc_ini: Add support for values per each media source X-Git-Tag: submit/tizen/20210729.023123~192 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=36f4fa6534bdbc9ec0db7345e7ee63abd9b6d7eb;p=platform%2Fcore%2Fapi%2Fwebrtc.git webrtc_ini: Add support for values per each media source Values of each media source can be set in ini configuration file. These values will overwrite same things of [media source] default values. Items for audio/video hw encoder element are also added. [Version] 0.1.50 [Issue Type] Improvement Change-Id: I41bfbe4f7d24d4b0dc09660c1b349cfc933ad827 Signed-off-by: Sangchul Lee --- diff --git a/include/webrtc_private.h b/include/webrtc_private.h index 14acd5bb..99d37997 100644 --- a/include/webrtc_private.h +++ b/include/webrtc_private.h @@ -169,17 +169,20 @@ typedef struct _ini_item_media_source_s { int v_height; int v_framerate; const char *v_codec; + const char *v_hw_encoder_element; /* audio source pipeline */ const char *a_raw_format; int a_samplerate; int a_channels; const char *a_codec; + const char *a_hw_encoder_element; } ini_item_media_source_s; typedef struct _webrtc_ini_s { dictionary *dict; ini_item_general_s general; ini_item_media_source_s media_source; + GHashTable *sources; } webrtc_ini_s; typedef struct _webrtc_gst_slot_s { diff --git a/packaging/capi-media-webrtc.spec b/packaging/capi-media-webrtc.spec index c239900a..16f67c57 100644 --- a/packaging/capi-media-webrtc.spec +++ b/packaging/capi-media-webrtc.spec @@ -1,6 +1,6 @@ Name: capi-media-webrtc Summary: A WebRTC library in Tizen Native API -Version: 0.1.49 +Version: 0.1.50 Release: 0 Group: Multimedia/API License: Apache-2.0 diff --git a/src/webrtc_ini.c b/src/webrtc_ini.c index 14e91f15..0a00db62 100644 --- a/src/webrtc_ini.c +++ b/src/webrtc_ini.c @@ -22,8 +22,12 @@ #define DEFAULT_DOT_PATH "/tmp" /* categories */ -#define INI_CATEGORY_GENERAL "general:" -#define INI_CATEGORY_MEDIA_SOURCE "media source:" +#define INI_CATEGORY_GENERAL "general" +#define INI_CATEGORY_MEDIA_SOURCE "media source" +#define INI_CATEGORY_SOURCE_CAMERA "source camera" +#define INI_CATEGORY_SOURCE_MIC "source mic" +#define INI_CATEGORY_SOURCE_AUDIOTEST "source audiotest" +#define INI_CATEGORY_SOURCE_VIDEOTEST "source videotest" /* items for general */ #define INI_ITEM_DOT_PATH "dot path" @@ -37,11 +41,12 @@ #define INI_ITEM_VIDEO_HEIGHT "video height" #define INI_ITEM_VIDEO_FRAMERATE "video framerate" #define INI_ITEM_VIDEO_CODEC "video codec" +#define INI_ITEM_VIDEO_HW_ENCODER_ELEMENT "video hw encoder element" #define INI_ITEM_AUDIO_RAW_FORMAT "audio raw format" #define INI_ITEM_AUDIO_SAMPLERATE "audio samplerate" #define INI_ITEM_AUDIO_CHANNELS "audio channels" #define INI_ITEM_AUDIO_CODEC "audio codec" -#define INI_ITEM_HW_ENCODER_ELEMENT "hw encoder element" +#define INI_ITEM_AUDIO_HW_ENCODER_ELEMENT "audio hw encoder element" #define DEFAULT_VIDEO_RAW_FORMAT "I420" #define DEFAULT_VIDEO_WIDTH 320 @@ -61,6 +66,26 @@ typedef enum { INI_ITEM_TYPE_STRINGS } ini_item_type_e; +typedef enum { + MEDIA_SOURCE_TYPE_CAMERA, + MEDIA_SOURCE_TYPE_MIC, + MEDIA_SOURCE_TYPE_AUDIOTEST, + MEDIA_SOURCE_TYPE_VIDEOTEST, + MEDIA_SOURCE_TYPE_MAX, +} media_source_type_e; + +typedef struct { + const char *name; +} ini_category_name_s; + +static ini_category_name_s category_source_names[] = { + [MEDIA_SOURCE_TYPE_CAMERA] = { INI_CATEGORY_SOURCE_CAMERA }, + [MEDIA_SOURCE_TYPE_MIC] = { INI_CATEGORY_SOURCE_MIC }, + [MEDIA_SOURCE_TYPE_AUDIOTEST] = { INI_CATEGORY_SOURCE_AUDIOTEST }, + [MEDIA_SOURCE_TYPE_VIDEOTEST] = { INI_CATEGORY_SOURCE_VIDEOTEST }, + [MEDIA_SOURCE_TYPE_MAX] = { NULL }, +}; + static void __dump_item(const char *prefix_str, ini_item_type_e type, void *item) { RET_IF(prefix_str == NULL, "prefix_str is NULL"); @@ -90,26 +115,46 @@ static void __dump_item(const char *prefix_str, ini_item_type_e type, void *item } } +static void __dump_items_of_source(ini_item_media_source_s *source) +{ + RET_IF(source == NULL, "source is NULL"); + + __dump_item(INI_ITEM_VIDEO_RAW_FORMAT, INI_ITEM_TYPE_STRING, (void *)source->v_raw_format); + __dump_item(INI_ITEM_VIDEO_WIDTH, INI_ITEM_TYPE_INT, &source->v_width); + __dump_item(INI_ITEM_VIDEO_HEIGHT, INI_ITEM_TYPE_INT, &source->v_height); + __dump_item(INI_ITEM_VIDEO_FRAMERATE, INI_ITEM_TYPE_INT, &source->v_framerate); + __dump_item(INI_ITEM_VIDEO_CODEC, INI_ITEM_TYPE_STRING, (void *)source->v_codec); + __dump_item(INI_ITEM_VIDEO_HW_ENCODER_ELEMENT, INI_ITEM_TYPE_STRING, (void *)source->v_hw_encoder_element); + __dump_item(INI_ITEM_AUDIO_RAW_FORMAT, INI_ITEM_TYPE_STRING, (void *)source->a_raw_format); + __dump_item(INI_ITEM_AUDIO_SAMPLERATE, INI_ITEM_TYPE_INT, &source->a_samplerate); + __dump_item(INI_ITEM_AUDIO_CHANNELS, INI_ITEM_TYPE_INT, &source->a_channels); + __dump_item(INI_ITEM_AUDIO_CODEC, INI_ITEM_TYPE_STRING, (void *)source->a_codec); + __dump_item(INI_ITEM_AUDIO_HW_ENCODER_ELEMENT, INI_ITEM_TYPE_STRING, (void *)source->a_hw_encoder_element); +} + static void __dump_ini(webrtc_ini_s *ini) { + int i = 0; + const char *category_name; + RET_IF(ini == NULL, "ini is NULL"); - LOG_INFO("%s", INI_CATEGORY_GENERAL); + LOG_INFO("[%s]", INI_CATEGORY_GENERAL); __dump_item(INI_ITEM_DOT_GENERATE, INI_ITEM_TYPE_BOOL, &ini->general.generate_dot); __dump_item(INI_ITEM_DOT_PATH, INI_ITEM_TYPE_STRING, (void *)ini->general.dot_path); __dump_item(INI_ITEM_GST_ARGS, INI_ITEM_TYPE_STRINGS, ini->general.gst_args); __dump_item(INI_ITEM_GST_EXCLUDED_ELEMENTS, INI_ITEM_TYPE_STRINGS, ini->general.gst_excluded_elements); - LOG_INFO("%s", INI_CATEGORY_MEDIA_SOURCE); - __dump_item(INI_ITEM_VIDEO_RAW_FORMAT, INI_ITEM_TYPE_STRING, (void *)ini->media_source.v_raw_format); - __dump_item(INI_ITEM_VIDEO_WIDTH, INI_ITEM_TYPE_INT, &ini->media_source.v_width); - __dump_item(INI_ITEM_VIDEO_HEIGHT, INI_ITEM_TYPE_INT, &ini->media_source.v_height); - __dump_item(INI_ITEM_VIDEO_FRAMERATE, INI_ITEM_TYPE_INT, &ini->media_source.v_framerate); - __dump_item(INI_ITEM_VIDEO_CODEC, INI_ITEM_TYPE_STRING, (void *)ini->media_source.v_codec); - __dump_item(INI_ITEM_AUDIO_RAW_FORMAT, INI_ITEM_TYPE_STRING, (void *)ini->media_source.a_raw_format); - __dump_item(INI_ITEM_AUDIO_SAMPLERATE, INI_ITEM_TYPE_INT, &ini->media_source.a_samplerate); - __dump_item(INI_ITEM_AUDIO_CHANNELS, INI_ITEM_TYPE_INT, &ini->media_source.a_channels); - __dump_item(INI_ITEM_AUDIO_CODEC, INI_ITEM_TYPE_STRING, (void *)ini->media_source.a_codec); + LOG_INFO("[%s]", INI_CATEGORY_MEDIA_SOURCE); + __dump_items_of_source(&ini->media_source); + + for (; (category_name = category_source_names[i].name) != NULL; i++) { + ini_item_media_source_s *source = g_hash_table_lookup(ini->sources, category_name); + if (source) { + LOG_INFO("[%s]", category_name); + __dump_items_of_source(source); + } + } } static const char* __get_delimiter(const char *ini_path) @@ -128,12 +173,14 @@ static void __ini_read_list(dictionary *dict, const char *category, const char * gchar *path; gchar *strtmp = NULL; - RET_IF(dict == NULL, "dict is NULL"); + if (dict == NULL) + return; + RET_IF(category == NULL, "category is NULL"); RET_IF(item == NULL, "item is NULL"); RET_IF(list == NULL, "list is NULL"); - path = g_strconcat(category, item, NULL); + path = g_strconcat(category, ":", item, NULL); str = iniparser_getstring(dict, path, NULL); if (str && strlen(str) > 0) { strtmp = g_strdup(str); @@ -152,11 +199,12 @@ static const char* __ini_get_string(dictionary *dict, const char *category, cons gchar *path; const char *ret_val; - RET_VAL_IF(dict == NULL, default_value, "dict is NULL"); + if (dict == NULL) + return default_value; RET_VAL_IF(category == NULL, default_value, "category is NULL"); RET_VAL_IF(item == NULL, default_value, "item is NULL"); - path = g_strconcat(category, item, NULL); + path = g_strconcat(category, ":", item, NULL); ret_val = iniparser_getstring(dict, path, default_value); g_free(path); @@ -169,11 +217,12 @@ static int __ini_get_int(dictionary *dict, const char *category, const char *ite gchar *path; int ret_val; - RET_VAL_IF(dict == NULL, default_value, "dict is NULL"); + if (dict == NULL) + return default_value; RET_VAL_IF(category == NULL, default_value, "category is NULL"); RET_VAL_IF(item == NULL, default_value, "item is NULL"); - path = g_strconcat(category, item, NULL); + path = g_strconcat(category, ":", item, NULL); ret_val = iniparser_getint(dict, path, default_value); g_free(path); @@ -186,11 +235,12 @@ static bool __ini_get_boolean(dictionary *dict, const char *category, const char gchar *path; bool ret_val; - RET_VAL_IF(dict == NULL, default_value, "dict is NULL"); + if (dict == NULL) + return default_value; RET_VAL_IF(category == NULL, default_value, "category is NULL"); RET_VAL_IF(item == NULL, default_value, "item is NULL"); - path = g_strconcat(category, item, NULL); + path = g_strconcat(category, ":", item, NULL); ret_val = (bool)iniparser_getboolean(dict, path, default_value); g_free(path); @@ -198,9 +248,55 @@ static bool __ini_get_boolean(dictionary *dict, const char *category, const char return ret_val; } +static void __ini_source_destroy_cb(gpointer data) +{ + ini_item_media_source_s *source = (ini_item_media_source_s *)data; + + RET_IF(source == NULL, "source is NULL"); + + g_free(source); +} + +static void __apply_media_source_setting(webrtc_ini_s *ini, ini_item_media_source_s *source, const char *category) +{ + bool is_default = false; + + RET_IF(ini == NULL, "ini is NULL"); + RET_IF(source == NULL, "source is NULL"); + RET_IF(category == NULL, "category is NULL"); + + if (g_strcmp0(category, INI_CATEGORY_MEDIA_SOURCE) == 0) + is_default = true; + + source->v_raw_format = __ini_get_string(ini->dict, category, INI_ITEM_VIDEO_RAW_FORMAT, + is_default ? DEFAULT_VIDEO_RAW_FORMAT : ini->media_source.v_raw_format); + source->v_width = __ini_get_int(ini->dict, category, INI_ITEM_VIDEO_WIDTH, + is_default ? DEFAULT_VIDEO_WIDTH : ini->media_source.v_width); + source->v_height = __ini_get_int(ini->dict, category, INI_ITEM_VIDEO_HEIGHT, + is_default? DEFAULT_VIDEO_HEIGHT : ini->media_source.v_height); + source->v_framerate = __ini_get_int(ini->dict, category, INI_ITEM_VIDEO_FRAMERATE, + is_default ? DEFAULT_VIDEO_FRAMERATE : ini->media_source.v_framerate); + source->v_codec = __ini_get_string(ini->dict, category, INI_ITEM_VIDEO_CODEC, + is_default ? DEFAULT_VIDEO_CODEC : ini->media_source.v_codec); + source->v_hw_encoder_element = __ini_get_string(ini->dict, category, INI_ITEM_VIDEO_HW_ENCODER_ELEMENT, + is_default ? NULL : ini->media_source.v_hw_encoder_element); + source->a_raw_format = __ini_get_string(ini->dict, category, INI_ITEM_AUDIO_RAW_FORMAT, + is_default ? DEFAULT_AUDIO_RAW_FORMAT : ini->media_source.a_raw_format); + source->a_samplerate = __ini_get_int(ini->dict, category, INI_ITEM_AUDIO_SAMPLERATE, + is_default ? DEFAULT_AUDIO_SAMPLERATE : ini->media_source.a_samplerate); + source->a_channels = __ini_get_int(ini->dict, category, INI_ITEM_AUDIO_CHANNELS, + is_default ? DEFAULT_AUDIO_CHANNELS : ini->media_source.a_channels); + source->a_codec = __ini_get_string(ini->dict, category, INI_ITEM_AUDIO_CODEC, + is_default ? DEFAULT_AUDIO_CODEC : ini->media_source.a_codec); + source->a_hw_encoder_element = __ini_get_string(ini->dict, category, INI_ITEM_AUDIO_HW_ENCODER_ELEMENT, + is_default ? NULL : ini->media_source.a_hw_encoder_element); +} + int _load_ini(webrtc_s *webrtc) { webrtc_ini_s *ini; + const char *category_name; + int i = 0; RET_VAL_IF(webrtc == NULL, WEBRTC_ERROR_INVALID_PARAMETER, "webrtc is NULL"); @@ -211,6 +307,8 @@ int _load_ini(webrtc_s *webrtc) if (!ini->dict) LOG_WARNING("could not open ini[%s], use default values", WEBRTC_INI_PATH); + ini->sources = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, __ini_source_destroy_cb); + /* general */ ini->general.generate_dot = __ini_get_boolean(ini->dict, INI_CATEGORY_GENERAL, INI_ITEM_DOT_GENERATE, DEFAULT_GENERATE_DOT); ini->general.dot_path = __ini_get_string(ini->dict, INI_CATEGORY_GENERAL, INI_ITEM_DOT_PATH, DEFAULT_DOT_PATH); @@ -222,17 +320,19 @@ int _load_ini(webrtc_s *webrtc) __ini_read_list(ini->dict, INI_CATEGORY_GENERAL, INI_ITEM_GST_EXCLUDED_ELEMENTS, &ini->general.gst_excluded_elements); /* default setting for a media source */ - ini->media_source.v_raw_format = __ini_get_string(ini->dict, INI_CATEGORY_MEDIA_SOURCE, INI_ITEM_VIDEO_RAW_FORMAT, DEFAULT_VIDEO_RAW_FORMAT); - ini->media_source.v_width = __ini_get_int(ini->dict, INI_CATEGORY_MEDIA_SOURCE, INI_ITEM_VIDEO_WIDTH, DEFAULT_VIDEO_WIDTH); - ini->media_source.v_height = __ini_get_int(ini->dict, INI_CATEGORY_MEDIA_SOURCE, INI_ITEM_VIDEO_HEIGHT, DEFAULT_VIDEO_HEIGHT); - ini->media_source.v_framerate = __ini_get_int(ini->dict, INI_CATEGORY_MEDIA_SOURCE, INI_ITEM_VIDEO_FRAMERATE, DEFAULT_VIDEO_FRAMERATE); - ini->media_source.v_codec = __ini_get_string(ini->dict, INI_CATEGORY_MEDIA_SOURCE, INI_ITEM_VIDEO_CODEC, DEFAULT_VIDEO_CODEC); - ini->media_source.a_raw_format = __ini_get_string(ini->dict, INI_CATEGORY_MEDIA_SOURCE, INI_ITEM_AUDIO_RAW_FORMAT, DEFAULT_AUDIO_RAW_FORMAT); - ini->media_source.a_samplerate = __ini_get_int(ini->dict, INI_CATEGORY_MEDIA_SOURCE, INI_ITEM_AUDIO_SAMPLERATE, DEFAULT_AUDIO_SAMPLERATE); - ini->media_source.a_channels = __ini_get_int(ini->dict, INI_CATEGORY_MEDIA_SOURCE, INI_ITEM_AUDIO_CHANNELS, DEFAULT_AUDIO_CHANNELS); - ini->media_source.a_codec = __ini_get_string(ini->dict, INI_CATEGORY_MEDIA_SOURCE, INI_ITEM_AUDIO_CODEC, DEFAULT_AUDIO_CODEC); - - /* TODO: it overrides default variables above */ + __apply_media_source_setting(ini, &ini->media_source, INI_CATEGORY_MEDIA_SOURCE); + + /* it overrides the default values above */ + for (; (category_name = category_source_names[i].name) != NULL; i++) { + if (iniparser_getsecnkeys(ini->dict, category_name) > 0) { + ini_item_media_source_s *source = g_new0(ini_item_media_source_s, 1); + __apply_media_source_setting(ini, source, category_name); + if (!g_hash_table_insert(ini->sources, g_strdup(category_name), (gpointer)source)) { + LOG_WARNING("[%s] already exist", category_name); + continue; + } + } + } __dump_ini(ini); @@ -244,6 +344,9 @@ void _unload_ini(webrtc_s *webrtc) RET_IF(webrtc == NULL, "webrtc is NULL"); RET_IF(webrtc->ini.dict == NULL, "ini.dict is NULL"); + g_hash_table_destroy(webrtc->ini.sources); + webrtc->ini.sources = NULL; + g_strfreev(webrtc->ini.general.gst_args); webrtc->ini.general.gst_args = NULL;