waylandsink : remove repetitive IPC of Upstream (update video info) 74/78074/3 accepted/tizen/common/20160707.171328 accepted/tizen/ivi/20160706.132852 accepted/tizen/mobile/20160706.132251 accepted/tizen/tv/20160706.132305 accepted/tizen/wearable/20160706.132420 submit/tizen/20160706.103825
authorHyunil <hyunil46.park@samsung.com>
Mon, 4 Jul 2016 07:58:18 +0000 (16:58 +0900)
committerHyunil <hyunil46.park@samsung.com>
Tue, 5 Jul 2016 04:44:15 +0000 (13:44 +0900)
Change-Id: I3ff043f04fa462906e530ecfc03bfd96ea88fc55
Signed-off-by: Hyunil <hyunil46.park@samsung.com>
ext/wayland/gstwaylandsink.c
ext/wayland/wlwindow.c
ext/wayland/wlwindow.h

index 451dbf6..d8b5d59 100755 (executable)
@@ -399,7 +399,7 @@ gst_wayland_sink_update_last_buffer_geometry (GstWaylandSink * sink)
       GST_OBJECT_REFCOUNT_VALUE (sink->last_buffer));
   wlbuffer = gst_buffer_get_wl_buffer (sink->last_buffer);
   g_return_if_fail (wlbuffer != NULL);
-    wlbuffer->used_by_compositor = FALSE;
+  wlbuffer->used_by_compositor = FALSE;
   /*need to render last buffer, reuse current GstWlBuffer */
   render_last_buffer (sink);
   /* ref count is incresed in gst_wl_buffer_attach() of render_last_buffer(),
@@ -751,10 +751,13 @@ gst_wayland_sink_set_property (GObject * object,
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
       break;
   }
-  if (sink->video_info_changed && sink->window
-      && GST_STATE (sink) == GST_STATE_PAUSED) {
-    gst_wayland_sink_update_last_buffer_geometry (sink);
+#ifdef GST_WLSINK_ENHANCEMENT
+  if (sink->video_info_changed && sink->window) {
+    gst_wl_window_set_video_info_change (sink->window, TRUE);
+    if (GST_STATE (sink) == GST_STATE_PAUSED)
+      gst_wayland_sink_update_last_buffer_geometry (sink);
   }
+#endif
   g_mutex_unlock (&sink->render_lock);
 
 }
@@ -1348,6 +1351,10 @@ render_last_buffer (GstWaylandSink * sink)
   struct wl_surface *surface;
   struct wl_callback *callback;
   FUNCTION;
+#ifdef GST_WLSINK_ENHANCEMENT
+  g_return_if_fail (sink->last_buffer != NULL);
+  g_return_if_fail (sink->window != NULL);
+#endif
 
   wlbuffer = gst_buffer_get_wl_buffer (sink->last_buffer);
   surface = gst_wl_window_get_wl_surface (sink->window);
@@ -1358,20 +1365,13 @@ render_last_buffer (GstWaylandSink * sink)
   wl_callback_add_listener (callback, &frame_callback_listener, sink);
 
   if (G_UNLIKELY (sink->video_info_changed)) {
+#ifdef GST_WLSINK_ENHANCEMENT
+      gst_wl_window_set_video_info_change (sink->window, TRUE);
+#endif
     info = &sink->video_info;
     sink->video_info_changed = FALSE;
   }
-#ifdef GST_WLSINK_ENHANCEMENT
-  if (sink->last_buffer)
-    gst_wl_window_render (sink->window, wlbuffer, info);
-  else {
-    if (G_UNLIKELY (info)) {
-      gst_wl_window_set_video_info (sink->window, info);
-    }
-  }
-#else
   gst_wl_window_render (sink->window, wlbuffer, info);
-#endif
 }
 
 static GstFlowReturn
@@ -1399,11 +1399,10 @@ gst_wayland_sink_render (GstBaseSink * bsink, GstBuffer * buffer)
       sink->window =
           gst_wl_window_new_toplevel (sink->display, &sink->video_info);
     }
-  }
 #ifdef GST_WLSINK_ENHANCEMENT
-  gst_wayland_sink_update_window_geometry (sink);
-  sink->video_info_changed = TRUE;
+    gst_wayland_sink_update_window_geometry (sink);
 #endif
+  }
   /* drop buffers until we get a frame callback */
   if (g_atomic_int_get (&sink->redraw_pending) == TRUE)
     goto done;
@@ -1733,7 +1732,6 @@ gst_wayland_sink_set_wl_window_wl_surface_id (GstVideoOverlay * overlay,
     }
   }
   gst_wayland_sink_update_window_geometry (sink);
-
   g_mutex_unlock (&sink->render_lock);
 
 }
