mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-04-26 04:26:14 +00:00
- added 'remove' argument to _chain_recursive_add to remove elements from old chain before adding to new one
Original commit message from CVS: - added 'remove' argument to _chain_recursive_add to remove elements from old chain before adding to new one - reworked _pad_unlink to be simpler and more correct
This commit is contained in:
parent
cbbb8371fe
commit
de6bcd890a
1 changed files with 20 additions and 7 deletions
|
@ -936,7 +936,7 @@ gst_basic_scheduler_find_chain (GstBasicScheduler * sched, GstElement * element)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gst_basic_scheduler_chain_recursive_add (GstSchedulerChain * chain, GstElement * element)
|
gst_basic_scheduler_chain_recursive_add (GstSchedulerChain * chain, GstElement * element, gboolean remove)
|
||||||
{
|
{
|
||||||
GList *pads;
|
GList *pads;
|
||||||
GstPad *pad;
|
GstPad *pad;
|
||||||
|
@ -945,9 +945,13 @@ gst_basic_scheduler_chain_recursive_add (GstSchedulerChain * chain, GstElement *
|
||||||
|
|
||||||
/* check to see if it's in a chain already */
|
/* check to see if it's in a chain already */
|
||||||
prevchain = gst_basic_scheduler_find_chain (chain->sched, element);
|
prevchain = gst_basic_scheduler_find_chain (chain->sched, element);
|
||||||
/* if it's already in another chain, we're done */
|
/* if it's already in another chain, either remove or punt */
|
||||||
if (prevchain != NULL)
|
if (prevchain != NULL) {
|
||||||
return;
|
if (remove == TRUE)
|
||||||
|
gst_basic_scheduler_chain_remove_element (prevchain, element);
|
||||||
|
else
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
/* add it to this one */
|
/* add it to this one */
|
||||||
gst_basic_scheduler_chain_add_element (chain, element);
|
gst_basic_scheduler_chain_add_element (chain, element);
|
||||||
|
@ -968,7 +972,7 @@ gst_basic_scheduler_chain_recursive_add (GstSchedulerChain * chain, GstElement *
|
||||||
if (GST_ELEMENT_SCHED (GST_PAD_PARENT (pad)) == GST_ELEMENT_SCHED (peerelement)) {
|
if (GST_ELEMENT_SCHED (GST_PAD_PARENT (pad)) == GST_ELEMENT_SCHED (peerelement)) {
|
||||||
GST_DEBUG (GST_CAT_SCHEDULING, "peer \"%s\" is valid for same chain",
|
GST_DEBUG (GST_CAT_SCHEDULING, "peer \"%s\" is valid for same chain",
|
||||||
GST_ELEMENT_NAME (peerelement));
|
GST_ELEMENT_NAME (peerelement));
|
||||||
gst_basic_scheduler_chain_recursive_add (chain, peerelement);
|
gst_basic_scheduler_chain_recursive_add (chain, peerelement, remove);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1213,6 +1217,7 @@ gst_basic_scheduler_pad_unlink (GstScheduler * sched, GstPad * srcpad, GstPad *
|
||||||
chain1 = gst_basic_scheduler_find_chain (bsched, element1);
|
chain1 = gst_basic_scheduler_find_chain (bsched, element1);
|
||||||
chain2 = gst_basic_scheduler_find_chain (bsched, element2);
|
chain2 = gst_basic_scheduler_find_chain (bsched, element2);
|
||||||
|
|
||||||
|
#if 0
|
||||||
if (chain1 != chain2) {
|
if (chain1 != chain2) {
|
||||||
/* elements not in the same chain don't need to be separated */
|
/* elements not in the same chain don't need to be separated */
|
||||||
GST_INFO (GST_CAT_SCHEDULING, "elements not in the same chain");
|
GST_INFO (GST_CAT_SCHEDULING, "elements not in the same chain");
|
||||||
|
@ -1225,14 +1230,22 @@ gst_basic_scheduler_pad_unlink (GstScheduler * sched, GstPad * srcpad, GstPad *
|
||||||
|
|
||||||
/* now create a new chain to hold element1 and build it from scratch */
|
/* now create a new chain to hold element1 and build it from scratch */
|
||||||
chain1 = gst_basic_scheduler_chain_new (bsched);
|
chain1 = gst_basic_scheduler_chain_new (bsched);
|
||||||
gst_basic_scheduler_chain_recursive_add (chain1, element1);
|
gst_basic_scheduler_chain_recursive_add (chain1, element1, FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* check the other element to see if it landed in the newly created chain */
|
/* check the other element to see if it landed in the newly created chain */
|
||||||
if (gst_basic_scheduler_find_chain (bsched, element2) == NULL) {
|
if (gst_basic_scheduler_find_chain (bsched, element2) == NULL) {
|
||||||
/* if not in chain, create chain and build from scratch */
|
/* if not in chain, create chain and build from scratch */
|
||||||
chain2 = gst_basic_scheduler_chain_new (bsched);
|
chain2 = gst_basic_scheduler_chain_new (bsched);
|
||||||
gst_basic_scheduler_chain_recursive_add (chain2, element2);
|
gst_basic_scheduler_chain_recursive_add (chain2, element2, FALSE);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* if they're both in the same chain, move second set of elements to a new chain */
|
||||||
|
if (chain1 && (chain1 == chain2)) {
|
||||||
|
GST_INFO (GST_CAT_SCHEDULING, "creating new chain for second element and peers");
|
||||||
|
chain2 = gst_basic_scheduler_chain_new (bsched);
|
||||||
|
gst_basic_scheduler_chain_recursive_add (chain2, element2, TRUE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue