add ini configs for sink, decoder property 73/319973/1
authorEunhwa Kang <e.kang@samsung.com>
Fri, 27 Sep 2024 00:30:16 +0000 (09:30 +0900)
committerSangchul Lee <sc11.lee@samsung.com>
Wed, 6 Nov 2024 00:40:07 +0000 (09:40 +0900)
Change-Id: Iaa04ae6f149af68361c41a2cc1f7a034ec7f4541

include/webrtc_private.h
src/webrtc_ini.c
src/webrtc_sink.c

index 20a9e50d304a59d263da76d589f2bcbce66b502e..a966f0b15039a15d3648b9b8e6682446c203e5b4 100644 (file)
@@ -397,7 +397,11 @@ typedef struct _ini_item_media_source_s {
 typedef struct _ini_item_rendering_sink_s {
        const char *a_sink_element;
        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 a_hw_decoder_elements;
        GStrv v_hw_decoder_elements;
        bool v_overlay_resource_required;
index 2f7e61a23811b2b442ef4e984a775a2afd7bfa18..42646d4e28325929d1d2c5f75a6120de4ec0dd7d 100644 (file)
 /* items for rendering sink */
 #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_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"
@@ -260,6 +264,10 @@ static void __dump_ini(webrtc_ini_s *ini)
        LOG_INFO("[%s]", INI_CATEGORY_RENDERING_SINK);
        __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_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);
@@ -544,6 +552,10 @@ 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_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);
index b4a984b8230d545b32cc79f81ebfd6c005d46f01..c33abda87d89abf0e1b3d4bbf0268f781ecbf8b6 100644 (file)
@@ -92,6 +92,28 @@ 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;
@@ -109,7 +131,7 @@ static const char *__get_videosink_factory_name(webrtc_display_s *display, webrt
                factory_name = ini->rendering_sink.v_sink_element;
                break;
        case WEBRTC_DISPLAY_TYPE_EVAS:
-               factory_name = display->zerocopy ? "mesonvideosink" : DEFAULT_ELEMENT_FAKESINK;
+               factory_name = display->zerocopy ? ini->rendering_sink.v_hw_handoff_sink_element : DEFAULT_ELEMENT_FAKESINK;
                break;
        default:
                LOG_ERROR_IF_REACHED("invalid type(%d)", display->type);
@@ -197,12 +219,8 @@ static int __build_videosink(webrtc_s *webrtc, GstElement *decodebin, GstPad *sr
                                "qos", (gboolean)sink->display->qos,
                                NULL);
 
-                       if (sink->display->zerocopy) {
-                               g_object_set(G_OBJECT(videosink),
-                                               "use-drm", TRUE,
-                                               "use-tizen-video-object", FALSE,
-                                               NULL);
-                       }
+                       if (sink->display->zerocopy)
+                               __parse_and_set_property(videosink, sink->webrtc->ini.rendering_sink.v_hw_sink_element_configuration);
 
                        /* 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);
@@ -243,9 +261,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 {
-                               g_object_set(G_OBJECT(videosink),
-                                               "convert-mode", 1,
-                                               NULL);
+                               __parse_and_set_property(videosink, sink->webrtc->ini.rendering_sink.v_hw_handoff_sink_element_configuration);
                        }
                }
 
@@ -497,9 +513,8 @@ static void __decodebin_element_added_cb(GstElement *decodebin, GstElement *elem
                /* send SPS and PPS Insertion Interval every second */
                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_strrstr(factory_name, "v4l2")) {
-               LOG_INFO("[%s] set capture-io-mode to dmabuf-import", factory_name);
-               g_object_set(G_OBJECT(element), "capture-io-mode", 5, NULL);
+       } 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);
        }
 
        /* all other depayloaders except h264 */