From: Sangchul Lee Date: Fri, 8 Nov 2024 09:40:10 +0000 (+0900) Subject: Improve codes regarding setting element properties from ini X-Git-Tag: accepted/tizen/unified/20241113.151924~2 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=c20a9969a12992bff70fea46e4df6efa6d10e4c0;p=platform%2Fcore%2Fapi%2Fwebrtc.git Improve codes regarding setting element properties from ini Some have been changed to comply with the previous style of saving key value pair from ini. [Version] 1.1.41 [Issue Type] Improvement Change-Id: I3394c556d5e493237e7888c2b4cf625e57091c8e Signed-off-by: Sangchul Lee --- diff --git a/include/webrtc_private.h b/include/webrtc_private.h index a966f0b1..4ae96694 100644 --- a/include/webrtc_private.h +++ b/include/webrtc_private.h @@ -399,9 +399,9 @@ typedef struct _ini_item_rendering_sink_s { 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; @@ -965,6 +965,7 @@ void _remove_probe_from_pad_for_render(webrtc_gst_slot_s *source, unsigned int i 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); diff --git a/include/webrtc_source_private.h b/include/webrtc_source_private.h index 5f424ae9..513f1639 100644 --- a/include/webrtc_source_private.h +++ b/include/webrtc_source_private.h @@ -107,7 +107,6 @@ void _set_video_src_origin_resolution(webrtc_gst_slot_s *source, int width, int 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__ */ diff --git a/packaging/capi-media-webrtc.spec b/packaging/capi-media-webrtc.spec index 5c2cb735..7c55393f 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: 1.1.40 +Version: 1.1.41 Release: 0 Group: Multimedia/API License: Apache-2.0 diff --git a/src/webrtc_ini.c b/src/webrtc_ini.c index 42646d4e..22407af1 100644 --- a/src/webrtc_ini.c +++ b/src/webrtc_ini.c @@ -107,9 +107,9 @@ #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" @@ -265,9 +265,9 @@ static void __dump_ini(webrtc_ini_s *ini) __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); @@ -553,9 +553,9 @@ void _load_ini(webrtc_s *webrtc) 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); @@ -781,6 +781,15 @@ void _unload_ini(webrtc_s *webrtc) 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; diff --git a/src/webrtc_private.c b/src/webrtc_private.c index 9e4cad7c..c2931a84 100644 --- a/src/webrtc_private.c +++ b/src/webrtc_private.c @@ -1737,6 +1737,38 @@ int _gst_pipeline_set_state(webrtc_s *webrtc, GstState state) 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; diff --git a/src/webrtc_sink.c b/src/webrtc_sink.c index cb742d9f..a35be005 100644 --- a/src/webrtc_sink.c +++ b/src/webrtc_sink.c @@ -92,28 +92,6 @@ static webrtc_gst_slot_s* __find_sink_slot_by_id(webrtc_s *webrtc, unsigned int 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; @@ -220,7 +198,7 @@ static int __build_videosink(webrtc_s *webrtc, GstElement *decodebin, GstPad *sr 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); @@ -261,7 +239,7 @@ static int __build_videosink(webrtc_s *webrtc, GstElement *decodebin, GstPad *sr 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); } } @@ -514,7 +492,7 @@ static void __decodebin_element_added_cb(GstElement *decodebin, GstElement *elem 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 */ diff --git a/src/webrtc_source_private.c b/src/webrtc_source_private.c index 9cdd38a4..57c66e0c 100644 --- a/src/webrtc_source_private.c +++ b/src/webrtc_source_private.c @@ -1180,78 +1180,6 @@ bool _set_default_video_info(webrtc_gst_slot_s *source, const ini_item_media_sou } //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;