mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-04-26 04:36:20 +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>
|
2005-09-26 Tim-Philipp Müller <tim at centricular dot net>
|
||||||
|
|
||||||
* docs/design/draft-push-pull.txt:
|
* docs/design/draft-push-pull.txt:
|
||||||
|
|
27
gst/gstbin.c
27
gst/gstbin.c
|
@ -1128,12 +1128,6 @@ done:
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
append_child (gpointer child, GQueue * queue)
|
|
||||||
{
|
|
||||||
g_queue_push_tail (queue, child);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* gst_bin_iterate_state_order:
|
* gst_bin_iterate_state_order:
|
||||||
* @bin: #Gstbin to iterate on
|
* @bin: #Gstbin to iterate on
|
||||||
|
@ -1290,12 +1284,8 @@ restart:
|
||||||
* bin. We operate on the snapshot taken above. Applications
|
* bin. We operate on the snapshot taken above. Applications
|
||||||
* should serialize their add/remove and set_state. */
|
* should serialize their add/remove and set_state. */
|
||||||
|
|
||||||
/* now change state for semi sink elements first so add them in
|
/* if we don't have real sinks, we continue with the other elements, there
|
||||||
* front of the other elements */
|
* has to be at least one element in the semi queue. */
|
||||||
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 (g_queue_is_empty (elem_queue) && !g_queue_is_empty (semi_queue)) {
|
if (g_queue_is_empty (elem_queue) && !g_queue_is_empty (semi_queue)) {
|
||||||
GQueue *q = elem_queue;
|
GQueue *q = elem_queue;
|
||||||
|
|
||||||
|
@ -1315,6 +1305,7 @@ restart:
|
||||||
qelement = g_queue_pop_head (elem_queue);
|
qelement = g_queue_pop_head (elem_queue);
|
||||||
/* we don't need any duplicates in the other queue anymore */
|
/* we don't need any duplicates in the other queue anymore */
|
||||||
remove_all_from_queue (semi_queue, qelement, TRUE);
|
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 */
|
/* queue all elements connected to the sinkpads of this element */
|
||||||
GST_LOCK (qelement);
|
GST_LOCK (qelement);
|
||||||
|
@ -1347,10 +1338,11 @@ restart:
|
||||||
/* make sure we don't have duplicates */
|
/* make sure we don't have duplicates */
|
||||||
remove_all_from_queue (semi_queue, peer_parent, TRUE);
|
remove_all_from_queue (semi_queue, peer_parent, TRUE);
|
||||||
remove_all_from_queue (elem_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
|
/* was reffed before pushing on the queue by the
|
||||||
* gst_object_get_parent() call we used to get the element. */
|
* 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 */
|
/* so that we don't unref it */
|
||||||
peer_parent = NULL;
|
peer_parent = NULL;
|
||||||
} else {
|
} else {
|
||||||
|
@ -1437,8 +1429,14 @@ restart:
|
||||||
GST_DEBUG ("sinks and upstream elements exhausted");
|
GST_DEBUG ("sinks and upstream elements exhausted");
|
||||||
non_sink = g_queue_pop_head (semi_queue);
|
non_sink = g_queue_pop_head (semi_queue);
|
||||||
if (non_sink) {
|
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);
|
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. */
|
* had an error. */
|
||||||
clear_queue (elem_queue, TRUE);
|
clear_queue (elem_queue, TRUE);
|
||||||
clear_queue (semi_queue, TRUE);
|
clear_queue (semi_queue, TRUE);
|
||||||
|
clear_queue (temp, TRUE);
|
||||||
g_queue_free (elem_queue);
|
g_queue_free (elem_queue);
|
||||||
g_queue_free (semi_queue);
|
g_queue_free (semi_queue);
|
||||||
g_queue_free (temp);
|
g_queue_free (temp);
|
||||||
|
|
|
@ -604,6 +604,8 @@ gst_ghost_pad_do_unlink (GstPad * pad)
|
||||||
|
|
||||||
g_return_if_fail (target != NULL);
|
g_return_if_fail (target != NULL);
|
||||||
|
|
||||||
|
GST_DEBUG_OBJECT (pad, "unlinking ghostpad");
|
||||||
|
|
||||||
if (target->unlinkfunc)
|
if (target->unlinkfunc)
|
||||||
target->unlinkfunc (target);
|
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
|
/* 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
|
that legal? otherwise we could assert GST_OBJECT_PARENT (pad) == NULL as
|
||||||
well... */
|
well... */
|
||||||
g_assert (GST_PAD_PEER (pad) == NULL);
|
|
||||||
|
|
||||||
GST_CAT_DEBUG (GST_CAT_REFCOUNTING, "dispose %s:%s",
|
GST_CAT_DEBUG (GST_CAT_REFCOUNTING, "dispose %s:%s",
|
||||||
GST_DEBUG_PAD_NAME (pad));
|
GST_DEBUG_PAD_NAME (pad));
|
||||||
|
|
||||||
|
g_assert (GST_PAD_PEER (pad) == NULL);
|
||||||
|
|
||||||
/* clear the caps */
|
/* clear the caps */
|
||||||
gst_caps_replace (&GST_PAD_CAPS (pad), NULL);
|
gst_caps_replace (&GST_PAD_CAPS (pad), NULL);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue