[gst-devel] 2 playbins in a window

Julien GILLES jul.gil at gmail.com
Tue May 27 19:21:17 CEST 2008


2008/5/27 Tim Müller <t.i.m at zen.co.uk>:

> There have been some issues with starting up two pipelines/playbins at
> the same time. These should mostly be fixed in CVS (core and plugin
> modules) (see e.g. http://bugzilla.gnome.org/show_bug.cgi?id=530317).
>
> What versions are you trying with? What errors/warnings are you seeing?

GStreamer 0.10.18.

I have run the applications 3 times, 3 differents behaviours  (the
code is below).

1) The main window appears, and crashes immediatly. Std output is :

GLib-GObject-ERROR **: g_type_plugin_*() invalidly modified type
`GstStreamSelector'
aborting...
Abandon

Another test crashes with :

GLib-GObject-ERROR **: g_type_plugin_*() invalidly modified type `GstStreamInfo'
aborting...
Abandon

2) The window appears, with the 2 videos, but one stops playing after
a few seconds. No errors on standard output.

3) same as 2), but with a lot of errors :

(player:12602): GLib-GObject-WARNING **: cannot register existing type
`GstJackAudioSinkRingBuffer'

(player:12602): GLib-GObject-CRITICAL **: g_object_new: assertion
`G_TYPE_IS_OBJECT (object_type)' failed

** (player:12602): CRITICAL **: gst_ring_buffer_open_device: assertion
`GST_IS_RING_BUFFER (buf)' failed

(player:12602): GLib-GObject-WARNING **: cannot register existing type
`GstJackAudioSinkRingBuffer'

(player:12602): GLib-GObject-CRITICAL **: g_object_new: assertion
`G_TYPE_IS_OBJECT (object_type)' failed

** (player:12602): CRITICAL **: gst_ring_buffer_open_device: assertion
`GST_IS_RING_BUFFER (buf)' failed


Here is the code :


#include <config.h>
#include <X11/Xlib.h>
#include <gst/gst.h>
#include <gst/interfaces/xoverlay.h>
#include <gtk/gtk.h>
#include <gdk/gdk.h>
#include <gdk/gdkx.h>

static void
on_destroy (GtkWidget * widget, gpointer data)
{
    gtk_main_quit ();
}

static gboolean expose_cb(GtkWidget * widget, GdkEventExpose * event,
						  gpointer data)
{
	gst_x_overlay_set_xwindow_id(GST_X_OVERLAY(data),
								 GDK_WINDOW_XWINDOW(widget->window));
	gtk_widget_show_all(widget);
}


GstElement*
add_video(GtkFixed* fixed, gint x, gint y, gint w, gint h)
{
	const char* uri = "file:///tmp/foo.avi";
	
	GstElement* playbin    = gst_element_factory_make ("playbin", "play");
    GstElement* vsink = gst_element_factory_make ("ximagesink", "vsink");
	g_object_set (G_OBJECT (playbin), "video-sink", vsink, NULL);
	g_object_set (G_OBJECT (playbin), "uri", uri, NULL);

	GtkWidget* da = gtk_drawing_area_new();
 	gtk_widget_set_size_request(da, w, h);	
	gtk_fixed_put(GTK_FIXED(fixed), da, x, y);
	g_signal_connect(da, "expose-event", G_CALLBACK(expose_cb), vsink);
	gst_element_set_state(playbin, GST_STATE_PLAYING);
	return playbin;
}

static gboolean
bus_call (GstBus     *bus,
	  GstMessage *msg,
	  gpointer    data)
{
  GMainLoop *loop = (GMainLoop *) data;

  switch (GST_MESSAGE_TYPE (msg)) {
    case GST_MESSAGE_EOS:
      g_print ("End-of-stream\n");
      g_main_loop_quit (loop);
      break;
    case GST_MESSAGE_ERROR: {
      gchar *debug;
      GError *err;

      gst_message_parse_error (msg, &err, &debug);
      g_free (debug);

      g_print ("Error: %s\n", err->message);
      g_error_free (err);

      g_main_loop_quit (loop);
      break;
    }
    default:
      break;
  }

  return TRUE;
}


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

    gtk_init (&argc, &argv);

    window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
    gtk_window_set_default_size (GTK_WINDOW (window), 1024, 768);
    g_signal_connect (G_OBJECT (window), "destroy", G_CALLBACK
(on_destroy), NULL);

	GtkWidget* fixed = gtk_fixed_new();
	gtk_container_add(GTK_CONTAINER(window), fixed);
	gtk_widget_show (fixed);


	const gchar *nano_str;
	guint major, minor, micro, nano;
	
	gst_init (&argc, &argv);
	
	gst_version (&major, &minor, &micro, &nano);
	
	if (nano == 1)
		nano_str = "(CVS)";
	else if (nano == 2)
		nano_str = "(Prerelease)";
	else
		nano_str = "";
	
	printf ("This program is linked against GStreamer %d.%d.%d %s\n",
			major, minor, micro, nano_str);

	
	GstElement *v1 = add_video(GTK_FIXED(fixed), 0, 0, 300, 300);
	GstElement *v2 = add_video(GTK_FIXED(fixed), 301, 301, 300, 300);
	gst_element_set_state(v1, GST_STATE_PLAYING);
	gst_element_set_state(v2, GST_STATE_PLAYING);
	
    gtk_widget_show_all (window);
    gtk_main ();
	
    return 0;
}

-- 
Julien Gilles.


More information about the gstreamer-devel mailing list