From ed911efc60de1538c4e24ca01f376e25c09a4124 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Olivier=20Cr=C3=AAte?= Date: Fri, 27 Jan 2012 16:50:08 +0100 Subject: Port to GStreamer 0.11 --- farstream/fs-conference.c | 17 ++----- farstream/fs-element-added-notifier.c | 85 +++++++++++++++++++---------------- farstream/fs-plugin.c | 2 + farstream/fs-stream.c | 39 +++++++++------- farstream/fs-transmitter.c | 8 ++-- 5 files changed, 81 insertions(+), 70 deletions(-) (limited to 'farstream') diff --git a/farstream/fs-conference.c b/farstream/fs-conference.c index 160c69cf..58edb776 100644 --- a/farstream/fs-conference.c +++ b/farstream/fs-conference.c @@ -62,9 +62,7 @@ GST_DEBUG_CATEGORY (fs_conference_debug); #define GST_CAT_DEFAULT fs_conference_debug -GST_BOILERPLATE ( - FsConference, fs_conference, - GstBin, GST_TYPE_BIN) +G_DEFINE_ABSTRACT_TYPE (FsConference, fs_conference,GST_TYPE_BIN) GQuark @@ -80,23 +78,16 @@ _fs_conference_init_debug (void) "farstream base conference library"); } -static void -fs_conference_base_init (gpointer g_class) -{ - _fs_conference_init_debug (); -} - - - static void fs_conference_class_init (FsConferenceClass * klass) { + _fs_conference_init_debug (); } static void -fs_conference_init (FsConference *conf, FsConferenceClass *bclass) +fs_conference_init (FsConference *conf) { - GST_DEBUG ("fs_conference_init"); + GST_DEBUG_OBJECT (conf, "fs_conference_init"); } diff --git a/farstream/fs-element-added-notifier.c b/farstream/fs-element-added-notifier.c index 637a3937..aac3da63 100644 --- a/farstream/fs-element-added-notifier.c +++ b/farstream/fs-element-added-notifier.c @@ -158,45 +158,53 @@ fs_element_added_notifier_add (FsElementAddedNotifier *notifier, } + static void -_bin_unparented_cb (GstObject *object, GstObject *parent, gpointer user_data) +_element_removed_callback (GstBin *bin, GstElement *element, + FsElementAddedNotifier *notifier) { - GstIterator *iter = NULL; - gboolean done; /* Return if there was no handler connected */ - if (g_signal_handlers_disconnect_by_func (object, _element_added_callback, - user_data) == 0) + if (g_signal_handlers_disconnect_by_func (element, _element_added_callback, + notifier) == 0 || + g_signal_handlers_disconnect_by_func (element, _element_removed_callback, + notifier) == 0) return; - iter = gst_bin_iterate_elements (GST_BIN (object)); - - done = FALSE; - while (!done) + if (GST_IS_BIN (element)) { - gpointer item; - - switch (gst_iterator_next (iter, &item)) { - case GST_ITERATOR_OK: - if (GST_IS_BIN (item)) - _bin_unparented_cb (GST_OBJECT (item), object, user_data); - gst_object_unref (item); - break; - case GST_ITERATOR_RESYNC: - // We don't rollback anything, we just ignore already processed ones - gst_iterator_resync (iter); - break; - case GST_ITERATOR_ERROR: - g_error ("Wrong parameters were given?"); - done = TRUE; - break; - case GST_ITERATOR_DONE: - done = TRUE; - break; + GstIterator *iter = NULL; + gboolean done; + iter = gst_bin_iterate_elements (GST_BIN (element)); + + done = FALSE; + while (!done) + { + GValue item = {0,}; + + switch (gst_iterator_next (iter, &item)) { + case GST_ITERATOR_OK: + _element_removed_callback (GST_BIN (element), + GST_ELEMENT (g_value_get_object (&item)), + notifier); + g_value_reset (&item); + break; + case GST_ITERATOR_RESYNC: + // We don't rollback anything, we just ignore already processed ones + gst_iterator_resync (iter); + break; + case GST_ITERATOR_ERROR: + g_error ("Wrong parameters were given?"); + done = TRUE; + break; + case GST_ITERATOR_DONE: + done = TRUE; + break; + } } - } - gst_iterator_free (iter); + gst_iterator_free (iter); + } } @@ -222,7 +230,7 @@ fs_element_added_notifier_remove (FsElementAddedNotifier *notifier, 0, 0, NULL, /* id, detail, closure */ _element_added_callback, notifier) != 0) { - _bin_unparented_cb (GST_OBJECT (bin), NULL, notifier); + _element_removed_callback (NULL, GST_ELEMENT (bin), notifier); return TRUE; } else @@ -380,26 +388,27 @@ _element_added_callback (GstBin *parent, GstElement *element, g_signal_connect_object (element, "element-added", G_CALLBACK (_element_added_callback), notifier, 0); - if (parent) - g_signal_connect_object (element, "parent-unset", - G_CALLBACK (_bin_unparented_cb), notifier, 0); + + g_signal_connect_object (element, "element-removed", + G_CALLBACK (_element_removed_callback), notifier, 0); iter = gst_bin_iterate_elements (GST_BIN (element)); done = FALSE; while (!done) { - gpointer item = NULL; + GValue item = {0,}; switch (gst_iterator_next (iter, &item)) { case GST_ITERATOR_OK: /* We make sure the callback has not already been added */ - if (g_signal_handler_find (item, + if (g_signal_handler_find (g_value_get_object (&item), G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA, 0, 0, NULL, /* id, detail, closure */ _element_added_callback, notifier) == 0) - _element_added_callback (GST_BIN_CAST (element), item, notifier); - gst_object_unref (item); + _element_added_callback (GST_BIN_CAST (element), + g_value_get_object (&item), notifier); + g_value_reset (&item); break; case GST_ITERATOR_RESYNC: // We don't rollback anything, we just ignore already processed ones diff --git a/farstream/fs-plugin.c b/farstream/fs-plugin.c index 423cf719..578a15e3 100644 --- a/farstream/fs-plugin.c +++ b/farstream/fs-plugin.c @@ -315,6 +315,8 @@ fs_plugin_list_available (const gchar *type_suffix) GError *error = NULL; gchar *tmp1, *tmp2, *tmp3; + _fs_conference_init_debug (); + g_static_mutex_lock (&mutex); fs_plugin_search_path_init (); diff --git a/farstream/fs-stream.c b/farstream/fs-stream.c index 110641d8..28a101fc 100644 --- a/farstream/fs-stream.c +++ b/farstream/fs-stream.c @@ -147,6 +147,7 @@ struct _FsStreamPrivate G_DEFINE_ABSTRACT_TYPE(FsStream, fs_stream, GST_TYPE_OBJECT); +static void fs_stream_constructed (GObject *obj); static void fs_stream_get_property (GObject *object, guint prop_id, GValue *value, @@ -157,6 +158,8 @@ static void fs_stream_set_property (GObject *object, GParamSpec *pspec); static void fs_stream_finalize (GObject *obj); +static void fs_stream_pad_removed (FsStream *stream, GstPad *pad); + static guint signals[LAST_SIGNAL] = { 0 }; #define FS_STREAM_LOCK(self) g_mutex_lock((self)->priv->mutex) @@ -172,6 +175,8 @@ fs_stream_class_init (FsStreamClass *klass) gobject_class->set_property = fs_stream_set_property; gobject_class->get_property = fs_stream_get_property; gobject_class->finalize = fs_stream_finalize; + gobject_class->constructed = fs_stream_constructed; + /** * FsStream:remote-codecs: @@ -335,6 +340,22 @@ fs_stream_init (FsStream *self) self->priv->mutex = g_mutex_new (); } +static void +fs_stream_constructed (GObject *obj) +{ + FsStream *stream = FS_STREAM (obj); + FsSession *session; + FsConference *conference; + + g_object_get (stream, "session", &session, NULL); + g_object_get (session, "conference", &conference, NULL); + + g_signal_connect_object (conference, "pad-removed", + G_CALLBACK (fs_stream_pad_removed), obj, G_CONNECT_SWAPPED); + g_object_unref (session); + g_object_unref (conference); +} + static void fs_stream_finalize (GObject *obj) { @@ -529,12 +550,10 @@ fs_stream_emit_error (FsStream *stream, static void -src_pad_parent_unset (GstObject *srcpad, GstObject *parent, gpointer user_data) +fs_stream_pad_removed (FsStream *stream, GstPad *pad) { - FsStream *stream = FS_STREAM (user_data); - FS_STREAM_LOCK (stream); - stream->priv->src_pads = g_list_remove (stream->priv->src_pads, srcpad); + stream->priv->src_pads = g_list_remove (stream->priv->src_pads, pad); stream->priv->src_pads_cookie++; FS_STREAM_UNLOCK (stream); } @@ -558,21 +577,11 @@ fs_stream_emit_src_pad_added (FsStream *stream, g_assert (!g_list_find (stream->priv->src_pads, pad)); stream->priv->src_pads = g_list_append (stream->priv->src_pads, pad); stream->priv->src_pads_cookie++; - g_signal_connect_object (pad, "parent-unset", - G_CALLBACK (src_pad_parent_unset), stream, 0); FS_STREAM_UNLOCK (stream); g_signal_emit (stream, signals[SRC_PAD_ADDED], 0, pad, codec); } -static GstIteratorItem -src_pad_iterator_item_func (GstIterator*iter, gpointer item) -{ - gst_object_ref (item); - - return GST_ITERATOR_ITEM_PASS; -} - /** * fs_stream_iterate_src_pads: * @stream: a #FsStream @@ -589,7 +598,7 @@ fs_stream_iterate_src_pads (FsStream *stream) { return gst_iterator_new_list (GST_TYPE_PAD, stream->priv->mutex, &stream->priv->src_pads_cookie, &stream->priv->src_pads, - g_object_ref (stream), src_pad_iterator_item_func, g_object_unref); + g_object_ref (stream), NULL); } diff --git a/farstream/fs-transmitter.c b/farstream/fs-transmitter.c index d0c52c18..419ac65c 100644 --- a/farstream/fs-transmitter.c +++ b/farstream/fs-transmitter.c @@ -107,8 +107,8 @@ fs_transmitter_class_init (FsTransmitterClass *klass) * FsTransmitter:gst-src: * * A network source #GstElement to be used by the #FsSession - * This element MUST provide a source pad named "src%d" per component. - * These pads number must start at 1 (the %d corresponds to the component + * This element MUST provide a source pad named "src_%u" per component. + * These pads number must start at 1 (the %u corresponds to the component * number). * These pads MUST be static pads. * @@ -126,8 +126,8 @@ fs_transmitter_class_init (FsTransmitterClass *klass) * * A network source #GstElement to be used by the #FsSession * These element's sink must have async=FALSE - * This element MUST provide a pad named "sink\%d" per component. - * These pads number must start at 1 (the \%d corresponds to the component + * This element MUST provide a pad named "sink_\%u" per component. + * These pads number must start at 1 (the \%u corresponds to the component * number). * These pads MUST be static pads. * -- cgit v1.2.1