diff options
author | Gary Kramlich <grim@reaperworld.com> | 2016-06-18 21:09:49 -0500 |
---|---|---|
committer | Gary Kramlich <grim@reaperworld.com> | 2016-06-18 21:09:49 -0500 |
commit | 37356b8f91be0cd0b1508cbd75e0c7305f330714 (patch) | |
tree | 8cf455351fb1bb5831163529087048bc71794938 | |
parent | 53a9f5eb9807d29cfe00836f0b57c9b6ce42b527 (diff) | |
parent | 4ebe17b240c6904cf4157a912151b1dea3a47921 (diff) | |
download | pidgin-37356b8f91be0cd0b1508cbd75e0c7305f330714.tar.gz |
Merged in xhaakon/pidgin/release-2.x.y (pull request #81)
Backport of my patches from Pidgin 3.0
-rw-r--r-- | libpurple/media/backend-fs2.c | 11 | ||||
-rw-r--r-- | libpurple/mediamanager.c | 39 | ||||
-rw-r--r-- | pidgin/gtkft.c | 4 |
3 files changed, 50 insertions, 4 deletions
diff --git a/libpurple/media/backend-fs2.c b/libpurple/media/backend-fs2.c index 1b47374214..40a289bdee 100644 --- a/libpurple/media/backend-fs2.c +++ b/libpurple/media/backend-fs2.c @@ -533,6 +533,8 @@ static void purple_media_backend_fs2_class_init(PurpleMediaBackendFs2Class *klass) { GObjectClass *gobject_class = (GObjectClass*)klass; + GList *features; + GList *it; gobject_class->dispose = purple_media_backend_fs2_dispose; gobject_class->finalize = purple_media_backend_fs2_finalize; @@ -544,6 +546,15 @@ purple_media_backend_fs2_class_init(PurpleMediaBackendFs2Class *klass) g_object_class_override_property(gobject_class, PROP_MEDIA, "media"); g_type_class_add_private(klass, sizeof(PurpleMediaBackendFs2Private)); + + /* VA-API elements aren't well supported in Farstream. Ignore them. */ + features = gst_registry_get_feature_list_by_plugin(gst_registry_get(), + "vaapi"); + for (it = features; it; it = it->next) { + gst_plugin_feature_set_rank((GstPluginFeature *)it->data, + GST_RANK_NONE); + } + gst_plugin_feature_list_free(features); } static void diff --git a/libpurple/mediamanager.c b/libpurple/mediamanager.c index a540134137..3a17a323ac 100644 --- a/libpurple/mediamanager.c +++ b/libpurple/mediamanager.c @@ -491,14 +491,18 @@ purple_media_manager_remove_media(PurpleMediaManager *manager, PurpleMedia *medi #ifdef HAVE_MEDIA_APPLICATION g_mutex_lock (&manager->priv->appdata_mutex); - for (list = manager->priv->appdata_info; list; list = list->next) { + list = manager->priv->appdata_info; + while (list) { PurpleMediaAppDataInfo *info = list->data; + GList *next = list->next; if (info->media == media) { manager->priv->appdata_info = g_list_delete_link ( manager->priv->appdata_info, list); free_appdata_info_locked (info); } + + list = next; } g_mutex_unlock (&manager->priv->appdata_mutex); #endif @@ -558,9 +562,24 @@ purple_media_manager_get_private_media_by_account(PurpleMediaManager *manager, static void free_appdata_info_locked (PurpleMediaAppDataInfo *info) { + GstAppSrcCallbacks null_src_cb = { NULL, NULL, NULL, { NULL } }; + GstAppSinkCallbacks null_sink_cb = { NULL, NULL, NULL , { NULL } }; + if (info->notify) info->notify (info->user_data); + info->media = NULL; + if (info->appsrc) { + /* Will call appsrc_destroyed. */ + gst_app_src_set_callbacks (info->appsrc, &null_src_cb, + NULL, NULL); + } + if (info->appsink) { + /* Will call appsink_destroyed. */ + gst_app_sink_set_callbacks (info->appsink, &null_sink_cb, + NULL, NULL); + } + /* Make sure no other thread is using the structure */ g_free (info->session_id); g_free (info->participant); @@ -867,7 +886,14 @@ appsrc_seek_data (GstAppSrc *appsrc, guint64 offset, gpointer user_data) static void appsrc_destroyed (PurpleMediaAppDataInfo *info) { - PurpleMediaManager *manager = purple_media_manager_get (); + PurpleMediaManager *manager; + + if (!info->media) { + /* PurpleMediaAppDataInfo is being freed. Return at once. */ + return; + } + + manager = purple_media_manager_get (); g_mutex_lock (&manager->priv->appdata_mutex); info->appsrc = NULL; @@ -1025,7 +1051,14 @@ appsink_new_sample (GstAppSink *appsink, gpointer user_data) static void appsink_destroyed (PurpleMediaAppDataInfo *info) { - PurpleMediaManager *manager = purple_media_manager_get (); + PurpleMediaManager *manager; + + if (!info->media) { + /* PurpleMediaAppDataInfo is being freed. Return at once. */ + return; + } + + manager = purple_media_manager_get (); g_mutex_lock (&manager->priv->appdata_mutex); info->appsink = NULL; diff --git a/pidgin/gtkft.c b/pidgin/gtkft.c index b000b0489c..e67ad7b598 100644 --- a/pidgin/gtkft.c +++ b/pidgin/gtkft.c @@ -504,7 +504,9 @@ open_button_cb(GtkButton *button, PidginXferDialog *dialog) } else { - purple_notify_uri(NULL, filename); + gchar *uri = g_strdup_printf("file://%s", filename); + purple_notify_uri(NULL, uri); + g_free(uri); return; } |