@@ -1779,6 +1777,9 @@ gst_wayland_sink_set_window_handle (GstVideoOverlay * overlay, guintptr handle)
           "ignoring window handle");
     }
   }
+#ifdef GST_WLSINK_ENHANCEMENT
+  gst_wayland_sink_update_window_geometry (sink);
+#endif
   g_mutex_unlock (&sink->render_lock);
 
 }
index f12b1ca..7b3fae0 100644 (file)
@@ -248,6 +248,7 @@ gst_wl_window_new_internal (GstWlDisplay * display)
 #ifdef GST_WLSINK_ENHANCEMENT
   if (window->display->USE_TBM) {
     /* Inform enlightenment of surface which render video */
+    /* tizen_video(tbm) render on video_surface */
     window->video_object =
         tizen_video_get_object (display->tizen_video, window->video_surface);
 
@@ -397,7 +398,7 @@ gst_wl_window_is_toplevel (GstWlWindow * window)
 static gint
 gst_wl_window_find_transform (guint rotate_angle, guint flip)
 {
-  gint transform;
+  gint transform = WL_OUTPUT_TRANSFORM_NORMAL;
   guint combine = rotate_angle * 10 + flip;
   FUNCTION;
   GST_DEBUG ("rotate %d, flip %d, combine %d", rotate_angle, flip, combine);
@@ -625,8 +626,17 @@ gst_wl_window_render (GstWlWindow * window, GstWlBuffer * buffer,
     window->video_height = info->height;
 
     wl_subsurface_set_sync (window->video_subsurface);
+#ifdef GST_WLSINK_ENHANCEMENT
+    /* check video_info_changed to remove repetitive IPC */
+    if (window->video_info_changed) {
+      gst_wl_window_resize_video_surface (window, FALSE);
+      window->video_info_changed = FALSE;
+    }
+#else
     gst_wl_window_resize_video_surface (window, FALSE);
+#endif
   }
+
   GST_INFO ("GstWlBuffer(%p)", buffer);
   if (G_LIKELY (buffer))
     gst_wl_buffer_attach (buffer, window->video_surface);
@@ -698,20 +708,6 @@ gst_wl_window_set_render_rectangle (GstWlWindow * window, gint x, gint y,
 
 #ifdef GST_WLSINK_ENHANCEMENT
 void
-gst_wl_window_set_video_info (GstWlWindow * window, const GstVideoInfo * info)
-{
-  FUNCTION;
-  g_return_if_fail (window != NULL);
-
-  window->video_width =
-      gst_util_uint64_scale_int_round (info->width, info->par_n, info->par_d);
-  window->video_height = info->height;
-
-  if (window->render_rectangle.w != 0)
-    gst_wl_window_resize_video_surface (window, FALSE);
-}
-
-void
 gst_wl_window_set_rotate_angle (GstWlWindow * window, guint rotate_angle)
 {
   FUNCTION;
@@ -746,4 +742,14 @@ gst_wl_window_set_flip (GstWlWindow * window, guint flip)
   window->flip = flip;
   GST_INFO ("flip value is (%d)", window->flip);
 }
+
+void
+gst_wl_window_set_video_info_change (GstWlWindow * window, guint changed)
+{
+  FUNCTION;
+  g_return_if_fail (window != NULL);
+  window->video_info_changed = changed;
+  GST_INFO ("video_info_changed value is (%d)", window->video_info_changed);
+}
+
 #endif
index 981199b..81e1009 100644 (file)
@@ -49,6 +49,7 @@ struct _GstWlWindow
   struct wl_shell_surface *shell_surface;
 #ifdef GST_WLSINK_ENHANCEMENT
   struct tizen_video_object *video_object;
+  guint video_info_changed;
 /*Display geometry method */
   guint disp_geo_method;
   guint rotate_angle;
@@ -85,12 +86,14 @@ void gst_wl_window_render (GstWlWindow * window, GstWlBuffer * buffer,
 void gst_wl_window_set_render_rectangle (GstWlWindow * window, gint x, gint y,
     gint w, gint h);
 #ifdef GST_WLSINK_ENHANCEMENT
-void gst_wl_window_set_video_info (GstWlWindow * window, const GstVideoInfo * info);
+void gst_wl_window_set_video_info (GstWlWindow * window,
+    const GstVideoInfo * info);
 void gst_wl_window_set_rotate_angle (GstWlWindow * window, guint rotate_angle);
 void gst_wl_window_set_disp_geo_method (GstWlWindow * window,
     guint disp_geo_method);
 void gst_wl_window_set_orientation (GstWlWindow * window, guint orientation);
 void gst_wl_window_set_flip (GstWlWindow * window, guint flip);
+void gst_wl_window_set_video_info_change (GstWlWindow * window, guint changed);
 #endif
 
 G_END_DECLS