Wait for local video frame to be realized before starting local video. vv

Sun, 14 Dec 2008 23:43:52 +0000

author
Michael Ruprecht <maiku@pidgin.im>
date
Sun, 14 Dec 2008 23:43:52 +0000
branch
vv
changeset 26177
35f25555116f
parent 26176
05f45eb5a8ed
child 26178
2081d31d5466

Wait for local video frame to be realized before starting local video.
This fixes half of the BadWindow errors that have plagued vv.

libpurple/media.c file | annotate | diff | comparison | revisions
pidgin/gtkmedia.c file | annotate | diff | comparison | revisions
--- a/libpurple/media.c	Sat Dec 13 09:11:08 2008 +0000
+++ b/libpurple/media.c	Sun Dec 14 23:43:52 2008 +0000
@@ -738,6 +738,7 @@
 		gst_bus_add_signal_watch(GST_BUS(bus));
 		g_signal_connect(G_OBJECT(bus), "message",
 				G_CALLBACK(media_bus_call), media);
+		gst_bus_set_sync_handler(bus, gst_bus_sync_signal_handler, NULL);
 		gst_object_unref(bus);
 
 		gst_bin_add(GST_BIN(media->priv->pipeline), GST_ELEMENT(media->priv->conference));
--- a/pidgin/gtkmedia.c	Sat Dec 13 09:11:08 2008 +0000
+++ b/pidgin/gtkmedia.c	Sun Dec 14 23:43:52 2008 +0000
@@ -300,6 +300,12 @@
 }
 
 static void
+realize_cb(GtkWidget *widget, GstElement *element)
+{
+	gst_element_set_state(element, GST_STATE_PLAYING);
+}
+
+static void
 pidgin_media_ready_cb(PurpleMedia *media, PidginMedia *gtkmedia)
 {
 	GstElement *pipeline = purple_media_get_pipeline(media);
@@ -327,7 +333,6 @@
 			if (!videosendbin && (type & PURPLE_MEDIA_SEND_VIDEO)) {
 				purple_media_video_init_src(&videosendbin);
 				purple_media_set_src(media, sessions->data, videosendbin);
-				gst_element_set_state(videosendbin, GST_STATE_PLAYING);
 			}
 			if (!videorecvbool && (type & PURPLE_MEDIA_RECV_VIDEO)) {
 				videorecvbool = TRUE;
@@ -373,8 +378,12 @@
 		gtk_box_pack_start(GTK_BOX(send_widget), aspect, TRUE, TRUE, 0);
 
 		local_video = gtk_drawing_area_new();
+		g_signal_connect(G_OBJECT(local_video), "realize",
+				G_CALLBACK(realize_cb), videosendbin);
+
 		gtk_container_add(GTK_CONTAINER(aspect), local_video);
 		gtk_widget_set_size_request (GTK_WIDGET(local_video), 100, -1);
+
 		gtk_widget_show(local_video);
 		gtk_widget_show(aspect);
 
@@ -405,8 +414,8 @@
 	bus = gst_pipeline_get_bus(GST_PIPELINE(pipeline));
 
 	if (videorecvbool || videosendbin)
-		gst_bus_set_sync_handler(bus,
-				(GstBusSyncHandler)create_window, gtkmedia);
+		g_signal_connect(bus, "sync-message::element",
+				G_CALLBACK(create_window), gtkmedia);
 
 	if (audiorecvbool || audiosendbin)
 		g_signal_connect(G_OBJECT(bus), "message::element",

mercurial