[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