Merged in fbellet/pidgin/port-changes-from-branch-2.x.y-to-default (pull request #632)

Tue, 04 Feb 2020 03:05:18 +0000

author
Gary Kramlich <grim@reaperworld.com>
date
Tue, 04 Feb 2020 03:05:18 +0000
changeset 40275
bba8505129d5
parent 40267
7510455a1902 (current diff)
parent 40274
4f159034c598 (diff)
child 40281
294012def01e
child 40341
ae0175720477

Merged in fbellet/pidgin/port-changes-from-branch-2.x.y-to-default (pull request #632)

Port changes from branch 2.x.y to default

Approved-by: Eion Robb <eionrobb@gmail.com>
Approved-by: John Bailey <rekkanoryo@rekkanoryo.org>
Approved-by: Gary Kramlich <grim@reaperworld.com>

libpurple/media.c file | annotate | diff | comparison | revisions
libpurple/media.h file | annotate | diff | comparison | revisions
libpurple/media/backend-fs2.c file | annotate | diff | comparison | revisions
libpurple/mediamanager.c file | annotate | diff | comparison | revisions
libpurple/protocols/jabber/jingle/rtp.c file | annotate | diff | comparison | revisions
--- a/libpurple/media.c	Tue Feb 04 02:59:47 2020 +0000
+++ b/libpurple/media.c	Tue Feb 04 03:05:18 2020 +0000
@@ -1237,6 +1237,19 @@
 }
 
 gboolean
+purple_media_set_require_encryption(PurpleMedia *media, const gchar *sess_id,
+                const gchar *participant, gboolean require_encryption)
+{
+#ifdef USE_VV
+	g_return_val_if_fail(PURPLE_IS_MEDIA(media), FALSE);
+	return purple_media_backend_set_require_encryption(media->priv->backend,
+			sess_id, participant, require_encryption);
+#else
+	return FALSE;
+#endif
+}
+
+gboolean
 purple_media_codecs_ready(PurpleMedia *media, const gchar *sess_id)
 {
 #ifdef USE_VV
--- a/libpurple/media.h	Tue Feb 04 02:59:47 2020 +0000
+++ b/libpurple/media.h	Tue Feb 04 03:05:18 2020 +0000
@@ -412,6 +412,21 @@
 		const gchar *key, gsize key_len);
 
 /**
+ * purple_media_set_require_encryption:
+ * @media: The media object to find the session in.
+ * @sess_id: The id of the session to set parameters of.
+ * @participant: The participant of the session to set parameters of.
+ * @require_encryption: TRUE if the media requires encryption.
+ *
+ * Sets whether a session participant's media requires encryption.
+ *
+ * Since: 2.14.0
+ */
+gboolean purple_media_set_require_encryption(PurpleMedia *media,
+		const gchar *sess_id, const gchar *participant,
+		gboolean require_encryption);
+
+/**
  * purple_media_codecs_ready:
  * @media: The media object to find the session in.
  * @sess_id: The session id of the session to check.
--- a/libpurple/media/backend-fs2.c	Tue Feb 04 02:59:47 2020 +0000
+++ b/libpurple/media/backend-fs2.c	Tue Feb 04 03:05:18 2020 +0000
@@ -74,6 +74,9 @@
 		PurpleMediaBackend *self, const gchar *sess_id,
 		const gchar *participant, const gchar *cipher,
 		const gchar *auth, const gchar *key, gsize key_len);
+static gboolean purple_media_backend_fs2_set_require_encryption(
+		PurpleMediaBackend *self, const gchar *sess_id,
+		const gchar *participant, gboolean require_encryption);
 static gboolean purple_media_backend_fs2_set_remote_codecs(
 		PurpleMediaBackend *self,
 		const gchar *sess_id, const gchar *participant,
@@ -505,6 +508,8 @@
 			purple_media_backend_fs2_set_encryption_parameters;
 	iface->set_decryption_parameters =
 			purple_media_backend_fs2_set_decryption_parameters;
+	iface->set_require_encryption =
+			purple_media_backend_fs2_set_require_encryption;
 	iface->set_params = purple_media_backend_fs2_set_params;
 	iface->get_available_params = purple_media_backend_fs2_get_available_params;
 	iface->send_dtmf = purple_media_backend_fs2_send_dtmf;
@@ -1812,16 +1817,11 @@
 		if (codec->media_type == FS_MEDIA_TYPE_AUDIO) {
 			double output_volume = purple_prefs_get_int(
 					"/purple/media/audio/volume/output")/10.0;
-			/*
-			 * Should this instead be:
-			 *  audioconvert ! audioresample ! liveadder !
-			 *   audioresample ! audioconvert ! realsink
-			 */
 			stream->queue = gst_element_factory_make("queue", NULL);
 			stream->volume = gst_element_factory_make("volume", NULL);
 			g_object_set(stream->volume, "volume", output_volume, NULL);
 			stream->level = gst_element_factory_make("level", NULL);
-			stream->src = gst_element_factory_make("liveadder", NULL);
+			stream->src = gst_element_factory_make("audiomixer", NULL);
 			sink = purple_media_manager_get_element(
 					purple_media_get_manager(priv->media),
 					PURPLE_MEDIA_RECV_AUDIO, priv->media,
@@ -1864,6 +1864,39 @@
 		gst_element_set_state(stream->tee, GST_STATE_PLAYING);
 		gst_element_set_state(stream->src, GST_STATE_PLAYING);
 		gst_element_link_many(stream->src, stream->tee, sink, NULL);
+	} else {
+		if (codec->media_type == FS_MEDIA_TYPE_AUDIO) {
+			GstElement *convert, *resample, *capsfilter;
+			GstPad *mixer_srcpad;
+			GstCaps *caps;
+
+			/* The audiomixer element requires that all input
+			 * streams have the same rate, so resample if
+			 * needed
+			 */
+			mixer_srcpad = gst_element_get_static_pad(stream->src, "src");
+			caps = gst_pad_get_current_caps(mixer_srcpad);
+
+			if (caps) {
+				convert = gst_element_factory_make("audioconvert", NULL);
+				resample = gst_element_factory_make("audioresample", NULL);
+				capsfilter = gst_element_factory_make("capsfilter", NULL);
+
+				gst_bin_add_many(GST_BIN(priv->confbin), convert,
+						resample, capsfilter, NULL);
+				gst_element_link_many(gst_pad_get_parent_element(srcpad),
+						convert, resample, capsfilter, NULL);
+
+				g_object_set(capsfilter, "caps", caps, NULL);
+				gst_element_set_state(convert, GST_STATE_PLAYING);
+				gst_element_set_state(resample, GST_STATE_PLAYING);
+				gst_element_set_state(capsfilter, GST_STATE_PLAYING);
+
+				srcpad = gst_element_get_static_pad(capsfilter, "src");
+				gst_object_unref(caps);
+			}
+			gst_object_unref(mixer_srcpad);
+		}
 	}
 
 	sinkpad = gst_element_get_request_pad(stream->src, "sink_%u");
@@ -2383,6 +2416,25 @@
 }
 
 static gboolean
