--- a/libpurple/media.c Fri Aug 12 01:29:41 2022 -0500
+++ b/libpurple/media.c Fri Aug 12 01:32:07 2022 -0500
@@ -29,7 +29,6 @@
typedef struct _PurpleMediaSession PurpleMediaSession;
typedef struct _PurpleMediaStream PurpleMediaStream;
@@ -56,11 +55,9 @@
GList *active_local_candidates;
GList *active_remote_candidates;
struct _PurpleMediaPrivate
PurpleMediaManager *manager;
PurpleMediaBackend *backend;
@@ -71,12 +68,8 @@
GHashTable *sessions; /* PurpleMediaSession table */
GList *streams; /* PurpleMediaStream table */
static void purple_media_class_init (PurpleMediaClass *klass);
static void purple_media_init (PurpleMedia *media);
static void purple_media_dispose (GObject *object);
@@ -123,15 +116,7 @@
G_DEFINE_TYPE_WITH_PRIVATE(PurpleMedia, purple_media, G_TYPE_OBJECT);
purple_media_class_init (PurpleMediaClass *klass)
@@ -482,21 +467,15 @@
stream = purple_media_get_stream(session->media, session->id, name);
stream->local_candidates = g_list_append(stream->local_candidates, candidate);
purple_media_get_session_ids(PurpleMedia *media)
g_return_val_if_fail(PURPLE_IS_MEDIA(media), NULL);
return media->priv->sessions != NULL ?
g_hash_table_get_keys(media->priv->sessions) : NULL;
purple_media_get_src(PurpleMedia *media, const gchar *sess_id)
@@ -504,47 +483,35 @@
purple_media_get_account(PurpleMedia *media)
g_return_val_if_fail(PURPLE_IS_MEDIA(media), NULL);
g_object_get(G_OBJECT(media), "account", &account, NULL);
purple_media_get_protocol_data(PurpleMedia *media)
g_return_val_if_fail(PURPLE_IS_MEDIA(media), NULL);
g_object_get(G_OBJECT(media), "protocol-data", &protocol_data, NULL);
purple_media_set_protocol_data(PurpleMedia *media, gpointer protocol_data)
g_return_if_fail(PURPLE_IS_MEDIA(media));
g_object_set(G_OBJECT(media), "protocol-data", protocol_data, NULL);
purple_media_error(PurpleMedia *media, const gchar *error, ...)
@@ -558,14 +525,12 @@
g_signal_emit(media, purple_media_signals[S_ERROR], 0, message);
purple_media_end(PurpleMedia *media,
const gchar *session_id, const gchar *participant)
GList *iter, *sessions = NULL, *participants = NULL;
g_return_if_fail(PURPLE_IS_MEDIA(media));
@@ -663,7 +628,6 @@
@@ -671,7 +635,6 @@
const gchar *session_id, const gchar *participant,
g_return_if_fail(PURPLE_IS_MEDIA(media));
if (type == PURPLE_MEDIA_INFO_ACCEPT) {
@@ -830,36 +793,28 @@
g_signal_emit(media, purple_media_signals[STREAM_INFO],
0, type, session_id, participant, local);
purple_media_set_params(PurpleMedia *media, GHashTable *params)
g_return_if_fail(PURPLE_IS_MEDIA(media));
purple_media_backend_set_params(media->priv->backend, params);
purple_media_get_available_params(PurpleMedia *media)
static const gchar *NULL_ARRAY[] = { NULL };
g_return_val_if_fail(PURPLE_IS_MEDIA(media), NULL_ARRAY);
return purple_media_backend_get_available_params(media->priv->backend);
purple_media_param_is_supported(PurpleMedia *media, const gchar *param)
g_return_val_if_fail(PURPLE_IS_MEDIA(media), FALSE);
@@ -871,11 +826,10 @@
purple_media_new_local_candidate_cb(PurpleMediaBackend *backend,
const gchar *sess_id, const gchar *participant,
@@ -969,14 +923,12 @@
g_signal_emit(media, purple_media_signals[CODECS_CHANGED], 0, sess_id);
purple_media_add_stream(PurpleMedia *media, const gchar *sess_id,
const gchar *who, PurpleMediaSessionType type, gboolean initiator,
const gchar *transmitter, GHashTable *params)
PurpleMediaSession *session;
g_return_val_if_fail(PURPLE_IS_MEDIA(media), FALSE);
@@ -1021,9 +973,6 @@
@@ -1038,40 +987,29 @@
purple_media_get_session_type(PurpleMedia *media, const gchar *sess_id)
PurpleMediaSession *session;
g_return_val_if_fail(PURPLE_IS_MEDIA(media), PURPLE_MEDIA_NONE);
session = purple_media_get_session(media, sess_id);
- return PURPLE_MEDIA_NONE;
/* XXX: Should wait until codecs-ready is TRUE before using this function */
purple_media_get_codecs(PurpleMedia *media, const gchar *sess_id)
g_return_val_if_fail(PURPLE_IS_MEDIA(media), NULL);
return purple_media_backend_get_codecs(media->priv->backend, sess_id);
purple_media_get_local_candidates(PurpleMedia *media, const gchar *sess_id,
const gchar *participant)
g_return_val_if_fail(PURPLE_IS_MEDIA(media), NULL);
return purple_media_backend_get_local_candidates(media->priv->backend,
@@ -1079,7 +1017,6 @@
const gchar *participant,
GList *remote_candidates)
PurpleMediaStream *stream;
g_return_if_fail(PURPLE_IS_MEDIA(media));
@@ -1099,58 +1036,44 @@
purple_media_backend_add_remote_candidates(media->priv->backend,
sess_id, participant, remote_candidates);
purple_media_get_active_local_candidates(PurpleMedia *media,
const gchar *sess_id, const gchar *participant)
PurpleMediaStream *stream;
g_return_val_if_fail(PURPLE_IS_MEDIA(media), NULL);
stream = purple_media_get_stream(media, sess_id, participant);
return purple_media_candidate_list_copy(
stream->active_local_candidates);
purple_media_get_active_remote_candidates(PurpleMedia *media,
const gchar *sess_id, const gchar *participant)
PurpleMediaStream *stream;
g_return_val_if_fail(PURPLE_IS_MEDIA(media), NULL);
stream = purple_media_get_stream(media, sess_id, participant);
return purple_media_candidate_list_copy(
stream->active_remote_candidates);
purple_media_set_remote_codecs(PurpleMedia *media, const gchar *sess_id,
const gchar *participant, GList *codecs)
g_return_val_if_fail(PURPLE_IS_MEDIA(media), FALSE);
return purple_media_backend_set_remote_codecs(media->priv->backend,
sess_id, participant, codecs);
purple_media_candidates_prepared(PurpleMedia *media,
const gchar *session_id, const gchar *participant)
gboolean prepared = TRUE;
@@ -1168,22 +1091,15 @@
purple_media_set_send_codec(PurpleMedia *media, const gchar *sess_id, PurpleMediaCodec *codec)
g_return_val_if_fail(PURPLE_IS_MEDIA(media), FALSE);
return purple_media_backend_set_send_codec(
media->priv->backend, sess_id, codec);
@@ -1191,13 +1107,9 @@
const gchar *cipher, const gchar *auth,
const gchar *key, gsize key_len)
g_return_val_if_fail(PURPLE_IS_MEDIA(media), FALSE);
return purple_media_backend_set_encryption_parameters(media->priv->backend,
sess_id, cipher, auth, key, key_len);
@@ -1205,60 +1117,43 @@
const gchar *participant, const gchar *cipher,
const gchar *auth, const gchar *key, gsize key_len)
g_return_val_if_fail(PURPLE_IS_MEDIA(media), FALSE);
return purple_media_backend_set_decryption_parameters(media->priv->backend,
sess_id, participant, cipher, auth, key, key_len);
purple_media_set_require_encryption(PurpleMedia *media, const gchar *sess_id,
const gchar *participant, gboolean require_encryption)
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);
purple_media_codecs_ready(PurpleMedia *media, const gchar *sess_id)
g_return_val_if_fail(PURPLE_IS_MEDIA(media), FALSE);
return purple_media_backend_codecs_ready(
media->priv->backend, sess_id);
purple_media_set_send_rtcp_mux(PurpleMedia *media, const gchar *sess_id,
const gchar *participant, gboolean send_rtcp_mux)
g_return_val_if_fail(PURPLE_IS_MEDIA(media), FALSE);
return purple_media_backend_set_send_rtcp_mux(media->priv->backend,
sess_id, participant, send_rtcp_mux);
purple_media_is_initiator(PurpleMedia *media,
const gchar *sess_id, const gchar *participant)
g_return_val_if_fail(PURPLE_IS_MEDIA(media), FALSE);
if (sess_id == NULL && participant == NULL)
@@ -1272,7 +1167,7 @@
media, sess_id, participant);
return stream != NULL ? stream->initiator : FALSE;
@@ -1280,7 +1175,6 @@
purple_media_accepted(PurpleMedia *media, const gchar *sess_id,
const gchar *participant)
gboolean accepted = TRUE;
g_return_val_if_fail(PURPLE_IS_MEDIA(media), FALSE);
@@ -1314,46 +1208,34 @@
void purple_media_set_input_volume(PurpleMedia *media,
const gchar *session_id, double level)
g_return_if_fail(PURPLE_IS_MEDIA(media));
void purple_media_set_output_volume(PurpleMedia *media,
const gchar *session_id, const gchar *participant,
g_return_if_fail(PURPLE_IS_MEDIA(media));
purple_media_set_output_window(PurpleMedia *media, const gchar *session_id,
const gchar *participant)
g_return_val_if_fail(PURPLE_IS_MEDIA(media), FALSE);
return purple_media_manager_set_output_window(media->priv->manager,
media, session_id, participant);
purple_media_remove_output_windows(PurpleMedia *media)
GList *iter = media->priv->streams;
for (; iter; iter = g_list_next(iter)) {
PurpleMediaStream *stream = iter->data;
@@ -1369,10 +1251,8 @@
media->priv->manager, media,
purple_media_get_tee(PurpleMedia *media,
const gchar *session_id, const gchar *participant)
@@ -1381,13 +1261,11 @@
purple_media_send_dtmf(PurpleMedia *media, const gchar *session_id,
gchar dtmf, guint8 volume, guint16 duration)
PurpleMediaBackendInterface *backend_iface = NULL;
@@ -1412,6 +1290,6 @@
--- a/libpurple/mediamanager.c Fri Aug 12 01:29:41 2022 -0500
+++ b/libpurple/mediamanager.c Fri Aug 12 01:32:07 2022 -0500
@@ -32,12 +32,7 @@
-#include <gst/video/videooverlay.h>
-#ifdef HAVE_MEDIA_APPLICATION
typedef struct _PurpleMediaOutputWindow PurpleMediaOutputWindow;
typedef struct _PurpleMediaElementInfoPrivate PurpleMediaElementInfoPrivate;
@@ -70,12 +65,10 @@
GstDeviceMonitor *device_monitor;
-#ifdef HAVE_MEDIA_APPLICATION
/* Application data streams */
GList *appdata_info; /* holds PurpleMediaAppDataInfo */
guint appdata_cb_token; /* last used read/write callback token */
} PurpleMediaManagerPrivate;
@@ -91,7 +84,6 @@
PurpleMediaManagerPrivate *priv;
-#ifdef HAVE_MEDIA_APPLICATION
@@ -113,13 +105,9 @@
} PurpleMediaAppDataInfo;
static void purple_media_manager_finalize (GObject *object);
-#ifdef HAVE_MEDIA_APPLICATION
static void free_appdata_info_locked (PurpleMediaAppDataInfo *info);
static void purple_media_manager_init_device_monitor(PurpleMediaManager *manager);
static void purple_media_manager_register_static_elements(PurpleMediaManager *manager);
@@ -135,15 +123,7 @@
G_DEFINE_TYPE_WITH_PRIVATE(PurpleMediaManager, purple_media_manager,
-purple_media_manager_get_type()
purple_media_manager_class_init (PurpleMediaManagerClass *klass)
@@ -190,10 +170,8 @@
media->priv->medias = NULL;
media->priv->private_medias = NULL;
media->priv->next_output_window_id = 1;
-#ifdef HAVE_MEDIA_APPLICATION
media->priv->appdata_info = NULL;
g_mutex_init (&media->priv->appdata_mutex);
if (gst_init_check(NULL, NULL, &error)) {
purple_media_manager_register_static_elements(media);
purple_media_manager_init_device_monitor(media);
@@ -225,13 +203,11 @@
g_list_free_full(priv->private_medias, g_object_unref);
g_list_free_full(priv->elements, g_object_unref);
g_clear_pointer(&priv->video_caps, gst_caps_unref);
-#ifdef HAVE_MEDIA_APPLICATION
if (priv->appdata_info) {
g_list_free_full(priv->appdata_info,
(GDestroyNotify)free_appdata_info_locked);
g_mutex_clear (&priv->appdata_mutex);
if (priv->device_monitor) {
gst_device_monitor_stop(priv->device_monitor);
g_object_unref(priv->device_monitor);
@@ -239,12 +215,10 @@
G_OBJECT_CLASS(purple_media_manager_parent_class)->finalize(media);
purple_media_manager_get()
static PurpleMediaManager *manager = NULL;
@@ -252,12 +226,8 @@
pipeline_bus_call(GstBus *bus, GstMessage *msg, PurpleMediaManager *manager)
@@ -286,9 +256,7 @@
purple_media_manager_get_pipeline(PurpleMediaManager *manager)
@@ -312,7 +280,6 @@
return manager->priv->pipeline;
create_media(PurpleMediaManager *manager,
@@ -322,7 +289,6 @@
@@ -356,30 +322,22 @@
get_media(PurpleMediaManager *manager, gboolean private)
return manager->priv->private_medias;
return manager->priv->medias;
get_media_by_account(PurpleMediaManager *manager,
PurpleAccount *account, gboolean private)
PurpleAccount *media_account;
@@ -400,15 +358,11 @@
purple_media_manager_remove_media(PurpleMediaManager *manager, PurpleMedia *media)
@@ -423,7 +377,6 @@
*medias = g_list_delete_link(*medias, list);
-#ifdef HAVE_MEDIA_APPLICATION
g_mutex_lock (&manager->priv->appdata_mutex);
list = manager->priv->appdata_info;
@@ -439,9 +392,7 @@
g_mutex_unlock (&manager->priv->appdata_mutex);
@@ -492,7 +443,6 @@
return get_media_by_account (manager, account, TRUE);
-#ifdef HAVE_MEDIA_APPLICATION
free_appdata_info_locked (PurpleMediaAppDataInfo *info)
@@ -594,10 +544,8 @@
request_pad_unlinked_cb(GstPad *pad, GstPad *peer, gpointer user_data)
@@ -666,9 +614,7 @@
return manager->priv->video_caps;
-#ifdef HAVE_MEDIA_APPLICATION
* Calls the appdata writable callback from the main thread.
* This needs to grab the appdata lock and make sure it didn't get destroyed
@@ -1008,15 +954,12 @@
g_mutex_unlock (&manager->priv->appdata_mutex);
-#endif /* HAVE_MEDIA_APPLICATION */
static PurpleMediaElementInfo *
get_send_application_element_info ()
static PurpleMediaElementInfo *info = NULL;
-#ifdef HAVE_MEDIA_APPLICATION
info = g_object_new(PURPLE_TYPE_MEDIA_ELEMENT_INFO,
@@ -1026,7 +969,6 @@
| PURPLE_MEDIA_ELEMENT_ONE_SRC,
"create-cb", create_send_appsrc, NULL);
@@ -1036,7 +978,6 @@
static PurpleMediaElementInfo *info = NULL;
-#ifdef HAVE_MEDIA_APPLICATION
info = g_object_new(PURPLE_TYPE_MEDIA_ELEMENT_INFO,
@@ -1046,7 +987,6 @@
| PURPLE_MEDIA_ELEMENT_ONE_SINK,
"create-cb", create_recv_appsink, NULL);
@@ -1367,14 +1307,12 @@
purple_media_manager_create_output_window(PurpleMediaManager *manager,
PurpleMedia *media, const gchar *session_id,
const gchar *participant)
g_return_val_if_fail(PURPLE_IS_MEDIA(media), FALSE);
@@ -1430,9 +1368,6 @@
@@ -1440,7 +1375,6 @@
PurpleMedia *media, const gchar *session_id,
const gchar *participant)
PurpleMediaOutputWindow *output_window;
g_return_val_if_fail(PURPLE_IS_MEDIA_MANAGER(manager), FALSE);
@@ -1461,16 +1395,12 @@
return output_window->id;
purple_media_manager_remove_output_window(PurpleMediaManager *manager,
PurpleMediaOutputWindow *output_window = NULL;
@@ -1546,9 +1476,6 @@
@@ -1556,7 +1483,6 @@
PurpleMedia *media, const gchar *session_id,
const gchar *participant)
g_return_if_fail(PURPLE_IS_MEDIA(media));
@@ -1575,14 +1501,12 @@
purple_media_manager_set_ui_caps(PurpleMediaManager *manager,
g_return_if_fail(PURPLE_IS_MEDIA_MANAGER(manager));
@@ -1595,43 +1519,32 @@
purple_media_manager_signals[UI_CAPS_CHANGED],
purple_media_manager_get_ui_caps(PurpleMediaManager *manager)
g_return_val_if_fail(PURPLE_IS_MEDIA_MANAGER(manager),
return manager->priv->ui_caps;
- return PURPLE_MEDIA_CAPS_NONE;
purple_media_manager_set_backend_type(PurpleMediaManager *manager,
g_return_if_fail(PURPLE_IS_MEDIA_MANAGER(manager));
manager->priv->backend_type = backend_type;
purple_media_manager_get_backend_type(PurpleMediaManager *manager)
g_return_val_if_fail(PURPLE_IS_MEDIA_MANAGER(manager),
return manager->priv->backend_type;
@@ -1640,7 +1553,6 @@
const gchar *participant, PurpleMediaAppDataCallbacks *callbacks,
gpointer user_data, GDestroyNotify notify)
-#ifdef HAVE_MEDIA_APPLICATION
PurpleMediaAppDataInfo * info = ensure_app_data_info_and_lock (manager,
media, session_id, participant);
@@ -1673,7 +1585,6 @@
g_mutex_unlock (&manager->priv->appdata_mutex);
@@ -1681,7 +1592,6 @@
PurpleMediaManager *manager, PurpleMedia *media, const gchar *session_id,
const gchar *participant, gpointer buffer, guint size, gboolean blocking)
-#ifdef HAVE_MEDIA_APPLICATION
PurpleMediaAppDataInfo * info = get_app_data_info_and_lock (manager,
media, session_id, participant);
@@ -1711,9 +1621,6 @@
g_mutex_unlock (&manager->priv->appdata_mutex);
@@ -1722,7 +1629,6 @@
const gchar *participant, gpointer buffer, guint max_size,
-#ifdef HAVE_MEDIA_APPLICATION
PurpleMediaAppDataInfo * info = get_app_data_info_and_lock (manager,
media, session_id, participant);
@@ -1798,13 +1704,8 @@
g_mutex_unlock (&manager->priv->appdata_mutex);
videosink_disable_last_sample(GstElement *sink)
@@ -2289,7 +2190,6 @@
@@ -2305,7 +2205,6 @@
struct _PurpleMediaElementInfoPrivate
@@ -2493,4 +2392,3 @@
--- a/pidgin/gtkblist.c Fri Aug 12 01:29:41 2022 -0500
+++ b/pidgin/gtkblist.c Fri Aug 12 01:32:07 2022 -0500
@@ -406,7 +406,6 @@
g_simple_action_set_state(action, state);
pidgin_blist_menu_audio_call_cb(G_GNUC_UNUSED GSimpleAction *action,
G_GNUC_UNUSED GVariant *parameter,
@@ -419,7 +418,6 @@
purple_buddy_get_name(buddy),
pidgin_blist_menu_block_cb(GSimpleAction *action, GVariant *state,
@@ -612,7 +610,6 @@
gtk_native_dialog_show(GTK_NATIVE_DIALOG(win));
pidgin_blist_menu_video_call_cb(G_GNUC_UNUSED GSimpleAction *action,
G_GNUC_UNUSED GVariant *parameter,
@@ -638,7 +635,6 @@
purple_protocol_initiate_media(account, buddy_name, PURPLE_MEDIA_VIDEO);
static GActionEntry menu_actions[] = {
@@ -655,11 +651,9 @@
.activate = pidgin_blist_toggle_action,
.change_state = pidgin_blist_menu_autojoin_cb,
.name = "buddy-audio-call",
.activate = pidgin_blist_menu_audio_call_cb,
.activate = pidgin_blist_toggle_action,
@@ -674,11 +668,9 @@
.name = "buddy-send-file",
.activate = pidgin_blist_menu_send_file_cb,
.name = "buddy-video-call",
.activate = pidgin_blist_menu_video_call_cb,
.activate = pidgin_blist_menu_chat_settings_cb,
@@ -1627,7 +1619,6 @@
g_simple_action_set_enabled(G_SIMPLE_ACTION(action), enabled);
PURPLE_PROTOCOL_IMPLEMENTS(protocol, MEDIA, get_caps))
@@ -1646,7 +1637,6 @@
(caps & PURPLE_MEDIA_CAPS_VIDEO);
g_simple_action_set_enabled(G_SIMPLE_ACTION(action), enabled);
/* Set the proper state of the block action. */
action = g_action_map_lookup_action(action_map, "buddy-block");
@@ -3215,12 +3205,10 @@
target = gtk_application_get_menu_by_id(application, "buddy-custom-icon");
g_menu_append_section(target, NULL, G_MENU_MODEL(source));
/* Add the voice and video menu to the buddy menu. */
source = gtk_application_get_menu_by_id(application, "voice-video");
target = gtk_application_get_menu_by_id(application, "buddy-voice-video");
g_menu_append_section(target, NULL, G_MENU_MODEL(source));
static void pidgin_blist_show(PurpleBuddyList *list)