waylandsink : Add disable-overlay property 68/116568/4
authorHyunil <hyunil46.park@samsung.com>
Mon, 27 Feb 2017 05:25:48 +0000 (14:25 +0900)
committerHyunil <hyunil46.park@samsung.com>
Tue, 28 Feb 2017 01:16:27 +0000 (10:16 +0900)
Change-Id: I49d8e4e7c261a379bc4e750064bca247c5e865f7
Signed-off-by: Hyunil <hyunil46.park@samsung.com>
ext/wayland/gstwaylandsink.c
ext/wayland/gstwaylandsink.h
ext/wayland/wlwindow.c

index 74b8f34..dd33d64 100755 (executable)
@@ -149,6 +149,7 @@ enum
   PROP_DISPLAY,
 #ifdef TIZEN_FEATURE_WLSINK_ENHANCEMENT
   PROP_DUMP_VIDEO,
+  PROP_DISABLE_OVERLAY,
   PROP_DUMP_COUNT,
   PROP_SIGNAL_HANDOFFS,
   PROP_USE_GAPLESS,
@@ -284,6 +285,12 @@ gst_wayland_sink_class_init (GstWaylandSinkClass * klass)
   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,
@@ -294,12 +301,12 @@ gst_wayland_sink_class_init (GstWaylandSinkClass * klass)
           "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 "
@@ -487,7 +494,8 @@ gst_wayland_sink_dump_raw_video (GstWaylandSink * sink, GstBuffer * buffer,
   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");
@@ -504,11 +512,13 @@ gst_wayland_sink_init (GstWaylandSink * sink)
 #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;
@@ -528,6 +538,37 @@ gst_wayland_sink_init (GstWaylandSink * sink)
 
 #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;
@@ -536,7 +577,7 @@ gst_wayland_sink_stop_video (GstWaylandSink * sink)
 }
 
 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);
@@ -549,12 +590,12 @@ gst_wayland_sink_check_use_gapless (GstWaylandSink * sink)
 }
 
 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;
@@ -627,7 +668,7 @@ gst_wayland_sink_make_flush_buffer (GstWlDisplay * display,
   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;
   }
@@ -647,7 +688,7 @@ gst_wayland_sink_make_flush_buffer (GstWlDisplay * display,
       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;
@@ -661,7 +702,7 @@ gst_wayland_sink_make_flush_buffer (GstWlDisplay * display,
           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)
@@ -682,7 +723,7 @@ gst_wayland_sink_make_flush_buffer (GstWlDisplay * display,
 }
 
 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;
@@ -787,16 +828,16 @@ gst_wayland_sink_get_mm_video_buf_info (GstWaylandSink * sink,
   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;
@@ -843,6 +884,9 @@ gst_wayland_sink_get_property (GObject * object,
     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;
@@ -945,6 +989,16 @@ gst_wayland_sink_set_property (GObject * object,
       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);
@@ -1219,7 +1273,7 @@ gst_wayland_sink_event (GstBaseSink * bsink, GstEvent * event)
           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;
       }
@@ -1301,7 +1355,7 @@ gst_wayland_sink_find_display (GstWaylandSink * sink)
           ret = FALSE;
         }
 #ifdef TIZEN_FEATURE_WLSINK_ENHANCEMENT
-        if (sink->display)
+        if (G_LIKELY (sink->display))
           sink->display->USE_TBM = sink->USE_TBM;
 #endif
       }
@@ -1436,7 +1490,10 @@ gst_wayland_sink_get_caps (GstBaseSink * bsink, GstCaps * filter)
   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) {
@@ -1452,7 +1509,7 @@ gst_wayland_sink_get_caps (GstBaseSink * bsink, GstCaps * filter)
     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
@@ -1564,7 +1621,7 @@ gst_wayland_sink_set_caps (GstBaseSink * bsink, GstCaps * caps)
 
   /* 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++) {
@@ -1652,6 +1709,8 @@ gst_wayland_sink_set_caps (GstBaseSink * bsink, GstCaps * caps)
     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
@@ -1874,6 +1933,11 @@ gst_wayland_sink_render (GstBaseSink * bsink, GstBuffer * buffer)
   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 */
@@ -1900,7 +1964,7 @@ gst_wayland_sink_render (GstBaseSink * bsink, GstBuffer * buffer)
 
   /* 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 */
@@ -1912,7 +1976,7 @@ gst_wayland_sink_render (GstBaseSink * bsink, GstBuffer * buffer)
 
   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);
@@ -2210,7 +2274,7 @@ gst_wayland_sink_videooverlay_init (GstVideoOverlayInterface * iface)
   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
@@ -2238,8 +2302,8 @@ gst_wayland_sink_set_wl_window_wl_surface_id (GstVideoOverlay * overlay,
 
   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);
       }
index 2a2e868..07060af 100644 (file)
@@ -90,6 +90,9 @@ struct _GstWaylandSink
   gboolean visible;
   gboolean follow_parent_transform;
   gboolean USE_TBM;
+  gboolean is_native_format;
+  gboolean flush_request;
+  gboolean disable_overlay;
   guint total_dump;
   guint rotate_angle;
   guint display_geometry_method;
index 7502ce0..1121889 100644 (file)
@@ -112,7 +112,6 @@ gst_wl_window_finalize (GObject * gobject)
   }
 
   wl_surface_destroy (self->area_surface);
-
   g_clear_object (&self->display);
 
   G_OBJECT_CLASS (gst_wl_window_parent_class)->finalize (gobject);