[telepathy-stream-engine/master] Set xv device onto actual sink

Olivier Crête olivier.crete at collabora.co.uk
Wed Dec 16 11:54:38 PST 2009


---
 src/videosink.c |   62 ++++++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 61 insertions(+), 1 deletions(-)

diff --git a/src/videosink.c b/src/videosink.c
index 356b7e3..0e894db 100644
--- a/src/videosink.c
+++ b/src/videosink.c
@@ -452,6 +452,42 @@ tp_stream_engine_video_sink_dispose (GObject *object)
 }
 
 
+static GstElement *
+tp_stream_engine_video_sink_get_xv_device (TpStreamEngineVideoSink *self)
+{
+  GstIterator *iter = gst_bin_iterate_all_by_interface (self->priv->bin,
+      GST_TYPE_X_OVERLAY);
+  GstElement *sink = NULL;
+  GstElement *item;
+
+  while (!sink)
+    {
+      switch (gst_iterator_next (iter, &(gpointer)item))
+        {
+        case GST_ITERATOR_OK:
+          if (g_object_has_property (item, "device"))
+            sink = item;
+          else
+            gst_object_unref (item);
+          break;
+        case GST_ITERATOR_RESYNC:
+          if (sink)
+            gst_object_unref (sink);
+          sink = NULL;
+          gst_iterator_resync (iter);
+          break;
+        case GST_ITERATOR_ERROR:
+          break;
+        case GST_ITERATOR_DONE:
+          break;
+        }
+    }
+
+  gst_iterator_free (iter);
+
+  return sink;
+}
+
 static void
 tp_stream_engine_video_sink_set_property  (GObject *object,
     guint property_id,
@@ -466,6 +502,21 @@ tp_stream_engine_video_sink_set_property  (GObject *object,
       self->priv->is_preview = g_value_get_boolean (value);
       break;
     case PROP_XV_DEVICE:
+      {
+        GstElement *xvdevice =
+            tp_stream_engine_video_sink_get_xv_device (self);
+        gchar *current_dev;
+
+        if (!xvdevice)
+          return;
+        g_object_get (xvdevice, "device", &current_dev, NULL);
+        if (strcmp (current_dev, g_value_get_string (value)))
+          {
+            g_object_set_property (xvdevice, "device", value);
+            /* do restart */
+          }
+        gst_objet_unref (xvdevice);
+      }
       break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
@@ -490,7 +541,16 @@ tp_stream_engine_video_sink_get_property  (GObject *object,
       g_value_set_uint (value, self->priv->window_id);
       break;
     case PROP_XV_DEVICE:
-      g_value_set_string (value, self->priv->xv_device);
+      {
+        GstElement *xvdevice =
+            tp_stream_engine_video_sink_get_xv_device (self);
+        gchar *current_dev;
+
+        if (!xvdevice)
+          return;
+        g_object_get_property (xvdevice, "device", value);
+        gst_objet_unref (xvdevice);
+      }
       break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
-- 
1.5.6.5




More information about the telepathy-commits mailing list