aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/empathy-call-window.c67
1 files changed, 67 insertions, 0 deletions
diff --git a/src/empathy-call-window.c b/src/empathy-call-window.c
index 97106be12..59e833881 100644
--- a/src/empathy-call-window.c
+++ b/src/empathy-call-window.c
@@ -199,6 +199,9 @@ struct _EmpathyCallWindowPriv
EmpathyCallWindowFullscreen *fullscreen;
gboolean is_fullscreen;
+ gboolean got_video;
+ guint got_video_src;
+
/* Those fields represent the state of the window before it actually was in
fullscreen mode. */
gboolean sidebar_was_visible_before_fs;
@@ -590,6 +593,16 @@ empathy_call_window_create_audio_input (EmpathyCallWindow *self)
}
static void
+empathy_call_window_show_video_output (EmpathyCallWindow *self,
+ gboolean show)
+{
+ if (self->priv->video_output != NULL)
+ g_object_set (self->priv->video_output, "visible", show, NULL);
+
+ gtk_widget_set_visible (self->priv->remote_user_avatar_widget, !show);
+}
+
+static void
create_video_output_widget (EmpathyCallWindow *self)
{
EmpathyCallWindowPriv *priv = GET_PRIV (self);
@@ -1634,6 +1647,12 @@ empathy_call_window_dispose (GObject *object)
priv->bus_message_source_id = 0;
}
+ if (priv->got_video_src > 0)
+ {
+ g_source_remove (priv->got_video_src);
+ priv->got_video_src = 0;
+ }
+
tp_clear_object (&priv->pipeline);
tp_clear_object (&priv->video_input);
tp_clear_object (&priv->audio_input);
@@ -1869,6 +1888,11 @@ empathy_call_window_disconnected (EmpathyCallWindow *self,
if (priv->video_output != NULL)
clutter_actor_destroy (priv->video_output);
priv->video_output = NULL;
+ if (priv->got_video_src > 0)
+ {
+ g_source_remove (priv->got_video_src);
+ priv->got_video_src = 0;
+ }
gtk_widget_show (priv->remote_user_avatar_widget);
@@ -2358,6 +2382,42 @@ emapthy_call_window_show_video_output_cb (gpointer user_data)
return FALSE;
}
+static gboolean
+empathy_call_window_check_video_cb (gpointer data)
+{
+ EmpathyCallWindow *self = data;
+
+ if (self->priv->got_video)
+ {
+ self->priv->got_video = FALSE;
+ return TRUE;
+ }
+
+ /* No video in the last N seconds, display the remote avatar */
+ empathy_call_window_show_video_output (self, FALSE);
+
+ return TRUE;
+}
+
+/* Called from the streaming thread */
+static gboolean
+empathy_call_window_video_probe_cb (GstPad *pad,
+ GstMiniObject *mini_obj,
+ EmpathyCallWindow *self)
+{
+ if (G_UNLIKELY (!self->priv->got_video))
+ {
+ /* show the remote video */
+ g_idle_add_full (G_PRIORITY_DEFAULT_IDLE,
+ emapthy_call_window_show_video_output_cb,
+ g_object_ref (self), g_object_unref);
+
+ self->priv->got_video = TRUE;
+ }
+
+ return TRUE;
+}
+
/* Called from the streaming thread */
static gboolean
empathy_call_window_src_added_cb (EmpathyCallHandler *handler,
@@ -2379,6 +2439,13 @@ empathy_call_window_src_added_cb (EmpathyCallHandler *handler,
case TP_MEDIA_STREAM_TYPE_VIDEO:
g_idle_add (emapthy_call_window_show_video_output_cb, self);
pad = empathy_call_window_get_video_sink_pad (self);
+
+ gst_pad_add_data_probe (src,
+ G_CALLBACK (empathy_call_window_video_probe_cb), self);
+ if (priv->got_video_src > 0)
+ g_source_remove (priv->got_video_src);
+ priv->got_video_src = g_timeout_add_seconds (5,
+ empathy_call_window_check_video_cb, self);
break;
default:
g_assert_not_reached ();