diff options
author | Olivier CrĂȘte <olivier.crete@collabora.com> | 2012-05-02 17:36:28 -0400 |
---|---|---|
committer | Olivier CrĂȘte <olivier.crete@collabora.com> | 2012-10-02 13:35:17 -0400 |
commit | 1b77821dd10a08b2a23325b700384ac8b6bdcebb (patch) | |
tree | 5d55793af4abd10ee8bc23af122769c7f8af5dc8 /farstream | |
parent | 895b34c4dab9840c478816e8713c29d12c321a7e (diff) | |
download | farstream-1b77821dd10a08b2a23325b700384ac8b6bdcebb.tar.gz |
stream: Keep ref to src pads for iterator to not break
Diffstat (limited to 'farstream')
-rw-r--r-- | farstream/fs-stream.c | 18 |
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); } |