Tue, 04 Feb 2020 03:05:18 +0000
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>
--- 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); } }