besser82 / rpms / pidgin

Forked from rpms/pidgin 6 years ago
Clone
David Woodhouse f31341b
David Woodhouse f31341b
# HG changeset patch
David Woodhouse f31341b
# User Youness Alaoui <kakaroto@kakaroto.homelinux.net>
David Woodhouse f31341b
# Date 1404874798 14400
David Woodhouse f31341b
# Node ID b52be4fef1ded825e262095480915f2c675a5694
David Woodhouse f31341b
# Parent  2b41ba1fde8a80a4f2d715874a0b02449d4b66ad
David Woodhouse f31341b
Fix gstreamer elements references
David Woodhouse f31341b
In backend-fs2, the create_src will unref the src after it's done with
David Woodhouse f31341b
it, if we simply return the created source, it will segfault.
David Woodhouse f31341b
The issue never happened before because every source so far also has
David Woodhouse f31341b
the UNIQUE flag, which causes it to go in a different branch of the
David Woodhouse f31341b
code which does ref the element and add it to the bin.
David Woodhouse f31341b
David Woodhouse f31341b
Refs #16315
David Woodhouse f31341b
David Woodhouse f31341b
diff --git a/libpurple/mediamanager.c b/libpurple/mediamanager.c
David Woodhouse f31341b
--- a/libpurple/mediamanager.c
David Woodhouse f31341b
+++ b/libpurple/mediamanager.c
David Woodhouse f31341b
@@ -443,7 +443,11 @@
David Woodhouse f31341b
 
David Woodhouse f31341b
 		if (src) {
David Woodhouse f31341b
 			GstElement *capsfilter = gst_bin_get_by_name(GST_BIN(src), "prpl_video_caps");
David Woodhouse f31341b
-			g_object_set(G_OBJECT(capsfilter), "caps", caps, NULL);
David Woodhouse f31341b
+			if (capsfilter) {
David Woodhouse f31341b
+				g_object_set(G_OBJECT(capsfilter), "caps", caps, NULL);
David Woodhouse f31341b
+				gst_object_unref (capsfilter);
David Woodhouse f31341b
+			}
David Woodhouse f31341b
+			gst_object_unref (src);
David Woodhouse f31341b
 		}
David Woodhouse f31341b
 
David Woodhouse f31341b
 		g_free(id);
David Woodhouse f31341b
@@ -550,6 +554,11 @@
David Woodhouse f31341b
 	} else {
David Woodhouse f31341b
 		ret = purple_media_element_info_call_create(info,
David Woodhouse f31341b
 				media, session_id, participant);
David Woodhouse f31341b
+		if (element_type & PURPLE_MEDIA_ELEMENT_SRC) {
David Woodhouse f31341b
+			gst_object_ref(ret);
David Woodhouse f31341b
+			gst_bin_add(GST_BIN(purple_media_manager_get_pipeline(manager)),
David Woodhouse f31341b
+				ret);
David Woodhouse f31341b
+		}
David Woodhouse f31341b
 	}
David Woodhouse f31341b
 
David Woodhouse f31341b
 	if (ret == NULL)
David Woodhouse f31341b