webrtc_sink: Use fakesink to drop receiving video data if display is not set 73/264273/3
authorSangchul Lee <sc11.lee@samsung.com>
Wed, 15 Sep 2021 08:41:06 +0000 (17:41 +0900)
committerSangchul Lee <sc11.lee@samsung.com>
Wed, 15 Sep 2021 09:16:04 +0000 (18:16 +0900)
[Version] 0.2.99
[Issue Type] Improvement

Change-Id: I69296f2abe7792e5b6f2c468d5b1bbba58b4f860
Signed-off-by: Sangchul Lee <sc11.lee@samsung.com>
packaging/capi-media-webrtc.spec
src/webrtc_sink.c

index 5ea9afef01d8324e8b8b2998f56828d117cdc100..4ecab4e8b31ae27bd0081822cfeca80f55cfbb2d 100644 (file)
@@ -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
index 74160feb83e8ddb9dce5eb2a754177cb45618a64..3afae365d22cc25496c50ef5110d99dbd3a8d918 100644 (file)
@@ -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;
 }