mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-23 08:46:40 +00:00
gst/gstbin.c: Make state change function use 3 queues again, we were adding elements in the wrong order.
Original commit message from CVS: * gst/gstbin.c: (gst_bin_change_state): Make state change function use 3 queues again, we were adding elements in the wrong order. * gst/gstghostpad.c: (gst_ghost_pad_do_unlink): Some debug info, * gst/gstpad.c: (gst_pad_dispose): Added some debug info first.
This commit is contained in:
parent
cf26a6cbcc
commit
e32e0a17ed
4 changed files with 29 additions and 16 deletions
12
ChangeLog
12
ChangeLog
|
@ -1,3 +1,15 @@
|
|||
2005-09-26 Wim Taymans <wim@fluendo.com>
|
||||
|
||||
* gst/gstbin.c: (gst_bin_change_state):
|
||||
Make state change function use 3 queues again, we were
|
||||
adding elements in the wrong order.
|
||||
|
||||
* gst/gstghostpad.c: (gst_ghost_pad_do_unlink):
|
||||
Some debug info,
|
||||
|
||||
* gst/gstpad.c: (gst_pad_dispose):
|
||||
Added some debug info first.
|
||||
|
||||
2005-09-26 Tim-Philipp Müller <tim at centricular dot net>
|
||||
|
||||
* docs/design/draft-push-pull.txt:
|
||||
|
|
27
gst/gstbin.c
27
gst/gstbin.c
|
@ -1128,12 +1128,6 @@ done:
|
|||
return ret;
|
||||
}
|
||||
|
||||
static void
|
||||
append_child (gpointer child, GQueue * queue)
|
||||
{
|
||||
g_queue_push_tail (queue, child);
|
||||
}
|
||||
|
||||
/**
|
||||
* gst_bin_iterate_state_order:
|
||||
* @bin: #Gstbin to iterate on
|
||||
|
@ -1290,12 +1284,8 @@ restart:
|
|||
* bin. We operate on the snapshot taken above. Applications
|
||||
* should serialize their add/remove and set_state. */
|
||||
|
||||
/* now change state for semi sink elements first so add them in
|
||||
* front of the other elements */
|
||||
g_queue_foreach (temp, (GFunc) append_child, semi_queue);
|
||||
clear_queue (temp, FALSE);
|
||||
|
||||
/* if we don't have real sinks, we continue with the other elements */
|
||||
/* if we don't have real sinks, we continue with the other elements, there
|
||||
* has to be at least one element in the semi queue. */
|
||||
if (g_queue_is_empty (elem_queue) && !g_queue_is_empty (semi_queue)) {
|
||||
GQueue *q = elem_queue;
|
||||
|
||||
|
@ -1315,6 +1305,7 @@ restart:
|
|||
qelement = g_queue_pop_head (elem_queue);
|
||||
/* we don't need any duplicates in the other queue anymore */
|
||||
remove_all_from_queue (semi_queue, qelement, TRUE);
|
||||
remove_all_from_queue (temp, qelement, TRUE);
|
||||
|
||||
/* queue all elements connected to the sinkpads of this element */
|
||||
GST_LOCK (qelement);
|
||||
|
@ -1347,10 +1338,11 @@ restart:
|
|||
/* make sure we don't have duplicates */
|
||||
remove_all_from_queue (semi_queue, peer_parent, TRUE);
|
||||
remove_all_from_queue (elem_queue, peer_parent, TRUE);
|
||||
remove_all_from_queue (temp, peer_parent, TRUE);
|
||||
|
||||
/* was reffed before pushing on the queue by the
|
||||
* gst_object_get_parent() call we used to get the element. */
|
||||
g_queue_push_head (elem_queue, peer_parent);
|
||||
g_queue_push_tail (elem_queue, peer_parent);
|
||||
/* so that we don't unref it */
|
||||
peer_parent = NULL;
|
||||
} else {
|
||||
|
@ -1437,8 +1429,14 @@ restart:
|
|||
GST_DEBUG ("sinks and upstream elements exhausted");
|
||||
non_sink = g_queue_pop_head (semi_queue);
|
||||
if (non_sink) {
|
||||
GST_DEBUG ("found lefover non-sink %s", GST_OBJECT_NAME (non_sink));
|
||||
GST_DEBUG ("found lefover semi-sink %s", GST_OBJECT_NAME (non_sink));
|
||||
g_queue_push_tail (elem_queue, non_sink);
|
||||
} else {
|
||||
non_sink = g_queue_pop_head (temp);
|
||||
if (non_sink) {
|
||||
GST_DEBUG ("found lefover non-sink %s", GST_OBJECT_NAME (non_sink));
|
||||
g_queue_push_tail (elem_queue, non_sink);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1462,6 +1460,7 @@ exit:
|
|||
* had an error. */
|
||||
clear_queue (elem_queue, TRUE);
|
||||
clear_queue (semi_queue, TRUE);
|
||||
clear_queue (temp, TRUE);
|
||||
g_queue_free (elem_queue);
|
||||
g_queue_free (semi_queue);
|
||||
g_queue_free (temp);
|
||||
|
|
|
@ -604,6 +604,8 @@ gst_ghost_pad_do_unlink (GstPad * pad)
|
|||
|
||||
g_return_if_fail (target != NULL);
|
||||
|
||||
GST_DEBUG_OBJECT (pad, "unlinking ghostpad");
|
||||
|
||||
if (target->unlinkfunc)
|
||||
target->unlinkfunc (target);
|
||||
|
||||
|
|
|
@ -312,11 +312,11 @@ gst_pad_dispose (GObject * object)
|
|||
/* FIXME: what about if g_object_dispose is explicitly called on the pad? Is
|
||||
that legal? otherwise we could assert GST_OBJECT_PARENT (pad) == NULL as
|
||||
well... */
|
||||
g_assert (GST_PAD_PEER (pad) == NULL);
|
||||
|
||||
GST_CAT_DEBUG (GST_CAT_REFCOUNTING, "dispose %s:%s",
|
||||
GST_DEBUG_PAD_NAME (pad));
|
||||
|
||||
g_assert (GST_PAD_PEER (pad) == NULL);
|
||||
|
||||
/* clear the caps */
|
||||
gst_caps_replace (&GST_PAD_CAPS (pad), NULL);
|
||||
|
||||
|
|
Loading…
Reference in a new issue