[rygel-gst-0-10-fullscreen-renderer] Make window embedding work
- From: Jens Georg <jensgeorg src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [rygel-gst-0-10-fullscreen-renderer] Make window embedding work
- Date: Thu, 14 Feb 2013 10:52:55 +0000 (UTC)
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]