configure: require libpurple >= 2.8.0 for voice and video
[siplcs.git] / contrib / media-patches / purple_media_fs2_dispose.patch
blobb12312c6e69e851a1e4f54e03f6b730c889b8a24
1 From 528aec37edb45e33ac1dd1ee7f28238ca0fdd65a Mon Sep 17 00:00:00 2001
2 From: Jakub Adam <jakub.adam@ktknet.cz>
3 Date: Sat, 18 Dec 2010 21:52:49 +0100
4 Subject: [PATCH] Hanging up a video call freezes other running calls
6 ---
7 libpurple/media/backend-fs2.c | 23 ++++++++++++++++++++++-
8 libpurple/mediamanager.c | 2 ++
9 2 files changed, 24 insertions(+), 1 deletions(-)
11 diff --git a/libpurple/media/backend-fs2.c b/libpurple/media/backend-fs2.c
12 index 54c4d5b..08eea5f 100644
13 --- a/libpurple/media/backend-fs2.c
14 +++ b/libpurple/media/backend-fs2.c
15 @@ -129,6 +129,8 @@ struct _PurpleMediaBackendFs2Session
16 GstElement *src;
17 GstElement *tee;
19 + GstPad *srcpad;
21 PurpleMediaSessionType type;
24 @@ -171,6 +173,22 @@ purple_media_backend_fs2_dispose(GObject *obj)
25 pipeline = purple_media_manager_get_pipeline(
26 purple_media_get_manager(priv->media));
28 + /* All connections to media sources should be blocked before confbin is
29 + * removed, to prevent freezing of any other simultaneously running
30 + * media calls. */
31 + if (priv->sessions) {
32 + GList *sessions = g_hash_table_get_values(priv->sessions);
33 + for (; sessions; sessions =
34 + g_list_delete_link(sessions, sessions)) {
35 + PurpleMediaBackendFs2Session *session = sessions->data;
36 + if (session->srcpad) {
37 + gst_pad_set_blocked(session->srcpad, TRUE);
38 + gst_object_unref(session->srcpad);
39 + session->srcpad = NULL;
40 + }
41 + }
42 + }
44 gst_element_set_locked_state(priv->confbin, TRUE);
45 gst_element_set_state(GST_ELEMENT(priv->confbin),
46 GST_STATE_NULL);
47 @@ -1263,6 +1281,7 @@ create_src(PurpleMediaBackendFs2 *self, const gchar *sess_id,
48 session_type_to_fs_stream_direction(type);
49 GstElement *src;
50 GstPad *sinkpad, *srcpad;
51 + GstPad *ghost = NULL;
53 if ((type_direction & FS_DIRECTION_SEND) == 0)
54 return TRUE;
55 @@ -1302,7 +1321,7 @@ create_src(PurpleMediaBackendFs2 *self, const gchar *sess_id,
56 if (GST_ELEMENT_PARENT(priv->confbin)
57 == GST_ELEMENT_PARENT(session->src)) {
58 GstPad *pad = gst_element_get_static_pad(session->tee, "sink");
59 - GstPad *ghost = gst_ghost_pad_new(NULL, pad);
60 + ghost = gst_ghost_pad_new(NULL, pad);
61 gst_object_unref(pad);
62 gst_pad_set_active(ghost, TRUE);
63 gst_element_add_pad(priv->confbin, ghost);
64 @@ -1310,6 +1329,8 @@ create_src(PurpleMediaBackendFs2 *self, const gchar *sess_id,
66 gst_element_set_state(session->tee, GST_STATE_PLAYING);
67 gst_element_link(session->src, priv->confbin);
68 + if (ghost)
69 + session->srcpad = gst_pad_get_peer(ghost);
71 g_object_get(session->session, "sink-pad", &sinkpad, NULL);
72 if (session->type & PURPLE_MEDIA_SEND_AUDIO) {
73 diff --git a/libpurple/mediamanager.c b/libpurple/mediamanager.c
74 index e6f8a46..584eb34 100644
75 --- a/libpurple/mediamanager.c
76 +++ b/libpurple/mediamanager.c
77 @@ -400,6 +400,8 @@ request_pad_unlinked_cb(GstPad *pad, GstPad *peer, gpointer user_data)
78 GstIteratorResult result;
80 gst_element_release_request_pad(GST_ELEMENT_PARENT(pad), pad);
81 + gst_pad_set_blocked(pad, FALSE);
83 iter = gst_element_iterate_src_pads(parent);
85 result = gst_iterator_next(iter, (gpointer)&remaining_pad);
86 --
87 1.7.2.3