From 64cc2b3e29db7626527e06c05b2868bae4f65ee4 Mon Sep 17 00:00:00 2001 From: Eunhwa Kang Date: Fri, 27 Sep 2024 09:30:16 +0900 Subject: [PATCH] add ini configs for sink, decoder property Change-Id: Iaa04ae6f149af68361c41a2cc1f7a034ec7f4541 --- include/webrtc_private.h | 4 ++++ src/webrtc_ini.c | 12 ++++++++++++ src/webrtc_sink.c | 41 +++++++++++++++++++++++++++------------- 3 files changed, 44 insertions(+), 13 deletions(-) diff --git a/include/webrtc_private.h b/include/webrtc_private.h index 20a9e50d..a966f0b1 100644 --- a/include/webrtc_private.h +++ b/include/webrtc_private.h @@ -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; diff --git a/src/webrtc_ini.c b/src/webrtc_ini.c index 2f7e61a2..42646d4e 100644 --- a/src/webrtc_ini.c +++ b/src/webrtc_ini.c @@ -106,6 +106,10 @@ /* 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); diff --git a/src/webrtc_sink.c b/src/webrtc_sink.c index b4a984b8..c33abda8 100644 --- a/src/webrtc_sink.c +++ b/src/webrtc_sink.c @@ -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 */ -- 2.34.1