Improve codes regarding setting element properties from ini 89/320789/1
authorSangchul Lee <sc11.lee@samsung.com>
Fri, 8 Nov 2024 09:40:10 +0000 (18:40 +0900)
committerSangchul Lee <sc11.lee@samsung.com>
Fri, 22 Nov 2024 08:04:00 +0000 (17:04 +0900)
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 <sc11.lee@samsung.com>
include/webrtc_private.h
include/webrtc_source_private.h
packaging/capi-media-webrtc.spec
src/webrtc_ini.c
src/webrtc_private.c
src/webrtc_sink.c
src/webrtc_source_private.c

index a966f0b15039a15d3648b9b8e6682446c203e5b4..4ae966945b780ffca7a63a3e8406c3467bf4e109 100644 (file)
@@ -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);
index 5f424ae90c9750679af76e45b4ca0c4bc8bdda46..513f1639ad7ee0045cb6e1bb99de8fa02be8f4a7 100644 (file)
@@ -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__ */
index 5c2cb735893aebe348b54350397829aad6114f97..7c55393f5d996727c5010016c5f45d70725f858b 100644 (file)
@@ -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
index 42646d4e28325929d1d2c5f75a6120de4ec0dd7d..22407af1d8bf14c701209a7081a4f13ea68533a0 100644 (file)
 #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;
 
index 9e4cad7c996d02025e2c09cac25996e1685ac2ac..c2931a84b92a00f25e8b3fbb908218b2c1b182f1 100644 (file)
@@ -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;
index cb742d9f6592852d60b1dc3ca33f484bb9edb3d1..a35be005e82d5e4d989bab419bbe34143a304950 100644 (file)
@@ -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 */
index 9cdd38a42ef7381016129c04c3a92c562cba1590..57c66e0c9e2e0dbded4160ecd21a977def0a8621 100644 (file)
@@ -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;