/pidgin/main: f827e56eea34: media: don't keep last sample refere...

Jakub Adam <[email protected]>
Newsgroups gmane.comp.gnome.gaim.cvs
Message-ID <[email protected]>
Changeset: f827e56eea34a7d37922fcefb1eaa34a3410fac7
Author:	 Jakub Adam <[email protected]>
Date:	 2016-04-27 09:19 +0200
Branch:	 release-2.x.y
URL: https://hg.pidgin.im/pidgin/main/rev/f827e56eea34

Description:

media: don't keep last sample reference on sinks

Holding a reference to a GstBuffer somewhere in a pipeline for possibly
indefinite period may cause trouble when the buffer has been allocated
by a 3rd party library or when it points directly into memory region of
a hardware device.

A specific example is V4L2 source element, which won't allow webcam
image resolution be reconfigured unless all previously allocated buffers
have been freed.

Backport of Pidgin 3 commit 13807c514810.

diffstat:

 libpurple/mediamanager.c  |   5 ++++-
 pidgin/gtkmedia.c         |  23 +++++++++++++++++++++++
 pidgin/plugins/vvconfig.c |  28 ++++++++++++++++++++++++++++
 3 files changed, 55 insertions(+), 1 deletions(-)

diffs (100 lines):

diff --git a/libpurple/mediamanager.c b/libpurple/mediamanager.c
--- a/libpurple/mediamanager.c
+++ b/libpurple/mediamanager.c
@@ -1171,7 +1171,10 @@ purple_media_manager_get_element(PurpleM
 			 * giving a not-linked error upon destruction
 			 */
 			fakesink = gst_element_factory_make("fakesink", NULL);
-			g_object_set(fakesink, "sync", FALSE, NULL);
+			g_object_set(fakesink,
+				"sync", FALSE,
+				"enable-last-sample", FALSE,
+				NULL);
 			gst_bin_add(GST_BIN(bin), fakesink);
 			gst_element_link(tee, fakesink);
 
diff --git a/pidgin/gtkmedia.c b/pidgin/gtkmedia.c
--- a/pidgin/gtkmedia.c
+++ b/pidgin/gtkmedia.c
@@ -1208,6 +1208,26 @@ pidgin_media_new_cb(PurpleMediaManager *
 	return TRUE;
 }
 
+static void
+videosink_disable_last_sample(GstElement *sink)
+{
+	GObjectClass *klass = G_OBJECT_GET_CLASS(sink);
+
+	if (g_object_class_find_property(klass, "enable-last-sample")) {
+		g_object_set(sink, "enable-last-sample", FALSE, NULL);
+	}
+}
+
+static void
+autovideosink_child_added_cb (GstChildProxy *child_proxy, GObject *object,
+#if GST_CHECK_VERSION(1,0,0)
+		gchar *name,
+#endif
+		gpointer user_data)
+{
+	videosink_disable_last_sample(GST_ELEMENT(object));
+}
+
 static GstElement *
 create_default_video_src(PurpleMedia *media,
 		const gchar *session_id, const gchar *participant)
@@ -1260,6 +1280,9 @@ create_default_video_sink(PurpleMedia *m
 	if (sink == NULL)
 		purple_debug_error("gtkmedia", "Unable to find a suitable "
 				"element for the default video sink.\n");
+	if (sink != NULL)
+		g_signal_connect(sink, "child-added",
+				G_CALLBACK(autovideosink_child_added_cb), NULL);
 	return sink;
 }
 
diff --git a/pidgin/plugins/vvconfig.c b/pidgin/plugins/vvconfig.c
--- a/pidgin/plugins/vvconfig.c
+++ b/pidgin/plugins/vvconfig.c
@@ -371,6 +371,26 @@ create_video_src(PurpleMedia *media,
 	return ret;
 }
 
+static void
+videosink_disable_last_sample(GstElement *sink)
+{
+	GObjectClass *klass = G_OBJECT_GET_CLASS(sink);
+
+	if (g_object_class_find_property(klass, "enable-last-sample")) {
+		g_object_set(sink, "enable-last-sample", FALSE, NULL);
+	}
+}
+
+static void
+autovideosink_child_added_cb(GstChildProxy *child_proxy, GObject *object,
+#if GST_CHECK_VERSION(1,0,0)
+		gchar *name,
+#endif
+		gpointer user_data)
+{
+	videosink_disable_last_sample(GST_ELEMENT(object));
+}
+
 static GstElement *
 create_video_sink(PurpleMedia *media,
 		const gchar *session_id, const gchar *participant)
@@ -388,6 +408,14 @@ create_video_sink(PurpleMedia *media,
 	ret = gst_element_factory_make(plugin, NULL);
 	if (device[0] != '\0')
 		g_object_set(G_OBJECT(ret), "device", device, NULL);
+
+	if (g_strcmp0(plugin, "autovideosink") == 0) {
+		g_signal_connect(ret, "child-added",
+			G_CALLBACK(autovideosink_child_added_cb), NULL);
+	} else {
+		videosink_disable_last_sample(ret);
+	}
+
 	return ret;
 }
 

_______________________________________________
Commits mailing list
[email protected]
https://pidgin.im/cgi-bin/mailman/listinfo/commits
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.