[gst-cvs] gst-plugins-base: decodebin2: remove leftover elements
Wim Taymans
wtay at kemper.freedesktop.org
Wed May 27 09:13:17 PDT 2009
Module: gst-plugins-base
Branch: master
Commit: 650215bcfda5c7ca6ec6d14f7442c7b32f94f636
URL: http://cgit.freedesktop.org/gstreamer/gst-plugins-base/commit/?id=650215bcfda5c7ca6ec6d14f7442c7b32f94f636
Author: Wim Taymans <wim.taymans at collabora.co.uk>
Date: Wed May 27 18:12:10 2009 +0200
decodebin2: remove leftover elements
Remove all of the elements inside decodebin2 when goint to READY and NULL.
Makes decodebin2 reusable.
Fixes #583750
---
gst/playback/gstdecodebin2.c | 42 ++++++++++++++++++++++++++++++++++++++++++
1 files changed, 42 insertions(+), 0 deletions(-)
diff --git a/gst/playback/gstdecodebin2.c b/gst/playback/gstdecodebin2.c
index d63cb65..6ff9223 100644
--- a/gst/playback/gstdecodebin2.c
+++ b/gst/playback/gstdecodebin2.c
@@ -663,6 +663,10 @@ static void
gst_decode_bin_remove_groups (GstDecodeBin * dbin)
{
GList *tmp;
+ GstIterator *it;
+ gpointer point;
+ gboolean done;
+ GstIteratorResult res;
GST_DEBUG_OBJECT (dbin, "cleaning up");
@@ -690,6 +694,44 @@ gst_decode_bin_remove_groups (GstDecodeBin * dbin)
}
g_list_free (dbin->oldgroups);
dbin->oldgroups = NULL;
+
+ GST_DEBUG_OBJECT (dbin, "removing last elements");
+
+ /* remove all remaining elements */
+ it = gst_bin_iterate_elements (GST_BIN_CAST (dbin));
+restart:
+ done = FALSE;
+ while (!done) {
+ res = gst_iterator_next (it, &point);
+ switch (res) {
+ case GST_ITERATOR_DONE:
+ done = TRUE;
+ break;
+ case GST_ITERATOR_RESYNC:
+ gst_iterator_resync (it);
+ goto restart;
+ case GST_ITERATOR_ERROR:
+ GST_WARNING_OBJECT (dbin,
+ "Had an error while iterating bin %s", GST_ELEMENT_NAME (dbin));
+ done = TRUE;
+ break;
+ case GST_ITERATOR_OK:
+ {
+ GstElement *elem = GST_ELEMENT_CAST (point);
+
+ /* don't remove the typefind element */
+ if (elem != dbin->typefind) {
+ GST_DEBUG_OBJECT (dbin, "remove element %s", GST_ELEMENT_NAME (elem));
+ gst_bin_remove (GST_BIN_CAST (dbin), elem);
+ gst_element_set_state (elem, GST_STATE_NULL);
+ }
+ gst_object_unref (elem);
+ break;
+ }
+ default:
+ break;
+ }
+ }
}
static void
More information about the Gstreamer-commits
mailing list