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