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

Jakub Adam jakub.adam at ktknet.cz
Tue Apr 26 11:36:51 EDT 2016


Changeset: 13807c51481035797ef5ed08f5236389b03ef155
Author:	 Jakub Adam <jakub.adam at ktknet.cz>
Date:	 2016-04-14 21:01 +0200
Branch:	 default
URL: https://hg.pidgin.im/pidgin/main/rev/13807c514810

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.

diffstat:

 libpurple/mediamanager.c |   5 ++++-
 pidgin/gtkmedia.c        |  24 ++++++++++++++++++++++++
 2 files changed, 28 insertions(+), 1 deletions(-)

diffs (56 lines):

diff --git a/libpurple/mediamanager.c b/libpurple/mediamanager.c
--- a/libpurple/mediamanager.c
+++ b/libpurple/mediamanager.c
@@ -1127,7 +1127,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
@@ -1183,6 +1183,23 @@ 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,
+		gchar *name, gpointer user_data)
+{
+	videosink_disable_last_sample(GST_ELEMENT(object));
+}
+
 static GstElement *
 create_vv_element(const gchar *plugin, const gchar *device)
 {
@@ -1245,6 +1262,13 @@ create_vv_element(const gchar *plugin, c
 				"set device\n");
 	}
 
+	if (g_strcmp0(plugin, "autovideosink") == 0) {
+		g_signal_connect(source, "child-added",
+			G_CALLBACK(autovideosink_child_added_cb), NULL);
+	} else {
+		videosink_disable_last_sample(source);
+	}
+
 	if (g_strcmp0(plugin, "videotestsrc") == 0)
 		g_object_set(G_OBJECT(element), "is-live", TRUE, NULL);
 



More information about the Commits mailing list