PROP_DISPLAY,
#ifdef TIZEN_FEATURE_WLSINK_ENHANCEMENT
PROP_DUMP_VIDEO,
+ PROP_DISABLE_OVERLAY,
PROP_DUMP_COUNT,
PROP_SIGNAL_HANDOFFS,
PROP_USE_GAPLESS,
gstbasesink_class->event = GST_DEBUG_FUNCPTR (gst_wayland_sink_event);
#endif
+ g_object_class_install_property (gobject_class, PROP_DISPLAY,
+ g_param_spec_string ("display", "Wayland Display name", "Wayland "
+ "display name to connect to, if not supplied via the GstContext",
+ NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+#ifdef TIZEN_FEATURE_WLSINK_ENHANCEMENT
g_object_class_install_property (gobject_class, PROP_DUMP_VIDEO,
g_param_spec_boolean ("dump-video", "dump raw video buffer",
"Dump raw video buffer", FALSE,
"Dump video count", 1, G_MAXUINT, DEFAULT_DUMP_COUNT,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
- g_object_class_install_property (gobject_class, PROP_DISPLAY,
- g_param_spec_string ("display", "Wayland Display name", "Wayland "
- "display name to connect to, if not supplied via the GstContext",
- NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_DISABLE_OVERLAY,
+ g_param_spec_boolean ("disable-overlay", "disable overlay",
+ "Stop using overlay by destroying wl_window and wl_display, "
+ "to use overlay, use gst_video_overlay_set_wl_window_wl_surface_id",
+ FALSE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
-#ifdef TIZEN_FEATURE_WLSINK_ENHANCEMENT
g_object_class_install_property (gobject_class, PROP_KEEP_CAMERA_PREVIEW,
g_param_spec_boolean ("keep-camera-preview", "use flush buffer mechanism",
"Last tbm buffer is copied and returned to camerasrc immediately "
gst_memory_map (mem, &mem_info, GST_MAP_READ);
data = mem_info.data;
- snprintf (file_name, sizeof(file_name), "/tmp/WLSINK_OUT_DUMP_%2.2d.dump", dump_count);
+ snprintf (file_name, sizeof (file_name), "/tmp/WLSINK_OUT_DUMP_%2.2d.dump",
+ dump_count);
ret = gst_wl_fwrite_data (file_name, data, size);
if (ret) {
GST_ERROR ("_write_rawdata() failed");
#ifdef TIZEN_FEATURE_WLSINK_ENHANCEMENT
sink->dump_video = FALSE;
sink->total_dump = DEFAULT_DUMP_COUNT;
+ sink->disable_overlay = FALSE;
sink->signal_handoffs = FALSE;
sink->request_camera_flush_buf = FALSE;
sink->keep_camera_preview = FALSE;
sink->got_costum_event = FALSE;
sink->USE_TBM = TRUE;
+ sink->is_native_format = FALSE;
sink->display_geometry_method = DEF_DISPLAY_GEOMETRY_METHOD;
sink->flip = DEF_DISPLAY_FLIP;
sink->rotate_angle = DEGREE_0;
#ifdef TIZEN_FEATURE_WLSINK_ENHANCEMENT
static void
+gst_wayland_sink_recover_display_window_info (GstWaylandSink * sink)
+{
+ GstWlShmAllocator *self = NULL;
+ FUNCTION;
+ g_return_if_fail (sink != NULL);
+ g_return_if_fail (sink->display != NULL);
+ g_return_if_fail (sink->window != NULL);
+
+ sink->display->USE_TBM = sink->USE_TBM;
+ sink->display->is_native_format = sink->is_native_format;
+ self = GST_WL_SHM_ALLOCATOR (gst_wl_shm_allocator_get ());
+ self->display = sink->display;
+
+ gst_wayland_sink_update_window_geometry (sink);
+ sink->video_info_changed = TRUE;
+}
+
+static gboolean
+gst_wayland_sink_is_disabled_overlay (GstWaylandSink * sink)
+{
+ g_return_if_fail (sink != NULL);
+ //Ensure display is null and the display info has been copied by unsetting disable_overlay
+ //If using the toplevel window, window is null
+ if (!sink->disable_overlay && sink->display) {
+ return FALSE;
+ }
+ sink->redraw_pending = FALSE;
+ return TRUE;
+}
+
+static void
gst_wayland_sink_stop_video (GstWaylandSink * sink)
{
FUNCTION;
}
static int
-gst_wayland_sink_check_use_gapless (GstWaylandSink * sink)
+gst_wayland_sink_is_gapless (GstWaylandSink * sink)
{
g_return_val_if_fail (sink != NULL, FALSE);
g_return_val_if_fail (sink->display != NULL, FALSE);
}
static int
-gst_wayland_sink_need_to_make_flush_buffer (GstWaylandSink * sink)
+gst_wayland_sink_need_flush_buffer (GstWaylandSink * sink)
{
g_return_val_if_fail (sink != NULL, FALSE);
g_return_val_if_fail (sink->display != NULL, FALSE);
- if ((gst_wayland_sink_check_use_gapless (sink))
+ if ((gst_wayland_sink_is_gapless (sink))
|| sink->request_camera_flush_buf || sink->display->flush_request) {
sink->display->flush_request = TRUE;
return TRUE;
g_return_val_if_fail (mm_video_buf != NULL, FALSE);
flush_buffer = (GstWlFlushBuffer *) malloc (sizeof (GstWlFlushBuffer));
- if (!flush_buffer) {
+ if (G_UNLIKELY (!flush_buffer)) {
GST_ERROR ("GstWlFlushBuffer alloc faile");
return FALSE;
}
GST_LOG ("tbm bo size: %d", bo_size);
/* alloc bo */
bo = tbm_bo_alloc (display->flush_tbm_bufmgr, bo_size, TBM_DEVICE_CPU);
- if (!bo) {
+ if (G_UNLIKELY (!bo)) {
GST_ERROR ("alloc tbm bo(size:%d) failed: %s", bo_size,
strerror (errno));
return FALSE;
tbm_bo_map (mm_video_buf->handle.bo[i], TBM_DEVICE_CPU,
TBM_OPTION_READ);
dst = tbm_bo_map (bo, TBM_DEVICE_CPU, TBM_OPTION_READ | TBM_OPTION_WRITE);
- if (!src.ptr || !dst.ptr) {
+ if (G_UNLIKELY ((!src.ptr || !dst.ptr))) {
GST_ERROR ("get tbm bo handle failed src(%p) dst(%p): %s", src.ptr,
dst.ptr, strerror (errno));
if (src.ptr)
}
static int
-gst_wayland_sink_copy_mm_video_buf_info_to_flush (GstWlDisplay * display,
+gst_wayland_sink_copy_mm_video_buf_info_to_flush_buffer (GstWlDisplay * display,
MMVideoBuffer * mm_video_buf)
{
int ret = FALSE;
display->flush_request = mm_video_buf->flush_request;
GST_DEBUG ("flush_request value is %d", display->flush_request);
#ifdef USE_WL_FLUSH_BUFFER
- if (gst_wayland_sink_need_to_make_flush_buffer (sink)) {
+ if (gst_wayland_sink_need_flush_buffer (sink)) {
/* Sometimes there isn't video data in MMVideoBuffer from buffer
when flush_request is true */
if (mm_video_buf->flush_request && !mm_video_buf->size[0]
&& sink->last_buffer) {
- /* get MMVideoBuffer from last buffer */
+ /* replace MMVideoBuffer from last buffer */
mm_video_buf = gst_wayland_sink_get_mm_video_buf (sink->last_buffer);
g_return_val_if_fail (mm_video_buf != NULL, FALSE);
}
- if (!gst_wayland_sink_copy_mm_video_buf_info_to_flush (display,
+ if (!gst_wayland_sink_copy_mm_video_buf_info_to_flush_buffer (display,
mm_video_buf)) {
GST_ERROR ("cat not copy mm_video_buf info to flush");
return FALSE;
case PROP_DUMP_COUNT:
g_value_set_uint (value, sink->total_dump);
break;
+ case PROP_DISABLE_OVERLAY:
+ g_value_set_boolean (value, sink->disable_overlay);
+ break;
case PROP_KEEP_CAMERA_PREVIEW:
g_value_set_boolean (value, sink->keep_camera_preview);
break;
if (sink->display)
sink->display->total_dump = sink->total_dump;
break;
+ case PROP_DISABLE_OVERLAY:
+ sink->disable_overlay = g_value_get_boolean (value);
+ if (sink->window && sink->display) {
+ if (sink->disable_overlay) {
+ g_clear_object (&sink->window);
+ g_clear_object (&sink->display);
+ } else
+ gst_wayland_sink_recover_display_window_info (sink);
+ }
+ break;
case PROP_SIGNAL_HANDOFFS:
sink->signal_handoffs = g_value_get_boolean (value);
GST_LOG ("set signal_handoffs(%d)", sink->signal_handoffs);
gst_structure_get_name (s), GST_STATE (sink));
sink->got_costum_event = TRUE;
- if (gst_wayland_sink_check_use_gapless (sink)) {
+ if (gst_wayland_sink_is_gapless (sink)) {
gst_wayland_sink_render_flush_buffer (bsink);
sink->got_costum_event = FALSE;
}
ret = FALSE;
}
#ifdef TIZEN_FEATURE_WLSINK_ENHANCEMENT
- if (sink->display)
+ if (G_LIKELY (sink->display))
sink->display->USE_TBM = sink->USE_TBM;
#endif
}
sink = GST_WAYLAND_SINK (bsink);
caps = gst_pad_get_pad_template_caps (GST_VIDEO_SINK_PAD (sink));
-
+#ifdef TIZEN_FEATURE_WLSINK_ENHANCEMENT
+ /* To Do : When caps negotiation is newly needed by such as gapless,
+ waylandsink may have to make display when disable-overlay is TRUE in here */
+#endif
g_mutex_lock (&sink->display_lock);
if (sink->display) {
g_value_init (&list, GST_TYPE_LIST);
g_value_init (&value, G_TYPE_STRING);
#ifdef TIZEN_FEATURE_WLSINK_ENHANCEMENT
- if (sink->display->USE_TBM)
+ if (sink->USE_TBM)
formats = sink->display->tbm_formats;
else /* SHM */
#endif
/* verify we support the requested format */
#ifdef TIZEN_FEATURE_WLSINK_ENHANCEMENT
- if (sink->display->USE_TBM) {
+ if (sink->USE_TBM) {
GST_LOG ("USE TBM FORMAT");
formats = sink->display->tbm_formats;
for (i = 0; i < formats->len; i++) {
gst_object_unref (newpool);
}
#ifdef TIZEN_FEATURE_WLSINK_ENHANCEMENT
+ sink->is_native_format = sink->display->is_native_format;
+
if (sink->window)
gst_wayland_sink_update_window_geometry (sink);
#endif
GST_LOG_OBJECT (sink, "render gstbuffer %p, ref_count(%d)", buffer,
GST_OBJECT_REFCOUNT_VALUE (buffer));
+ if (gst_wayland_sink_is_disabled_overlay (sink)) {
+ GST_LOG ("set disable_overlay, so skip");
+ goto done;
+ }
+
if (G_UNLIKELY (!sink->window)) {
/* ask for window handle. Unlock render_lock while doing that because
* set_window_handle & friends will lock it in this context */
/* drop buffers until we get a frame callback */
if (g_atomic_int_get (&sink->redraw_pending) == TRUE
- && !gst_wayland_sink_check_use_gapless (sink))
+ && !gst_wayland_sink_is_gapless (sink))
goto done;
#ifndef TIZEN_FEATURE_WLSINK_ENHANCEMENT /* for tizen view_port, we don't know window size */
wlbuffer = gst_buffer_get_wl_buffer (buffer);
if (G_LIKELY (wlbuffer && wlbuffer->display == sink->display)
- && !(gst_wayland_sink_check_use_gapless (sink))
+ && !(gst_wayland_sink_is_gapless (sink))
&& !sink->request_camera_flush_buf) {
GST_LOG_OBJECT (sink, "buffer %p has a wl_buffer from our display, " "writing directly", buffer); //buffer is from our pool and have wl_buffer
GST_LOG ("wl_buffer (%p)", wlbuffer->wlbuffer);
iface->set_window_handle = gst_wayland_sink_set_window_handle;
iface->set_render_rectangle = gst_wayland_sink_set_render_rectangle;
iface->expose = gst_wayland_sink_expose;
-#ifdef TIZEN_FEATURE_WLSINK_ENHANCEMENT /* use unique_id */
+#ifdef TIZEN_FEATURE_WLSINK_ENHANCEMENT /* use unique_id */
iface->set_wl_window_wl_surface_id =
gst_wayland_sink_set_wl_window_wl_surface_id;
#endif
if (wl_surface_id) {
if (G_LIKELY (gst_wayland_sink_find_display (sink))) {
- /* we cannot use our own display with an external window handle */
- if (G_UNLIKELY (sink->display->own_display)) {
+ /* we can use our own display with an external window handle */
+ if (G_LIKELY (sink->display->own_display)) {
sink->display->wl_surface_id = (int) wl_surface_id;
sink->window = gst_wl_window_new_in_surface (sink->display, NULL);
}