summaryrefslogtreecommitdiff
path: root/farstream
diff options
context:
space:
mode:
authorOlivier CrĂȘte <olivier.crete@collabora.com>2012-05-02 17:36:28 -0400
committerOlivier CrĂȘte <olivier.crete@collabora.com>2012-10-02 13:35:17 -0400
commit1b77821dd10a08b2a23325b700384ac8b6bdcebb (patch)
tree5d55793af4abd10ee8bc23af122769c7f8af5dc8 /farstream
parent895b34c4dab9840c478816e8713c29d12c321a7e (diff)
downloadfarstream-1b77821dd10a08b2a23325b700384ac8b6bdcebb.tar.gz
stream: Keep ref to src pads for iterator to not break
Diffstat (limited to 'farstream')
-rw-r--r--farstream/fs-stream.c18
1 files changed, 13 insertions, 5 deletions
diff --git a/farstream/fs-stream.c b/farstream/fs-stream.c
index e74c7187..3034300c 100644
--- a/farstream/fs-stream.c
+++ b/farstream/fs-stream.c
@@ -361,7 +361,7 @@ fs_stream_finalize (GObject *obj)
{
FsStream *stream = FS_STREAM (obj);
- g_list_free (stream->priv->src_pads);
+ g_list_free_full (stream->priv->src_pads, gst_object_unref);
g_mutex_clear (&stream->priv->mutex);
G_OBJECT_CLASS (fs_stream_parent_class)->finalize (obj);
@@ -552,9 +552,16 @@ fs_stream_emit_error (FsStream *stream,
static void
fs_stream_pad_removed (FsStream *stream, GstPad *pad)
{
+ GList *item;
+
FS_STREAM_LOCK (stream);
- stream->priv->src_pads = g_list_remove (stream->priv->src_pads, pad);
- stream->priv->src_pads_cookie++;
+ item = g_list_find (stream->priv->src_pads, pad);
+ if (item)
+ {
+ stream->priv->src_pads = g_list_delete_link (stream->priv->src_pads, item);
+ gst_object_unref (pad);
+ stream->priv->src_pads_cookie++;
+ }
FS_STREAM_UNLOCK (stream);
}
@@ -575,7 +582,8 @@ fs_stream_emit_src_pad_added (FsStream *stream,
{
FS_STREAM_LOCK (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 = g_list_prepend (stream->priv->src_pads,
+ gst_object_ref (pad));
stream->priv->src_pads_cookie++;
FS_STREAM_UNLOCK (stream);
@@ -598,7 +606,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), NULL);
+ G_OBJECT (stream), NULL);
}