From: Sangchul Lee Date: Wed, 15 Sep 2021 08:41:06 +0000 (+0900) Subject: webrtc_sink: Use fakesink to drop receiving video data if display is not set X-Git-Tag: submit/tizen/20210916.061019~1 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=ec70202d80f5a0bfa60ca7d575c7f11ebf4c94b7;p=platform%2Fcore%2Fapi%2Fwebrtc.git webrtc_sink: Use fakesink to drop receiving video data if display is not set [Version] 0.2.99 [Issue Type] Improvement Change-Id: I69296f2abe7792e5b6f2c468d5b1bbba58b4f860 Signed-off-by: Sangchul Lee --- diff --git a/packaging/capi-media-webrtc.spec b/packaging/capi-media-webrtc.spec index 5ea9afef..4ecab4e8 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.2.98 +Version: 0.2.99 Release: 0 Group: Multimedia/API License: Apache-2.0 diff --git a/src/webrtc_sink.c b/src/webrtc_sink.c index 74160feb..3afae365 100644 --- a/src/webrtc_sink.c +++ b/src/webrtc_sink.c @@ -92,22 +92,17 @@ webrtc_gst_slot_s* __find_sink_slot_by_id(webrtc_s *webrtc, unsigned int track_i return sink; } -static const char *__get_videosink_factory_name(webrtc_display_s *display, webrtc_ini_s *ini, bool *display_is_set) +static const char *__get_videosink_factory_name(webrtc_display_s *display, webrtc_ini_s *ini) { - const char *factory_name = NULL; + const char *factory_name; - RET_VAL_IF(display == NULL, NULL, "display is NULL"); RET_VAL_IF(ini == NULL, NULL, "ini is NULL"); - RET_VAL_IF(display_is_set == NULL, NULL, "display_is_set is NULL"); - if (display->surface == NULL) { - *display_is_set = false; - LOG_INFO("display surface is not set, use [%s]", ini->rendering_sink.v_sink_element); - return ini->rendering_sink.v_sink_element; + if (!display) { + LOG_WARNING("display is not set, use [%s] to drop video data", DEFAULT_ELEMENT_FAKESINK); + return DEFAULT_ELEMENT_FAKESINK; } - *display_is_set = true; - switch (display->type) { case WEBRTC_DISPLAY_TYPE_OVERLAY: case WEBRTC_DISPLAY_TYPE_ECORE_WL: @@ -118,7 +113,7 @@ static const char *__get_videosink_factory_name(webrtc_display_s *display, webrt break; default: LOG_ERROR_IF_REACHED("invalid type(%d)", display->type); - break; + return NULL; } LOG_INFO("use [%s] for surface[%p], type[%d]", factory_name, display->surface, display->type); @@ -132,7 +127,7 @@ static int __build_videosink(webrtc_s *webrtc, GstElement *decodebin, GstPad *sr GstElement *videoconvert; GstElement *videosink; const char *videosink_factory_name; - bool display_is_set = false; + bool display_is_set; int ret = WEBRTC_ERROR_NONE; g_autoptr(GMutexLocker) locker = NULL; @@ -146,24 +141,23 @@ static int __build_videosink(webrtc_s *webrtc, GstElement *decodebin, GstPad *sr sink->media_types = MEDIA_TYPE_VIDEO; - if (!(videosink_factory_name = __get_videosink_factory_name(sink->display, &webrtc->ini, &display_is_set))) + display_is_set = !!sink->display; + + if (!(videosink_factory_name = __get_videosink_factory_name(sink->display, &webrtc->ini))) return WEBRTC_ERROR_INVALID_OPERATION; - if (!(videosink = _create_element(videosink_factory_name, NULL))) { - LOG_ERROR("failed to create videosink[%s]", videosink_factory_name); + if (!(videosink = _create_element(videosink_factory_name, NULL))) return WEBRTC_ERROR_INVALID_OPERATION; - } - locker = g_mutex_locker_new(&sink->display->mutex); + if (display_is_set) { + locker = g_mutex_locker_new(&sink->display->mutex); #ifndef TIZEN_TV - if (sink->display->type == WEBRTC_DISPLAY_TYPE_OVERLAY && webrtc->ini.resource_acquisition.video_overlay) { - if ((ret = _acquire_resource_for_type(webrtc, MM_RESOURCE_MANAGER_RES_TYPE_VIDEO_OVERLAY))) - return ret; - } + if (sink->display->type == WEBRTC_DISPLAY_TYPE_OVERLAY && webrtc->ini.resource_acquisition.video_overlay) { + if ((ret = _acquire_resource_for_type(webrtc, MM_RESOURCE_MANAGER_RES_TYPE_VIDEO_OVERLAY))) + return ret; + } #endif - - if (display_is_set) { 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); @@ -182,30 +176,41 @@ static int __build_videosink(webrtc_s *webrtc, GstElement *decodebin, GstPad *sr NULL); _connect_and_append_signal(&sink->signals, (GObject *)videosink, "handoff", G_CALLBACK(_video_stream_decoded_cb), sink->display); } - } - if (!(videoconvert = _create_element(DEFAULT_ELEMENT_VIDEOCONVERT, NULL))) { - LOG_ERROR("failed to create videoconvert"); - return WEBRTC_ERROR_INVALID_OPERATION; - } + if (!(videoconvert = _create_element(DEFAULT_ELEMENT_VIDEOCONVERT, NULL))) + return WEBRTC_ERROR_INVALID_OPERATION; - gst_bin_add_many(sink->bin, videoconvert, videosink, NULL); + gst_bin_add_many(sink->bin, videoconvert, videosink, NULL); - if (!gst_element_sync_state_with_parent(videoconvert)) { - LOG_ERROR("failed to gst_element_sync_state_with_parent() for [%s]", GST_ELEMENT_NAME(videoconvert)); - return WEBRTC_ERROR_INVALID_OPERATION; - } - if (!gst_element_sync_state_with_parent(videosink)) { - LOG_ERROR("failed to gst_element_sync_state_with_parent() for [%s]", GST_ELEMENT_NAME(videosink)); - return WEBRTC_ERROR_INVALID_OPERATION; - } + if (!gst_element_sync_state_with_parent(videoconvert)) { + LOG_ERROR("failed to gst_element_sync_state_with_parent() for [%s]", GST_ELEMENT_NAME(videoconvert)); + return WEBRTC_ERROR_INVALID_OPERATION; + } + if (!gst_element_sync_state_with_parent(videosink)) { + LOG_ERROR("failed to gst_element_sync_state_with_parent() for [%s]", GST_ELEMENT_NAME(videosink)); + return WEBRTC_ERROR_INVALID_OPERATION; + } - if (!gst_element_link_many(decodebin, videoconvert, videosink, NULL)) { - LOG_ERROR("failed to gst_element_link_many()"); - return WEBRTC_ERROR_INVALID_OPERATION; - } + if (!gst_element_link_many(decodebin, videoconvert, videosink, NULL)) { + LOG_ERROR("failed to gst_element_link_many()"); + return WEBRTC_ERROR_INVALID_OPERATION; + } - sink->display->sink_element = videosink; + sink->display->sink_element = videosink; + + } else { + gst_bin_add_many(sink->bin, videosink, NULL); + + if (!gst_element_sync_state_with_parent(videosink)) { + LOG_ERROR("failed to gst_element_sync_state_with_parent() for [%s]", GST_ELEMENT_NAME(videosink)); + return WEBRTC_ERROR_INVALID_OPERATION; + } + + if (!gst_element_link_many(decodebin, videosink, NULL)) { + LOG_ERROR("failed to gst_element_link_many()"); + return WEBRTC_ERROR_INVALID_OPERATION; + } + } return ret; }