[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, µ, &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