const char *v_sink_element;
const char *v_hw_handoff_sink_element;
const char *evas_native_surface_tbm_format;
- const char *v_hw_sink_element_configuration;
- const char *v_hw_handoff_sink_element_configuration;
- const char *v_hw_decoder_element_configuration;
+ GStrv v_hw_sink_element_properties;
+ GStrv v_hw_handoff_sink_element_properties;
+ GStrv v_hw_decoder_element_properties;
GStrv a_hw_decoder_elements;
GStrv v_hw_decoder_elements;
bool v_overlay_resource_required;
int _gst_build_pipeline(webrtc_s *webrtc);
void _gst_destroy_pipeline(webrtc_s *webrtc);
int _gst_pipeline_set_state(webrtc_s *webrtc, GstState state);
+void _gst_set_element_properties(GstElement *element, GStrv key_value_pairs);
gchar *_append_num_to_string(const char *str, int i);
GstElement *_create_element(const char *factory_name, const char *name);
GstCaps *_make_video_raw_caps_with_resolution(webrtc_gst_slot_s *source, webrtc_ini_s *ini, int width, int height);
void _release_request_pad(webrtc_gst_slot_s *source);
bool _set_default_video_info(webrtc_gst_slot_s *source, const ini_item_media_source_s *ini_source);
-void _gst_set_element_properties(GstElement *element, GStrv key_value_pairs);
GstCaps *_gst_set_caps_additional_fields(GstCaps *caps, GStrv key_value_pairs);
#endif /* __TIZEN_MEDIA_WEBRTC_SOURCE_COMMON_H__ */
Name: capi-media-webrtc
Summary: A WebRTC library in Tizen Native API
-Version: 1.1.40
+Version: 1.1.41
Release: 0
Group: Multimedia/API
License: Apache-2.0
#define INI_ITEM_AUDIO_SINK_ELEMENT "audio sink element"
#define INI_ITEM_VIDEO_SINK_ELEMENT "video sink element"
#define INI_ITEM_VIDEO_HW_HANDOFF_SINK_ELEMENT "video hw handoff sink element"
-#define INI_ITEM_VIDEO_HW_SINK_ELEMENT_CONFIGURATION "video hw sink element configuration"
-#define INI_ITEM_VIDEO_HW_HANDOFF_SINK_ELEMENT_CONFIGURATION "video hw handoff sink element configuration"
-#define INI_ITEM_VIDEO_HW_DECODER_ELEMENT_CONFIGURATION "video hw decoder element configuration"
+#define INI_ITEM_VIDEO_HW_SINK_ELEMENT_PROPERTIES "video hw sink element properties"
+#define INI_ITEM_VIDEO_HW_HANDOFF_SINK_ELEMENT_PROPERTIES "video hw handoff sink element properties"
+#define INI_ITEM_VIDEO_HW_DECODER_ELEMENT_PROPERTIES "video hw decoder element properties"
#define INI_ITEM_AUDIO_HW_DECODER_ELEMENTS "audio hw decoder elements"
#define INI_ITEM_VIDEO_HW_DECODER_ELEMENTS "video hw decoder elements"
#define INI_ITEM_EVAS_NATIVE_SURFACE_TBM_FORMAT "evas native surface tbm format"
__dump_item(INI_ITEM_AUDIO_SINK_ELEMENT, INI_ITEM_TYPE_STRING, (void *)ini->rendering_sink.a_sink_element);
__dump_item(INI_ITEM_VIDEO_SINK_ELEMENT, INI_ITEM_TYPE_STRING, (void *)ini->rendering_sink.v_sink_element);
__dump_item(INI_ITEM_VIDEO_HW_HANDOFF_SINK_ELEMENT, INI_ITEM_TYPE_STRING, (void *)ini->rendering_sink.v_hw_handoff_sink_element);
- __dump_item(INI_ITEM_VIDEO_HW_SINK_ELEMENT_CONFIGURATION, INI_ITEM_TYPE_STRING, (void *)ini->rendering_sink.v_hw_sink_element_configuration);
- __dump_item(INI_ITEM_VIDEO_HW_HANDOFF_SINK_ELEMENT_CONFIGURATION, INI_ITEM_TYPE_STRING, (void *)ini->rendering_sink.v_hw_handoff_sink_element_configuration);
- __dump_item(INI_ITEM_VIDEO_HW_DECODER_ELEMENT_CONFIGURATION, INI_ITEM_TYPE_STRING, (void *)ini->rendering_sink.v_hw_decoder_element_configuration);
+ __dump_item(INI_ITEM_VIDEO_HW_SINK_ELEMENT_PROPERTIES, INI_ITEM_TYPE_STRINGS, (void *)ini->rendering_sink.v_hw_sink_element_properties);
+ __dump_item(INI_ITEM_VIDEO_HW_HANDOFF_SINK_ELEMENT_PROPERTIES, INI_ITEM_TYPE_STRINGS, (void *)ini->rendering_sink.v_hw_handoff_sink_element_properties);
+ __dump_item(INI_ITEM_VIDEO_HW_DECODER_ELEMENT_PROPERTIES, INI_ITEM_TYPE_STRINGS, (void *)ini->rendering_sink.v_hw_decoder_element_properties);
__dump_item(INI_ITEM_AUDIO_HW_DECODER_ELEMENTS, INI_ITEM_TYPE_STRINGS, ini->rendering_sink.a_hw_decoder_elements);
__dump_item(INI_ITEM_VIDEO_HW_DECODER_ELEMENTS, INI_ITEM_TYPE_STRINGS, ini->rendering_sink.v_hw_decoder_elements);
__dump_item(INI_ITEM_EVAS_NATIVE_SURFACE_TBM_FORMAT, INI_ITEM_TYPE_STRING, (void *)ini->rendering_sink.evas_native_surface_tbm_format);
ini->rendering_sink.a_sink_element = __ini_get_string(ini->dict, INI_CATEGORY_RENDERING_SINK, INI_ITEM_AUDIO_SINK_ELEMENT, DEFAULT_AUDIO_SINK_ELEMENT);
ini->rendering_sink.v_sink_element = __ini_get_string(ini->dict, INI_CATEGORY_RENDERING_SINK, INI_ITEM_VIDEO_SINK_ELEMENT, DEFAULT_VIDEO_SINK_ELEMENT);
ini->rendering_sink.v_hw_handoff_sink_element = __ini_get_string(ini->dict, INI_CATEGORY_RENDERING_SINK, INI_ITEM_VIDEO_HW_HANDOFF_SINK_ELEMENT, DEFAULT_ELEMENT_FAKESINK);
- ini->rendering_sink.v_hw_sink_element_configuration = __ini_get_string(ini->dict, INI_CATEGORY_RENDERING_SINK, INI_ITEM_VIDEO_HW_SINK_ELEMENT_CONFIGURATION, NULL);
- ini->rendering_sink.v_hw_handoff_sink_element_configuration = __ini_get_string(ini->dict, INI_CATEGORY_RENDERING_SINK, INI_ITEM_VIDEO_HW_HANDOFF_SINK_ELEMENT_CONFIGURATION, NULL);
- ini->rendering_sink.v_hw_decoder_element_configuration = __ini_get_string(ini->dict, INI_CATEGORY_RENDERING_SINK, INI_ITEM_VIDEO_HW_DECODER_ELEMENT_CONFIGURATION, NULL);
+ __ini_read_list(ini->dict, INI_CATEGORY_RENDERING_SINK, INI_ITEM_VIDEO_HW_SINK_ELEMENT_PROPERTIES, &ini->rendering_sink.v_hw_sink_element_properties, NULL);
+ __ini_read_list(ini->dict, INI_CATEGORY_RENDERING_SINK, INI_ITEM_VIDEO_HW_HANDOFF_SINK_ELEMENT_PROPERTIES, &ini->rendering_sink.v_hw_handoff_sink_element_properties, NULL);
+ __ini_read_list(ini->dict, INI_CATEGORY_RENDERING_SINK, INI_ITEM_VIDEO_HW_DECODER_ELEMENT_PROPERTIES, &ini->rendering_sink.v_hw_decoder_element_properties, NULL);
__ini_read_list(ini->dict, INI_CATEGORY_RENDERING_SINK, INI_ITEM_AUDIO_HW_DECODER_ELEMENTS, &ini->rendering_sink.a_hw_decoder_elements, NULL);
__ini_read_list(ini->dict, INI_CATEGORY_RENDERING_SINK, INI_ITEM_VIDEO_HW_DECODER_ELEMENTS, &ini->rendering_sink.v_hw_decoder_elements, NULL);
ini->rendering_sink.evas_native_surface_tbm_format = __ini_get_string(ini->dict, INI_CATEGORY_RENDERING_SINK, INI_ITEM_EVAS_NATIVE_SURFACE_TBM_FORMAT, DEFAULT_VIDEO_RAW_FORMAT);
RET_IF(webrtc == NULL, "webrtc is NULL");
RET_IF(webrtc->ini.dict == NULL, "ini.dict is NULL");
+ g_strfreev(webrtc->ini.rendering_sink.v_hw_sink_element_properties);
+ webrtc->ini.rendering_sink.v_hw_sink_element_properties = NULL;
+
+ g_strfreev(webrtc->ini.rendering_sink.v_hw_handoff_sink_element_properties);
+ webrtc->ini.rendering_sink.v_hw_handoff_sink_element_properties = NULL;
+
+ g_strfreev(webrtc->ini.rendering_sink.v_hw_decoder_element_properties);
+ webrtc->ini.rendering_sink.v_hw_decoder_element_properties = NULL;
+
g_strfreev(webrtc->ini.rendering_sink.a_hw_decoder_elements);
webrtc->ini.rendering_sink.a_hw_decoder_elements = NULL;
return WEBRTC_ERROR_NONE;
}
+void _gst_set_element_properties(GstElement *element, GStrv key_value_pairs)
+{
+ GStrv key_value_pair;
+ GParamSpec *param_spec;
+
+ RET_IF(element == NULL, "element is NULL");
+
+ if (!key_value_pairs)
+ return;
+
+ while (key_value_pairs && *key_value_pairs) {
+ key_value_pair = g_strsplit(*key_value_pairs++, "=", 2);
+
+ if (!g_strcmp0(key_value_pair[0], "") || !g_strcmp0(key_value_pair[1], "")) {
+ LOG_ERROR("invalid key_value_pair, key[%s], value[%s]", key_value_pair[0], key_value_pair[1]);
+ g_strfreev(key_value_pair);
+ continue;
+ }
+
+ if (!(param_spec = g_object_class_find_property(G_OBJECT_GET_CLASS(G_OBJECT(element)), g_strstrip(key_value_pair[0])))) {
+ LOG_ERROR("element[%s] does not have this property[%s]", GST_ELEMENT_NAME(element), key_value_pair[0]);
+ g_strfreev(key_value_pair);
+ continue;
+ }
+
+ gst_util_set_object_arg(G_OBJECT(element), key_value_pair[0], key_value_pair[1]);
+ LOG_DEBUG("element[%s] property[%s] value[%s]", GST_ELEMENT_NAME(element), key_value_pair[0], key_value_pair[1]);
+
+ g_strfreev(key_value_pair);
+ }
+}
+
bool _sync_elements_state_with_parent(GList *element_list)
{
GList *list;
return sink;
}
-/* Set an element properties described by string "name1=value1 name2=value2 ..." */
-static void
-__parse_and_set_property(GstElement *element, const gchar *parameters)
-{
- if (!parameters)
- return;
-
- LOGD("Parsing configuration: '%s'", parameters);
- gchar **tokens = g_strsplit_set(parameters, "= ", -1);
- gchar *name = NULL;
- for (int i = 0, j = 0; tokens[i] != NULL; i++) {
- if (tokens[i][0] == '\0') {
- } else if (++j % 2) {
- name = tokens[i];
- } else {
- LOGD("Sets '%s'='%s'", name, tokens[i]);
- gst_util_set_object_arg (G_OBJECT(element), name, tokens[i]);
- }
- }
- g_strfreev(tokens);
-}
-
static const char *__get_videosink_factory_name(webrtc_display_s *display, webrtc_ini_s *ini)
{
const char *factory_name;
NULL);
if (sink->display->zerocopy)
- __parse_and_set_property(videosink, sink->webrtc->ini.rendering_sink.v_hw_sink_element_configuration);
+ _gst_set_element_properties(videosink, sink->webrtc->ini.rendering_sink.v_hw_sink_element_properties);
/* FIXME: The order of setting property and display is important when 'use-tbm' is true. The reverse does not work */
gst_video_overlay_set_wl_window_wl_surface_id(GST_VIDEO_OVERLAY(videosink), sink->display->overlay_surface_id);
g_object_set(G_OBJECT(capsfilter), "caps", caps, NULL);
gst_caps_unref(caps);
} else {
- __parse_and_set_property(videosink, sink->webrtc->ini.rendering_sink.v_hw_handoff_sink_element_configuration);
+ _gst_set_element_properties(videosink, sink->webrtc->ini.rendering_sink.v_hw_handoff_sink_element_properties);
}
}
g_object_set(G_OBJECT(element), "config-interval", 1, NULL);
_add_probe_to_pad_for_dump(sink, element, _depayloaded_data_probe_cb);
} else if (g_strv_contains((const gchar * const *)sink->webrtc->ini.rendering_sink.v_hw_decoder_elements, factory_name)) {
- __parse_and_set_property(element, sink->webrtc->ini.rendering_sink.v_hw_decoder_element_configuration);
+ _gst_set_element_properties(element, sink->webrtc->ini.rendering_sink.v_hw_decoder_element_properties);
}
/* all other depayloaders except h264 */
}
//LCOV_EXCL_START
-static void __parse_type_and_set_value(GType type, GstElement *element, GStrv key_value_pair)
-{
- RET_IF(element == NULL, "element is NULL");
- RET_IF(key_value_pair == NULL, "key_value_pairs is NULL");
- RET_IF(key_value_pair[0] == NULL, "key is NULL");
- RET_IF(key_value_pair[1] == NULL, "value is NULL");
-
- switch (type) {
- case G_TYPE_STRING:
- g_object_set(G_OBJECT(element), key_value_pair[0], key_value_pair[1], NULL);
- break;
- case G_TYPE_INT:
- case G_TYPE_INT64:
- case G_TYPE_ENUM: {
- gint64 value = g_ascii_strtoll((const gchar *)key_value_pair[1], NULL, 10);
- g_object_set(G_OBJECT(element), key_value_pair[0], value, NULL);
- break;
- }
- case G_TYPE_UINT:
- case G_TYPE_UINT64:
- case G_TYPE_BOOLEAN: {
- guint64 value = g_ascii_strtoll((const gchar *)key_value_pair[1], NULL, 10);
- g_object_set(G_OBJECT(element), key_value_pair[0], value, NULL);
- break;
- }
- case G_TYPE_FLOAT:
- case G_TYPE_DOUBLE: {
- gdouble value = g_ascii_strtod((const gchar *)key_value_pair[1], NULL);
- g_object_set(G_OBJECT(element), key_value_pair[0], value, NULL);
- break;
- }
- default:
- LOG_DEBUG("not supported type(0x%x) exactly, but try it with int64 type", (unsigned int)type); /* e.g.) custom enum type falls through here */
- gint64 value = g_ascii_strtoll((const gchar *)key_value_pair[1], NULL, 10);
- g_object_set(G_OBJECT(element), key_value_pair[0], value, NULL);
- break;
- }
-
- LOG_DEBUG("element[%s] property[%s] value[type:0x%x, %s]", GST_ELEMENT_NAME(element), key_value_pair[0], (unsigned int)type, key_value_pair[1]);
-}
-
-void _gst_set_element_properties(GstElement *element, GStrv key_value_pairs)
-{
- GStrv key_value_pair;
- GParamSpec *param_spec;
-
- RET_IF(element == NULL, "element is NULL");
-
- if (!key_value_pairs)
- return;
-
- while (key_value_pairs && *key_value_pairs) {
- key_value_pair = g_strsplit(*key_value_pairs++, "=", 2);
-
- if (!g_strcmp0(key_value_pair[0], "") || !g_strcmp0(key_value_pair[1], "")) {
- LOG_ERROR("invalid key_value_pair, key[%s], value[%s]", key_value_pair[0], key_value_pair[1]);
- g_strfreev(key_value_pair);
- continue;
- }
-
- if (!(param_spec = g_object_class_find_property(G_OBJECT_GET_CLASS(G_OBJECT(element)), g_strstrip(key_value_pair[0])))) {
- LOG_ERROR("element[%s] does not have this property[%s]", GST_ELEMENT_NAME(element), key_value_pair[0]);
- g_strfreev(key_value_pair);
- continue;
- }
-
- __parse_type_and_set_value(param_spec->value_type, element, key_value_pair);
-
- g_strfreev(key_value_pair);
- }
-}
-
GstCaps *_gst_set_caps_additional_fields(GstCaps *caps, GStrv key_value_pairs)
{
GStrv key_value_pair;