waylandsink: More fixes -- update to Wayland 0.85 protocol -- Added shell surface...
authorSreerenj Balachandran <sreerenj.balachandran@intel.com>
Thu, 16 Feb 2012 20:27:23 +0000 (22:27 +0200)
committerStefan Sauer <ensonic@users.sf.net>
Sun, 4 Mar 2012 19:21:37 +0000 (20:21 +0100)
ext/wayland/gstwaylandsink.c [changed mode: 0755->0644]
ext/wayland/gstwaylandsink.h [changed mode: 0755->0644]

old mode 100755 (executable)
new mode 100644 (file)
index 6a7218a..a073bf0
@@ -107,7 +107,7 @@ static struct display *create_display (void);
 static void display_handle_global (struct wl_display *display, uint32_t id,
     const char *interface, uint32_t version, void *data);
 static void redraw (void *data, struct wl_callback *callback, uint32_t time);
-static struct window *create_window (GstWaylandSink * sink,
+static void create_window (GstWaylandSink * sink,
     struct display *display, int width, int height);
 
 static void
@@ -229,12 +229,14 @@ gst_wayland_sink_init (GstWaylandSink * sink,
 {
 
   sink->caps = NULL;
+  sink->render_finish = TRUE;
+  sink->display = NULL;
+  sink->window = NULL;
 
   sink->pool_lock = g_mutex_new ();
   sink->buffer_pool = NULL;
 
   sink->wayland_lock = g_mutex_new ();
-
 }
 
 static void
@@ -269,6 +271,31 @@ gst_wayland_sink_set_property (GObject * object,
   }
 }
 
+static void
+destroy_display (struct display *display)
+{
+  if (display->shm)
+    wl_shm_destroy (display->shm);
+
+  if (display->shell)
+    wl_shell_destroy (display->shell);
+
+  if (display->compositor)
+    wl_compositor_destroy (display->compositor);
+
+  wl_display_flush (display->display);
+  wl_display_destroy (display->display);
+  free (display);
+}
+
+static void
+destroy_window (struct window *window)
+{
+  wl_shell_surface_destroy (window->shell_surface);
+  wl_surface_destroy (window->surface);
+  free (window);
+}
+
 static void
 gst_wayland_sink_dispose (GObject * object)
 {
@@ -317,6 +344,18 @@ event_mask_update (uint32_t mask, void *data)
   return 0;
 }
 
+static void
+shm_format (void *data, struct wl_shm *wl_shm, uint32_t format)
+{
+  struct display *d = data;
+
+  d->formats |= (1 << format);
+}
+
+struct wl_shm_listener shm_listenter = {
+  shm_format
+};
+
 static void
 display_handle_global (struct wl_display *display, uint32_t id,
     const char *interface, uint32_t version, void *data)
@@ -329,6 +368,7 @@ display_handle_global (struct wl_display *display, uint32_t id,
     d->shell = wl_display_bind (display, id, &wl_shell_interface);
   } else if (strcmp (interface, "wl_shm") == 0) {
     d->shm = wl_display_bind (display, id, &wl_shm_interface);
+    wl_shm_add_listener (d->shm, &shm_listenter, d);
   }
 
 }
@@ -346,6 +386,12 @@ create_display (void)
       display_handle_global, display);
 
   wl_display_iterate (display->display, WL_DISPLAY_READABLE);
+  wl_display_roundtrip (display->display);
+
+  if (!(display->formats & (1 << WL_SHM_FORMAT_XRGB8888))) {
+    GST_ERROR ("WL_SHM_FORMAT_XRGB32 not available");
+    return NULL;
+  }
 
   wl_display_get_fd (display->display, event_mask_update, display);
 
@@ -366,12 +412,7 @@ wayland_buffer_create (GstWaylandSink * sink)
   wbuffer = (GstWlBuffer *) gst_mini_object_new (GST_TYPE_WLBUFFER);
   wbuffer->wlsink = gst_object_ref (sink);
 
