All pastes #951628 Raw Edit

Stuff

public text v1 · immutable
·published 2008-03-21 15:35 UTC
rendered paste body
/* gcc `pkg-config --libs --cflags gstreamer-0.10 gtk+-2.0 gstreamer-interfaces-0.10` -g -o quux quux.c */

#include <gdk/gdkx.h>
#include <gtk/gtk.h>
#include <gst/gst.h>
#include <gst/interfaces/xoverlay.h>
#include <stdlib.h>

static gboolean
bus_async_handler (GstBus *bus, GstMessage *message, gpointer user_data)
{
  GtkWidget *window = (GtkWidget *) user_data;
  GstElement *element;
  gulong window_id;
  GdkWindow *video_window;

  if (GST_MESSAGE_TYPE (message) != GST_MESSAGE_ELEMENT)
    return TRUE;

  if (!gst_structure_has_name (message->structure, "have-xwindow-id"))
    return TRUE;

  element = (GstElement *) message->src;

  window_id = g_value_get_ulong (gst_structure_get_value (message->structure,
        "xwindow-id"));

  g_debug ("got have-xwindow-id message from %s, swallowing window ID %d",
      gst_element_get_name (element), window_id);

  video_window = gdk_window_foreign_new (window_id);
  gdk_window_reparent (video_window, window->window, 0, 0);

  return TRUE;
}

static void
window_realize_handler (GtkWidget *window, gpointer user_data)
{
  int parent_window_id = GPOINTER_TO_INT (user_data);
  GdkWindow *parent_window;
  GstElement *pipeline, *src, *sink;
  GstBus *bus;

/*
  parent_window = gdk_window_foreign_new (parent_window_id);
  gdk_window_reparent (window->window, parent_window, 0, 0);
  */

  pipeline = gst_pipeline_new (NULL);
  src = gst_element_factory_make ("videotestsrc", NULL);
  sink = gst_element_factory_make ("xvimagesink", NULL);

  gst_bin_add_many ((GstBin *) pipeline, src, sink, NULL);
  gst_element_link (src, sink);
  gst_element_set_state (pipeline, GST_STATE_PLAYING);

  bus = gst_element_get_bus (pipeline);
  gst_bus_add_watch (bus, bus_async_handler, window);
  gst_object_unref (bus);
}

int
main (int argc, char **argv)
{
  int parent_window_id;
  GtkWidget *window;

  gst_init (&argc, &argv);

  gtk_init (&argc, &argv);

/*
  if (argc != 2)
    {
      g_print ("Usage: %s <parent window ID>\n", argv[0]);
      return 1;
    }

  parent_window_id = atoi (argv[1]);
  g_print ("using parent window ID %d\n", parent_window_id);
*/

  window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
  g_signal_connect ((GObject *) window, "realize",
      G_CALLBACK (window_realize_handler), GINT_TO_POINTER (parent_window_id));
  gtk_widget_show (window);

  gtk_main ();

  return 0;
}