[telepathy-stream-engine/master] Restart sink when the xv adapter is changed

Olivier Crête olivier.crete at collabora.co.uk
Wed Dec 16 12:26:19 PST 2009


---
 src/videosink.c |   52 ++++++++++++++++++++++++++++++++++++++++++++--------
 1 files changed, 44 insertions(+), 8 deletions(-)

diff --git a/src/videosink.c b/src/videosink.c
index 0e894db..c8387f2 100644
--- a/src/videosink.c
+++ b/src/videosink.c
@@ -455,18 +455,19 @@ 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,
+  GstIterator *iter = gst_bin_iterate_all_by_interface (
+      GST_BIN (self->priv->sink),
       GST_TYPE_X_OVERLAY);
   GstElement *sink = NULL;
-  GstElement *item;
+  gpointer item;
 
   while (!sink)
     {
-      switch (gst_iterator_next (iter, &(gpointer)item))
+      switch (gst_iterator_next (iter, &item))
         {
         case GST_ITERATOR_OK:
-          if (g_object_has_property (item, "device"))
-            sink = item;
+          if (g_object_has_property (G_OBJECT (item), "device"))
+            sink = GST_ELEMENT (item);
           else
             gst_object_unref (item);
           break;
@@ -489,6 +490,31 @@ tp_stream_engine_video_sink_get_xv_device (TpStreamEngineVideoSink *self)
 }
 
 static void
+do_nothing_cb (GstPad *pad, gboolean blocked, gpointer data)
+{
+}
+
+static void
+restart_sink_pad_blocked (GstPad *pad, gboolean blocked, gpointer data)
+{
+  TpStreamEngineVideoSink *self = data;
+  GstPad *peerpad;
+  GstElement *sink;
+
+  peerpad = gst_pad_get_peer (pad);
+  g_assert (peerpad);
+
+  sink = gst_pad_get_parent_element (peerpad);
+
+  gst_element_set_state (sink, GST_STATE_NULL);
+  gst_element_sync_state_with_parent (sink);
+
+  gst_object_unref (sink);
+  gst_object_unref (peerpad);
+  gst_pad_set_blocked_async (pad, FALSE, do_nothing_cb, NULL);
+}
+
+static void
 tp_stream_engine_video_sink_set_property  (GObject *object,
     guint property_id,
     const GValue *value,
@@ -512,10 +538,20 @@ tp_stream_engine_video_sink_set_property  (GObject *object,
         g_object_get (xvdevice, "device", &current_dev, NULL);
         if (strcmp (current_dev, g_value_get_string (value)))
           {
+            GstPad *sinkpad;
+            GstPad *srcpad;
             g_object_set_property (xvdevice, "device", value);
-            /* do restart */
+
+            sinkpad = gst_element_get_static_pad (xvdevice, "sink");
+            g_assert (sinkpad);
+            srcpad = gst_pad_get_peer (sinkpad);
+            g_assert (sinkpad);
+            gst_object_unref (sinkpad);
+
+            gst_pad_set_blocked_async (srcpad, TRUE, restart_sink_pad_blocked, self);
+            gst_object_unref (srcpad);
           }
-        gst_objet_unref (xvdevice);
+        gst_object_unref (xvdevice);
       }
       break;
     default:
@@ -549,7 +585,7 @@ tp_stream_engine_video_sink_get_property  (GObject *object,
         if (!xvdevice)
           return;
         g_object_get_property (xvdevice, "device", value);
-        gst_objet_unref (xvdevice);
+        gst_object_unref (xvdevice);
       }
       break;
     default:
-- 
1.5.6.5




More information about the telepathy-commits mailing list