-  if (!init) {
-    wl_display_iterate (sink->display->display, sink->display->mask);
-    init++;
-  }
-
-  snprintf (filename, 256, "%s-%d-%s", "/tmp/wayland-shm", init, "XXXXXX");
+  snprintf (filename, 256, "%s-%d-%s", "/tmp/wayland-shm", init++, "XXXXXX");
 
   fd = mkstemp (filename);
   if (fd < 0) {
@@ -397,7 +438,7 @@ wayland_buffer_create (GstWaylandSink * sink)
   }
 
   wbuffer->wbuffer = wl_shm_create_buffer (sink->display->shm, fd,
-      sink->video_width, sink->video_height, stride, WL_SHM_FORMAT_XRGB32);
+      sink->video_width, sink->video_height, stride, WL_SHM_FORMAT_XRGB8888);
 
   close (fd);
 
@@ -529,19 +570,19 @@ redraw (void *data, struct wl_callback *callback, uint32_t time)
 {
 
   GstWaylandSink *sink = (GstWaylandSink *) data;
-  g_mutex_lock (sink->wayland_lock);
 
   sink->render_finish = TRUE;
-
-  g_mutex_unlock (sink->wayland_lock);
 }
 
-static struct window *
+static void
 create_window (GstWaylandSink * sink, struct display *display, int width,
     int height)
 {
   struct window *window;
 
+  if (sink->window)
+    return;
+
   g_mutex_lock (sink->wayland_lock);
 
   window = malloc (sizeof *window);
@@ -550,10 +591,14 @@ create_window (GstWaylandSink * sink, struct display *display, int width,
   window->height = height;
   window->surface = wl_compositor_create_surface (display->compositor);
 
-  //wl_shell_set_toplevel (display->shell, window->surface);
+  window->shell_surface = wl_shell_get_shell_surface (display->shell,
+      window->surface);
+//  wl_shell_surface_set_toplevel (window->shell_surface);
+  wl_shell_surface_set_fullscreen (window->shell_surface);
+
+  sink->window = window;
 
   g_mutex_unlock (sink->wayland_lock);
-  return window;
 }
 
 
@@ -567,8 +612,6 @@ gst_wayland_sink_start (GstBaseSink * bsink)
 
   if (!sink->display)
     sink->display = create_display ();
-  if (!sink->window)
-    sink->window = create_window (sink, sink->display, 1280, 720);
 
   return result;
 }
@@ -603,6 +646,9 @@ gst_wayland_sink_render (GstBaseSink * bsink, GstBuffer * buffer)
       "render buffer %p, data = %p, timestamp = %" GST_TIME_FORMAT, buffer,
       GST_BUFFER_DATA (buffer), GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buffer)));
 
+  if (!sink->window)
+    create_window (sink, sink->display, sink->video_width, sink->video_height);
+
   if (sink->render_finish) {
     if (GST_IS_WLBUFFER (buffer)) {
       GstWlBuffer *tmp_buffer = (GstWlBuffer *) buffer;
@@ -664,11 +710,10 @@ gst_wayland_sink_render (GstBaseSink * bsink, GstBuffer * buffer)
     wl_callback_add_listener (sink->callback, &frame_listener, sink);
     wl_display_iterate (sink->display->display, sink->display->mask);
 
-  } else {
+  } else
     GST_LOG_OBJECT (sink,
         "Waiting to get the signal from compositor to render the next frame..");
-    sink->render_finish = TRUE;
-  }
+
   return GST_FLOW_OK;
 }
 
old mode 100755 (executable)
new mode 100644 (file)
index 678b8cf..56fffd8
@@ -46,6 +46,7 @@ struct  display
   struct wl_compositor *compositor;
   struct wl_shell *shell;
   struct wl_shm *shm;
+  uint32_t formats;
   uint32_t mask;
 };
 
@@ -54,6 +55,7 @@ struct window
   struct display *display;
   int width, height;
   struct wl_surface *surface;
+  struct wl_shell_surface *shell_surface;
   struct wl_buffer *buffer;
 };