+purple_media_backend_fs2_set_require_encryption(PurpleMediaBackend *self,
+		const gchar *sess_id, const gchar *participant,
+		gboolean require_encryption)
+{
+	PurpleMediaBackendFs2Stream *stream;
+	gboolean result;
+
+	stream = get_stream(PURPLE_MEDIA_BACKEND_FS2(self), sess_id,
+			participant);
+	if (!stream) {
+		return FALSE;
+	}
+
+	g_object_set(stream->stream, "require-encryption",
+			require_encryption, NULL);
+	return TRUE;
+}
+
+static gboolean
 purple_media_backend_fs2_set_send_codec(PurpleMediaBackend *self,
 		const gchar *sess_id, PurpleMediaCodec *codec)
 {
--- a/libpurple/media/backend-iface.c	Tue Feb 04 02:59:47 2020 +0000
+++ b/libpurple/media/backend-iface.c	Tue Feb 04 03:05:18 2020 +0000
@@ -219,6 +219,24 @@
 			sess_id, participant, cipher, auth, key, key_len);
 }
 
+gboolean
+purple_media_backend_set_require_encryption(PurpleMediaBackend *self,
+		const gchar *sess_id, const gchar *participant,
+		gboolean require_encryption)
+{
+	PurpleMediaBackendInterface *backend_iface;
+
+	g_return_val_if_fail(PURPLE_IS_MEDIA_BACKEND(self), FALSE);
+	backend_iface = PURPLE_MEDIA_BACKEND_GET_INTERFACE(self);
+
+	if (!backend_iface->set_require_encryption) {
+		return FALSE;
+	}
+
+	return backend_iface->set_require_encryption(self,
+			sess_id, participant, require_encryption);
+}
+
 void
 purple_media_backend_set_params(PurpleMediaBackend *self,
 		guint num_params, GParameter *params)
