From: Sangchul Lee Date: Mon, 11 Jul 2022 02:31:32 +0000 (+0900) Subject: webrtc_ini: Add new item to set EVAS native surface tbm format X-Git-Tag: submit/tizen/20220714.015855~5 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=dd0e37a7932937379866c04296f084e41d19bfcd;p=platform%2Fcore%2Fapi%2Fwebrtc.git webrtc_ini: Add new item to set EVAS native surface tbm format It is also modified that loopback pipeline of source and video sink bin apply it in case of EVAS surface type. [Version] 0.3.150 [Issue Type] New feature Change-Id: Iec14a0e7dbe1d4c282ecb7246ac81392d9aafd77 Signed-off-by: Sangchul Lee --- diff --git a/include/webrtc_private.h b/include/webrtc_private.h index 4e574354..dc750f85 100644 --- a/include/webrtc_private.h +++ b/include/webrtc_private.h @@ -351,6 +351,7 @@ 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 *evas_native_surface_tbm_format; GStrv a_hw_decoder_elements; GStrv v_hw_decoder_elements; bool v_overlay_resource_required; diff --git a/packaging/capi-media-webrtc.spec b/packaging/capi-media-webrtc.spec index cf4d1758..7c76be7a 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: 0.3.149 +Version: 0.3.150 Release: 0 Group: Multimedia/API License: Apache-2.0 diff --git a/src/webrtc_ini.c b/src/webrtc_ini.c index 91588cba..67a0ef77 100644 --- a/src/webrtc_ini.c +++ b/src/webrtc_ini.c @@ -101,6 +101,7 @@ #define INI_ITEM_VIDEO_SINK_ELEMENT "video sink element" #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" /* items for resource acquisition */ #define INI_ITEM_RESOURCE_CAMERA "camera" @@ -250,6 +251,7 @@ static void __dump_ini(webrtc_ini_s *ini) __dump_item(INI_ITEM_VIDEO_SINK_ELEMENT, INI_ITEM_TYPE_STRING, (void *)ini->rendering_sink.v_sink_element); __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); LOG_INFO("[%s]", INI_CATEGORY_RESOURCE_ACQUISITION); __dump_item(INI_ITEM_RESOURCE_CAMERA, INI_ITEM_TYPE_BOOL, &ini->resource_acquisition.camera); @@ -525,6 +527,7 @@ void _load_ini(webrtc_s *webrtc) 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_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); ini->resource_acquisition.camera = __ini_get_boolean(ini->dict, INI_CATEGORY_RESOURCE_ACQUISITION, INI_ITEM_RESOURCE_CAMERA, DEFAULT_RESOURCE_CAMERA_REQUIRED); diff --git a/src/webrtc_sink.c b/src/webrtc_sink.c index 68d24a6c..eab48e35 100644 --- a/src/webrtc_sink.c +++ b/src/webrtc_sink.c @@ -125,6 +125,7 @@ static int __build_videosink(webrtc_s *webrtc, GstElement *decodebin, GstPad *sr { webrtc_gst_slot_s *sink; GstElement *videoconvert = NULL; + GstElement *capsfilter; GstElement *videosink; GstElement *link_to; const char *videosink_factory_name; @@ -160,11 +161,6 @@ static int __build_videosink(webrtc_s *webrtc, GstElement *decodebin, GstPad *sr return ret; } #endif - if (!(videoconvert = _create_element(DEFAULT_ELEMENT_VIDEOCONVERT, NULL))) - goto exit; - PREPEND_ELEMENT(element_list, videoconvert); - link_to = videoconvert; - if (sink->display->type == WEBRTC_DISPLAY_TYPE_OVERLAY || sink->display->type == WEBRTC_DISPLAY_TYPE_ECORE_WL) { gst_video_overlay_set_wl_window_wl_surface_id(GST_VIDEO_OVERLAY(videosink), sink->display->overlay_surface_id); @@ -178,13 +174,29 @@ static int __build_videosink(webrtc_s *webrtc, GstElement *decodebin, GstPad *sr NULL); } else if (sink->display->type == WEBRTC_DISPLAY_TYPE_EVAS) { + GstCaps *caps; g_object_set(G_OBJECT(videosink), "sync", TRUE, "qos", TRUE, "signal-handoffs", TRUE, NULL); _connect_and_append_signal(&sink->signals, (GObject *)videosink, "handoff", G_CALLBACK(_video_stream_decoded_cb), sink->display); + + if (!(capsfilter = _create_element(DEFAULT_ELEMENT_CAPSFILTER, NULL))) + goto exit; + PREPEND_ELEMENT(element_list, capsfilter); + + caps = gst_caps_new_simple(MEDIA_TYPE_VIDEO_RAW, + "format", G_TYPE_STRING, webrtc->ini.rendering_sink.evas_native_surface_tbm_format, + NULL); + g_object_set(G_OBJECT(capsfilter), "caps", caps, NULL); + gst_caps_unref(caps); } + + if (!(videoconvert = _create_element(DEFAULT_ELEMENT_VIDEOCONVERT, NULL))) + goto exit; + PREPEND_ELEMENT(element_list, videoconvert); + link_to = videoconvert; } if (!_add_elements_to_bin(sink->bin, element_list)) { diff --git a/src/webrtc_source.c b/src/webrtc_source.c index b0e0d251..ea488322 100644 --- a/src/webrtc_source.c +++ b/src/webrtc_source.c @@ -3353,6 +3353,7 @@ static int __build_loopback_videosink(webrtc_gst_slot_s *source, GstElement *lin const char *videosink_factory_name; GstElement *videosink; GstElement *videoconvert; + GstElement *capsfilter; GList *element_list = NULL; RET_VAL_IF(source == NULL, WEBRTC_ERROR_INVALID_PARAMETER, "source is NULL"); @@ -3390,6 +3391,19 @@ static int __build_loopback_videosink(webrtc_gst_slot_s *source, GstElement *lin return WEBRTC_ERROR_INVALID_OPERATION; APPEND_ELEMENT(element_list, videoconvert); + if (source->display->type == WEBRTC_DISPLAY_TYPE_EVAS) { + GstCaps *caps; + if (!(capsfilter = _create_element(DEFAULT_ELEMENT_CAPSFILTER, NULL))) + goto exit; + APPEND_ELEMENT(element_list, capsfilter); + + caps = gst_caps_new_simple(MEDIA_TYPE_VIDEO_RAW, + "format", G_TYPE_STRING, webrtc->ini.rendering_sink.evas_native_surface_tbm_format, + NULL); + g_object_set(G_OBJECT(capsfilter), "caps", caps, NULL); + gst_caps_unref(caps); + } + if (!(videosink = _create_element(videosink_factory_name, NULL))) goto exit; APPEND_ELEMENT(element_list, videosink);