#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
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");
}
}
+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)
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);
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);
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);
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);
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");
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);
__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);
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;