empathy r2554 - trunk/src
- From: xclaesse svn gnome org
- To: svn-commits-list gnome org
- Subject: empathy r2554 - trunk/src
- Date: Tue, 3 Mar 2009 17:34:19 +0000 (UTC)
Author: xclaesse
Date: Tue Mar 3 17:34:19 2009
New Revision: 2554
URL: http://svn.gnome.org/viewvc/empathy?rev=2554&view=rev
Log:
Use livesrc and fsfunnel to funnel the mediastreams to their outputs
Signed-off-by: Sjoerd Simons <sjoerd simons collabora co uk>
Modified:
trunk/src/empathy-call-window.c
Modified: trunk/src/empathy-call-window.c
==============================================================================
--- trunk/src/empathy-call-window.c (original)
+++ trunk/src/empathy-call-window.c Tue Mar 3 17:34:19 2009
@@ -81,8 +81,13 @@
GstElement *pipeline;
GstElement *video_tee;
+ GstElement *funnel;
+ GstElement *liveadder;
+
GladeXML *glade;
guint context_id;
+
+ GMutex *lock;
};
#define GET_PRIV(o) \
@@ -323,6 +328,8 @@
"statusbar", &priv->statusbar,
NULL);
+ priv->lock = g_mutex_new ();
+
gtk_widget_reparent (top_vbox, GTK_WIDGET (self));
empathy_call_window_setup_menubar (self);
@@ -512,10 +519,11 @@
void
empathy_call_window_finalize (GObject *object)
{
- //EmpathyCallWindow *self = EMPATHY_CALL_WINDOW (object);
- //EmpathyCallWindowPriv *priv = GET_PRIV (self);
+ EmpathyCallWindow *self = EMPATHY_CALL_WINDOW (object);
+ EmpathyCallWindowPriv *priv = GET_PRIV (self);
/* free any data held directly by the object here */
+ g_mutex_free (priv->lock);
G_OBJECT_CLASS (empathy_call_window_parent_class)->finalize (object);
}
@@ -551,6 +559,61 @@
gtk_widget_set_sensitive (priv->camera_button, FALSE);
}
+/* Called with global lock held */
+static GstPad *
+empathy_call_window_get_video_sink_pad (EmpathyCallWindow *self)
+{
+ EmpathyCallWindowPriv *priv = GET_PRIV (self);
+ GstPad *pad;
+
+ if (priv->funnel == NULL)
+ {
+ GstElement *output;
+
+ output = empathy_video_widget_get_element (EMPATHY_VIDEO_WIDGET
+ (priv->video_output));
+
+ priv->funnel = gst_element_factory_make ("fsfunnel", NULL);
+
+ gst_bin_add (GST_BIN (priv->pipeline), priv->funnel);
+ gst_bin_add (GST_BIN (priv->pipeline), output);
+
+ gst_element_link (priv->funnel, output);
+
+ gst_element_set_state (priv->funnel, GST_STATE_PLAYING);
+ gst_element_set_state (output, GST_STATE_PLAYING);
+ }
+
+ pad = gst_element_get_request_pad (priv->funnel, "sink%d");
+
+ return pad;
+}
+
+/* Called with global lock held */
+static GstPad *
+empathy_call_window_get_audio_sink_pad (EmpathyCallWindow *self)
+{
+ EmpathyCallWindowPriv *priv = GET_PRIV (self);
+ GstPad *pad;
+
+ if (priv->liveadder == NULL)
+ {
+ priv->liveadder = gst_element_factory_make ("liveadder", NULL);
+
+ gst_bin_add (GST_BIN (priv->pipeline), priv->liveadder);
+ gst_bin_add (GST_BIN (priv->pipeline), priv->audio_output);
+
+ gst_element_link (priv->liveadder, priv->audio_output);
+
+ gst_element_set_state (priv->liveadder, GST_STATE_PLAYING);
+ gst_element_set_state (priv->audio_output, GST_STATE_PLAYING);
+ }
+
+ pad = gst_element_get_request_pad (priv->liveadder, "sink%d");
+
+ return pad;
+}
+
/* Called from the streaming thread */
static void
empathy_call_window_src_added_cb (EmpathyCallHandler *handler,
@@ -558,11 +621,11 @@
{
EmpathyCallWindow *self = EMPATHY_CALL_WINDOW (user_data);
EmpathyCallWindowPriv *priv = GET_PRIV (self);
+ gchar *str;
EmpathyTpCall *call;
-
GstPad *pad;
- GstElement *element;
- gchar *str;
+
+ g_mutex_lock (priv->lock);
g_object_get (priv->handler, "tp-call", &call, NULL);
@@ -583,26 +646,19 @@
switch (media_type)
{
case TP_MEDIA_STREAM_TYPE_AUDIO:
- element = priv->audio_output;
- g_object_ref (element);
+ pad = empathy_call_window_get_audio_sink_pad (self);
break;
case TP_MEDIA_STREAM_TYPE_VIDEO:
- element =
- empathy_video_widget_get_element (
- EMPATHY_VIDEO_WIDGET (priv->video_output));
+ pad = empathy_call_window_get_video_sink_pad (self);
break;
default:
g_assert_not_reached ();
}
- gst_bin_add (GST_BIN (priv->pipeline), element);
-
- pad = gst_element_get_static_pad (element, "sink");
- gst_element_set_state (element, GST_STATE_PLAYING);
-
gst_pad_link (src, pad);
-
gst_object_unref (pad);
+
+ g_mutex_unlock (priv->lock);
}
/* Called from the streaming thread */
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]