mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-29 21:21:12 +00:00
gst/schedulers/gstoptimalscheduler.c
Original commit message from CVS: * gst/schedulers/gstoptimalscheduler.c (gst_opt_scheduler_pad_unlink): Implement unlink for elements with links to elements within the same group, so we can finally remove that annoying warning. Refactor the code a little bit (group_dec_links_for_element): Split out
This commit is contained in:
parent
ed58592fad
commit
c24e220bfb
2 changed files with 95 additions and 60 deletions
|
@ -1,3 +1,11 @@
|
||||||
|
2004-03-10 Johan Dahlin <johan@gnome.org>
|
||||||
|
|
||||||
|
* gst/schedulers/gstoptimalscheduler.c
|
||||||
|
(gst_opt_scheduler_pad_unlink): Implement unlink for elements with
|
||||||
|
links to elements within the same group, so we can finally remove
|
||||||
|
that annoying warning. Refactor the code a little bit
|
||||||
|
(group_dec_links_for_element): Split out
|
||||||
|
|
||||||
2004-03-09 David Schleef <ds@schleef.org>
|
2004-03-09 David Schleef <ds@schleef.org>
|
||||||
|
|
||||||
* docs/manual/dparams-app.xml: Fix to handle double dparams.
|
* docs/manual/dparams-app.xml: Fix to handle double dparams.
|
||||||
|
|
|
@ -2013,6 +2013,23 @@ group_can_reach_group (GstOptSchedulerGroup *group, GstOptSchedulerGroup *target
|
||||||
return reachable;
|
return reachable;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
group_dec_links_for_element (GstOptSchedulerGroup* group, GstElement *element)
|
||||||
|
{
|
||||||
|
GList *l;
|
||||||
|
GstPad *pad;
|
||||||
|
GstOptSchedulerGroup *peer_group;
|
||||||
|
|
||||||
|
for (l=GST_ELEMENT_PADS(element); l; l=l->next) {
|
||||||
|
pad = (GstPad*)l->data;
|
||||||
|
if (GST_IS_REAL_PAD (pad) && GST_PAD_PEER (pad)) {
|
||||||
|
get_group (GST_PAD_PARENT (GST_PAD_PEER (pad)), &peer_group);
|
||||||
|
if (peer_group && peer_group != group)
|
||||||
|
group_dec_link (group, peer_group);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gst_opt_scheduler_pad_unlink (GstScheduler *sched, GstPad *srcpad, GstPad *sinkpad)
|
gst_opt_scheduler_pad_unlink (GstScheduler *sched, GstPad *srcpad, GstPad *sinkpad)
|
||||||
{
|
{
|
||||||
|
@ -2080,6 +2097,7 @@ gst_opt_scheduler_pad_unlink (GstScheduler *sched, GstPad *srcpad, GstPad *sinkp
|
||||||
else {
|
else {
|
||||||
gboolean still_link1, still_link2;
|
gboolean still_link1, still_link2;
|
||||||
GstOptSchedulerGroup *group;
|
GstOptSchedulerGroup *group;
|
||||||
|
GstElement *element;
|
||||||
|
|
||||||
/* since group1 == group2, it doesn't matter which group we take */
|
/* since group1 == group2, it doesn't matter which group we take */
|
||||||
group = group1;
|
group = group1;
|
||||||
|
@ -2094,75 +2112,84 @@ gst_opt_scheduler_pad_unlink (GstScheduler *sched, GstPad *srcpad, GstPad *sinkp
|
||||||
* elements to a new group. */
|
* elements to a new group. */
|
||||||
still_link1 = element_has_link_with_group (element1, group, srcpad);
|
still_link1 = element_has_link_with_group (element1, group, srcpad);
|
||||||
still_link2 = element_has_link_with_group (element2, group, sinkpad);
|
still_link2 = element_has_link_with_group (element2, group, sinkpad);
|
||||||
|
|
||||||
/* if there is still a link, we don't need to break this group */
|
/* if there is still a link, we don't need to break this group */
|
||||||
if (still_link1 && still_link2) {
|
if (still_link1 && still_link2) {
|
||||||
|
GSList *l;
|
||||||
|
GList *m;;
|
||||||
|
int linkcount;
|
||||||
|
|
||||||
GST_LOG ( "elements still have links with other elements in the group");
|
GST_LOG ( "elements still have links with other elements in the group");
|
||||||
/* FIXME it's possible that we have to break the group/chain. This heppens when
|
|
||||||
* the src element recursiveley has links with other elements in the group but not
|
while (group->elements)
|
||||||
* with all elements. */
|
for (l = group->elements; l && l->data; l = l->next) {
|
||||||
g_warning ("opt: unlink elements in same group: implement me");
|
element = (GstElement*)l->data;
|
||||||
|
if (GST_ELEMENT_IS_DECOUPLED (element))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
linkcount = 0;
|
||||||
|
GST_LOG ("Examining %s\n", GST_ELEMENT_NAME (element));
|
||||||
|
for (m = GST_ELEMENT_PADS (element); m; m = m->next) {
|
||||||
|
GstPad *peer, *pad;
|
||||||
|
GstElement *parent;
|
||||||
|
GstOptSchedulerGroup *peer_group;
|
||||||
|
|
||||||
|
pad = (GstPad*)m->data;
|
||||||
|
if (!pad || !GST_IS_REAL_PAD (pad))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
peer = GST_PAD_PEER (pad);
|
||||||
|
if (!peer || !GST_IS_REAL_PAD (peer))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
parent = GST_PAD_PARENT (GST_PAD_PEER (pad));
|
||||||
|
get_group (parent, &peer_group);
|
||||||
|
if (peer_group && peer_group != group) {
|
||||||
|
GST_LOG ("pad %s is linked with %s\n",
|
||||||
|
GST_PAD_NAME (pad),
|
||||||
|
GST_ELEMENT_NAME (parent));
|
||||||
|
linkcount++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (linkcount < 2) {
|
||||||
|
group_dec_links_for_element (group, element);
|
||||||
|
remove_from_group (group, element);
|
||||||
|
}
|
||||||
|
/* if linkcount == 2, it will be unlinked later on */
|
||||||
|
else if (linkcount > 2) {
|
||||||
|
g_warning ("opt: Can't handle element %s with 3 or more links, aborting",
|
||||||
|
GST_ELEMENT_NAME (element));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* Peer element will be catched during next iteration */
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!still_link1 && !still_link2)
|
||||||
|
return;
|
||||||
|
|
||||||
/* now check which one of the elements we can remove from the group */
|
/* now check which one of the elements we can remove from the group */
|
||||||
if (!still_link1) {
|
if (still_link1) {
|
||||||
|
element = element2;
|
||||||
|
}
|
||||||
|
else if (still_link2) {
|
||||||
|
element = element1;
|
||||||
|
}
|
||||||
|
|
||||||
/* we only remove elements that are not the entry point of a loop based
|
/* we only remove elements that are not the entry point of a loop based
|
||||||
* group and are not decoupled */
|
* group and are not decoupled */
|
||||||
if (!(group->entry == element1 &&
|
if (!(group->entry == element &&
|
||||||
group->type == GST_OPT_SCHEDULER_GROUP_LOOP) &&
|
group->type == GST_OPT_SCHEDULER_GROUP_LOOP) &&
|
||||||
!GST_ELEMENT_IS_DECOUPLED (element1))
|
!GST_ELEMENT_IS_DECOUPLED (element)) {
|
||||||
{
|
GST_LOG ("element is separated from the group");
|
||||||
GList *l;
|
|
||||||
GstPad *pad;
|
|
||||||
GstOptSchedulerGroup *peer_group;
|
|
||||||
|
|
||||||
GST_LOG ("element1 is separated from the group");
|
|
||||||
|
|
||||||
/* have to decrement links to other groups from other pads */
|
/* have to decrement links to other groups from other pads */
|
||||||
for (l=element1->pads; l; l=l->next) {
|
group_dec_links_for_element (group, element);
|
||||||
pad = (GstPad*)l->data;
|
remove_from_group (group, element);
|
||||||
if (GST_IS_REAL_PAD (pad) && GST_PAD_PEER (pad)) {
|
|
||||||
get_group (GST_PAD_PARENT (GST_PAD_PEER (pad)), &peer_group);
|
|
||||||
if (peer_group && peer_group != group)
|
|
||||||
group_dec_link (group, peer_group);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
remove_from_group (group, element1);
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
GST_LOG ("element1 is decoupled or entry in loop based group");
|
GST_LOG ("element is decoupled or entry in loop based group");
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!still_link2) {
|
|
||||||
/* we only remove elements that are not the entry point of a loop based
|
|
||||||
* group and are not decoupled */
|
|
||||||
if (!(group->entry == element2 &&
|
|
||||||
group->type == GST_OPT_SCHEDULER_GROUP_LOOP) &&
|
|
||||||
!GST_ELEMENT_IS_DECOUPLED (element2))
|
|
||||||
{
|
|
||||||
GList *l;
|
|
||||||
GstPad *pad;
|
|
||||||
GstOptSchedulerGroup *peer_group;
|
|
||||||
|
|
||||||
GST_LOG ("element2 is separated from the group");
|
|
||||||
|
|
||||||
/* have to decrement links to other groups from other pads */
|
|
||||||
for (l=element2->pads; l; l=l->next) {
|
|
||||||
pad = (GstPad*)l->data;
|
|
||||||
if (GST_IS_REAL_PAD (pad) && GST_PAD_PEER (pad)) {
|
|
||||||
get_group (GST_PAD_PARENT (GST_PAD_PEER (pad)), &peer_group);
|
|
||||||
if (peer_group && peer_group != group)
|
|
||||||
group_dec_link (group, peer_group);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
remove_from_group (group, element2);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
GST_LOG ("element2 is decoupled or entry in loop based group");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue