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:
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);
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;
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);
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;
}