[rygel-gst-0-10-fullscreen-renderer] Make window embedding work



commit 477b1773a4b17a1360e594c807d99a0f8959b936
Author: Jens Georg <mail jensge org>
Date:   Thu Feb 14 11:51:49 2013 +0100

    Make window embedding work
    
    With gstreamer 0.10 release, Playbin2 does not implement the XOverlay
    interface so one needs to use the prepare-xwindow-id message.

 src/fullscreen-renderer.c |   35 ++++++++++++++++++++++++++++++++---
 1 files changed, 32 insertions(+), 3 deletions(-)
---
diff --git a/src/fullscreen-renderer.c b/src/fullscreen-renderer.c
index 2ed4591..15056e2 100644
--- a/src/fullscreen-renderer.c
+++ b/src/fullscreen-renderer.c
@@ -48,6 +48,7 @@ struct _MainData {
   GtkWindow *window;
   GtkWidget *video;
   GstElement *playbin;
+  guintptr handle;
 };
 typedef struct _MainData MainData;
 
@@ -61,9 +62,7 @@ static void on_realize (GtkWidget *widget, gpointer user_data)
   if (!gdk_window_ensure_native (window))
     g_error ("Could not create native window for overlay");
 
-  window_handle = GDK_WINDOW_XID (window);
-  gst_x_overlay_set_window_handle (GST_X_OVERLAY (data->playbin),
-                     window_handle);
+  data->handle = GDK_WINDOW_XID (window);
 }
 
 static gboolean on_draw (GtkWidget *widget, cairo_t *cr, gpointer user_data)
@@ -103,6 +102,32 @@ static gboolean on_key_released (GtkWidget *widget,
   }
 }
 
+static GstBusSyncReply
+on_bus (GstBus *bus G_GNUC_UNUSED,
+        GstMessage *message,
+        gpointer user_data)
+{
+  MainData *data = (MainData *) user_data;
+
+  if (GST_MESSAGE_TYPE (message) != GST_MESSAGE_ELEMENT) {
+    return GST_BUS_PASS;
+  }
+
+  if (!gst_structure_has_name (message->structure, "prepare-xwindow-id")) {
+    return GST_BUS_PASS;
+  }
+
+  if (data->handle != 0) {
+    GstXOverlay *overlay;
+    overlay = GST_X_OVERLAY (GST_MESSAGE_SRC (message));
+    gst_x_overlay_set_window_handle (overlay, data->handle);
+  }
+
+  gst_message_unref (message);
+
+  return GST_BUS_DROP;
+}
+
 int main (int argc, char *argv[])
 {
   RygelPlaybinRenderer *renderer;
@@ -110,6 +135,7 @@ int main (int argc, char *argv[])
   GMainLoop *loop;
   MainData data;
   GdkCursor *cursor;
+  GstBus *bus;
 
   gtk_init (&argc, &argv);
   gst_init (&argc, &argv);
@@ -118,6 +144,9 @@ int main (int argc, char *argv[])
 
   renderer = rygel_playbin_renderer_new ("LibRygel renderer demo");
   data.playbin = rygel_playbin_renderer_get_playbin (renderer);
+  bus = gst_pipeline_get_bus (GST_PIPELINE (data.playbin));
+  gst_bus_set_sync_handler (bus, (GstBusSyncHandler) on_bus, &data);
+  gst_object_unref (bus);
 
   data.window = GTK_WINDOW (gtk_window_new (GTK_WINDOW_TOPLEVEL));
   data.video = gtk_drawing_area_new ();


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]