[telepathy-stream-engine/master] Add GetPreviewWindow call to get a single preview window

Olivier Crête olivier.crete at collabora.co.uk
Fri May 29 11:25:12 PDT 2009


---
 api/Stream_Engine.xml  |    3 +
 src/tp-stream-engine.c |  100 ++++++++++++++++++++++++++++++++++++++++++------
 2 files changed, 91 insertions(+), 12 deletions(-)

diff --git a/api/Stream_Engine.xml b/api/Stream_Engine.xml
index 67109f5..84d357f 100644
--- a/api/Stream_Engine.xml
+++ b/api/Stream_Engine.xml
@@ -9,6 +9,9 @@
     <method name="CreatePreviewWindow">
       <arg direction="out" type="u" name="window" />
     </method>
+    <method name="GetPreviewWindow">
+      <arg direction="out" type="u" name="window" />
+    </method>
     <signal name="Receiving">
       <arg type="o" name="channel_path" />
       <arg type="u" name="stream_id" />
diff --git a/src/tp-stream-engine.c b/src/tp-stream-engine.c
index 2087fa3..8699f35 100644
--- a/src/tp-stream-engine.c
+++ b/src/tp-stream-engine.c
@@ -143,6 +143,8 @@ struct _TpStreamEnginePrivate
   GList *output_sinks;
   GList *preview_sinks;
 
+  TpStreamEngineVideoPreview *preview;
+
   guint bus_async_source_id;
 };
 
@@ -350,6 +352,10 @@ tp_stream_engine_dispose (GObject *object)
   g_list_free (priv->preview_sinks);
   priv->preview_sinks = NULL;
 
+  if (priv->preview)
+    g_object_unref (priv->preview);
+  priv->preview = NULL;
+
   if (priv->pipeline)
     {
       /*
@@ -833,6 +839,12 @@ bus_sync_handler (GstBus *bus G_GNUC_UNUSED, GstMessage *message, gpointer data)
 
 
   g_mutex_lock (self->priv->mutex);
+
+  handled = tp_stream_engine_video_sink_bus_sync_message (self->priv->preview,
+      message);
+  if (handled)
+    goto done;
+
   for (item = g_list_first (self->priv->preview_sinks);
        item && !handled;
        item = g_list_next (item))
@@ -841,25 +853,25 @@ bus_sync_handler (GstBus *bus G_GNUC_UNUSED, GstMessage *message, gpointer data)
 
       handled = tp_stream_engine_video_sink_bus_sync_message (preview, message);
       if (handled)
-        break;
+        goto done;
     }
 
-  if (!handled)
+  for (item = g_list_first (self->priv->output_sinks);
+       item && !handled;
+       item = g_list_next (item))
     {
-      for (item = g_list_first (self->priv->output_sinks);
-           item && !handled;
-           item = g_list_next (item))
-        {
-          TpStreamEngineVideoSink *output = item->data;
+      TpStreamEngineVideoSink *output = item->data;
 
-          handled = tp_stream_engine_video_sink_bus_sync_message (output,
-              message);
-          if (handled)
-            break;
-        }
+      handled = tp_stream_engine_video_sink_bus_sync_message (output,
+          message);
+      if (handled)
+        goto done;
     }
+
+ done:
   g_mutex_unlock (self->priv->mutex);
 
+
   if (handled)
     {
       gst_message_unref (message);
@@ -1095,6 +1107,69 @@ tp_stream_engine_create_preview_window (StreamEngineSvcStreamEngine *iface,
 }
 
 
+/**
+ * tp_stream_engine_get_preview_window
+ *
+ * Implements DBus method GetPreviewWindow
+ * on interface org.maemo.Telepathy.StreamEngine
+ */
+static void
+tp_stream_engine_get_preview_window (StreamEngineSvcStreamEngine *iface,
+    DBusGMethodInvocation *context)
+{
+  TpStreamEngine *self = TP_STREAM_ENGINE (iface);
+  GError *error = NULL;
+  GstPad *pad;
+  TpStreamEngineVideoPreview *preview;
+  guint window_id;
+
+  g_mutex_lock (self->priv->mutex);
+  if (self->priv->preview)
+    {
+      g_object_get (self->priv->preview, "window-id", &window_id, NULL);
+      g_mutex_unlock (self->priv->mutex);
+      stream_engine_svc_stream_engine_return_from_create_preview_window (
+          context,
+          window_id);
+      return;
+    }
+  g_mutex_unlock (self->priv->mutex);
+
+  preview = tp_stream_engine_video_preview_new (GST_BIN (self->priv->pipeline),
+      &error);
+
+  if (!preview)
+    {
+      dbus_g_method_return_error (context, error);
+      g_clear_error (&error);
+      return;
+    }
+
+  g_mutex_lock (self->priv->mutex);
+  if (self->priv->preview)
+    {
+      g_object_get (self->priv->preview, "window-id", &window_id, NULL);
+      g_mutex_unlock (self->priv->mutex);
+      stream_engine_svc_stream_engine_return_from_create_preview_window (
+          context,
+          window_id);
+      g_object_unref (preview);
+      return;
+    }
+  self->priv->preview = preview;
+  g_mutex_unlock (self->priv->mutex);
+
+  pad = gst_element_get_request_pad (self->priv->videotee, "src%d");
+
+  g_object_set (preview, "pad", pad, NULL);
+
+  g_object_get (preview, "window-id", &window_id, NULL);
+
+  stream_engine_svc_stream_engine_return_from_create_preview_window (context,
+      window_id);
+}
+
+
 static void
 handler_result (TfChannel *chan G_GNUC_UNUSED,
     GError *error,
@@ -1386,6 +1461,7 @@ se_iface_init (gpointer iface, gpointer data G_GNUC_UNUSED)
     klass, tp_stream_engine_##x)
   IMPLEMENT (get_output_window);
   IMPLEMENT (create_preview_window);
+  IMPLEMENT (get_preview_window);
   IMPLEMENT (shutdown);
   IMPLEMENT (attach_to_channel);
 #undef IMPLEMENT
-- 
1.5.6.5



More information about the telepathy-commits mailing list