webrtc_ini: Add support for values per each media source 67/246967/5
authorSangchul Lee <sc11.lee@samsung.com>
Thu, 5 Nov 2020 10:51:13 +0000 (19:51 +0900)
committerSangchul Lee <sc11.lee@samsung.com>
Tue, 10 Nov 2020 00:32:12 +0000 (09:32 +0900)
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 <sc11.lee@samsung.com>
include/webrtc_private.h
packaging/capi-media-webrtc.spec
src/webrtc_ini.c

index 14acd5bb1dbb6b8ec4f4bef56cda9f27b31cc48d..99d37997371a3bfbb1f9c47cac20685a57ef212e 100644 (file)
@@ -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 {
index c239900a1adcdb34aae2504a2f04b911d0f6db85..16f67c5704de16580dfe1c8f1792b793b8d115e5 100644 (file)
@@ -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
index 14e91f15bc5b36b76ef305498836cbc6d3e5a1ad..0a00db627f4c7dd2739e765469f20749f5d68b35 100644 (file)
 #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"
 #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;