--- a/libpurple/media/backend-iface.h	Tue Feb 04 02:59:47 2020 +0000
+++ b/libpurple/media/backend-iface.h	Tue Feb 04 03:05:18 2020 +0000
@@ -90,6 +90,9 @@
 		const gchar *sess_id, const gchar *participant,
 		const gchar *cipher, const gchar *auth,
 		const gchar *key, gsize key_len);
+	gboolean (*set_require_encryption) (PurpleMediaBackend *self,
+		const gchar *sess_id, const gchar *participant,
+		gboolean require_encryption);
 	G_GNUC_BEGIN_IGNORE_DEPRECATIONS
 	void (*set_params) (PurpleMediaBackend *self,
 		guint num_params, GParameter *params);
@@ -254,6 +257,19 @@
 		const gchar *key, gsize key_len);
 
 /**
+ * purple_media_backend_set_require_encryption:
+ * @self: The media object to find the session in.
+ * @sess_id: The id of the session to set parameters of.
+ * @participant: The participant of the session to set parameters of.
+ * @require_encryption: TRUE if the media requires encryption.
+ *
+ * Sets whether a session participant's media requires encryption.
+ */
+gboolean purple_media_backend_set_require_encryption(PurpleMediaBackend *self,
+		const gchar *sess_id, const gchar *participant,
+		gboolean require_encryption);
+
+/**
  * purple_media_backend_set_params:
  * @self: The media backend to set the parameters on.
  * @num_params: The number of parameters to pass to backend
--- a/libpurple/mediamanager.c	Tue Feb 04 02:59:47 2020 +0000
+++ b/libpurple/mediamanager.c	Tue Feb 04 03:05:18 2020 +0000
@@ -651,7 +651,6 @@
 	GstElement *parent = GST_ELEMENT_PARENT(pad);
 	GstIterator *iter;
 	GValue tmp = G_VALUE_INIT;
-	GstPad *remaining_pad;
 	GstIteratorResult result;
 
 	gst_element_release_request_pad(parent, pad);
@@ -665,9 +664,7 @@
 		gst_element_set_state(parent, GST_STATE_NULL);
 		gst_bin_remove(GST_BIN(GST_ELEMENT_PARENT(parent)), parent);
 	} else if (result == GST_ITERATOR_OK) {
-		remaining_pad = g_value_get_object(&tmp);
 		g_value_reset(&tmp);
-		gst_object_unref(remaining_pad);
 	}
 
 	gst_iterator_free(iter);
--- a/libpurple/protocols/jabber/jingle/rtp.c	Tue Feb 04 02:59:47 2020 +0000
+++ b/libpurple/protocols/jabber/jingle/rtp.c	Tue Feb 04 03:05:18 2020 +0000
@@ -87,9 +87,12 @@
 
 	for (; candidates; candidates = g_list_next(candidates)) {
 		PurpleMediaCandidate *candidate = candidates->data;
-		gchar *id = jabber_get_next_id(jingle_session_get_js(session));
-		jingle_transport_add_local_candidate(transport, id, generation, candidate);
-		g_free(id);
+		if (purple_media_candidate_get_protocol(candidate) ==
+				PURPLE_MEDIA_NETWORK_PROTOCOL_UDP) {
+			gchar *id = jabber_get_next_id(jingle_session_get_js(session));
+			jingle_transport_add_local_candidate(transport, id, generation, candidate);
+			g_free(id);
+		}
 	}
 
 	return transport;
@@ -217,8 +220,15 @@
 				session);
 
 		g_object_unref(session);
-	} else if (type == PURPLE_MEDIA_INFO_ACCEPT &&
+	/* The same signal is emited *four* times in case of acceptance
+	 * by purple_media_stream_info() (stream acceptance, session
+	 * acceptance, participant acceptance, and conference acceptance).
+	 * We only react to the first one, where sid and name are given
+	 * non-null values.
+	 */
+	} else if (type == PURPLE_MEDIA_INFO_ACCEPT && sid && name &&
 			jingle_session_is_initiator(session) == FALSE) {
+
 		jingle_rtp_ready(session);
 	}
 }

mercurial