[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", ¤t_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