mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-02-13 01:35:30 +00:00
fix for #147894 (opt scheduler decoupled elements mismanagement)
Original commit message from CVS: fix for #147894 (opt scheduler decoupled elements mismanagement)
This commit is contained in:
parent
d7bad72ef1
commit
b515b8a729
4 changed files with 63 additions and 17 deletions
11
ChangeLog
11
ChangeLog
|
@ -1,3 +1,14 @@
|
||||||
|
2004-07-20 Thomas Vander Stichele <thomas at apestaart dot org>
|
||||||
|
|
||||||
|
patch by: Wim Taymans
|
||||||
|
|
||||||
|
* gst/schedulers/gstoptimalscheduler.c: (group_num_elements),
|
||||||
|
(group_has_element), (element_get_reachables_func),
|
||||||
|
(group_migrate_connected):
|
||||||
|
fix for #147894 (opt scheduler decoupled elements mismanagement)
|
||||||
|
* testsuite/schedulers/Makefile.am:
|
||||||
|
testsuite app now passes
|
||||||
|
|
||||||
2004-07-19 Wim Taymans <wim@fluendo.com>
|
2004-07-19 Wim Taymans <wim@fluendo.com>
|
||||||
|
|
||||||
* testsuite/schedulers/147819.c: (handoff_identity1),
|
* testsuite/schedulers/147819.c: (handoff_identity1),
|
||||||
|
|
|
@ -942,6 +942,37 @@ remove_from_group (GstOptSchedulerGroup * group, GstElement * element)
|
||||||
return group;
|
return group;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* count number of elements in the group. Have to be careful because
|
||||||
|
* decoupled elements are added as entry point but are not added to
|
||||||
|
* the elements list */
|
||||||
|
static gint
|
||||||
|
group_num_elements (GstOptSchedulerGroup * group)
|
||||||
|
{
|
||||||
|
gint num;
|
||||||
|
|
||||||
|
num = group->num_elements;
|
||||||
|
/* decoupled elements are not added to the group but are
|
||||||
|
* added as an entry */
|
||||||
|
if (group->entry) {
|
||||||
|
if (GST_ELEMENT_IS_DECOUPLED (group->entry)) {
|
||||||
|
num++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return num;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* check if an element is part of the given group. We have to be carefull
|
||||||
|
* as decoupled elements are added as entry but are not added to the elements
|
||||||
|
* list */
|
||||||
|
static gboolean
|
||||||
|
group_has_element (GstOptSchedulerGroup * group, GstElement * element)
|
||||||
|
{
|
||||||
|
if (group->entry == element)
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
|
return (g_slist_find (group->elements, element) != NULL);
|
||||||
|
}
|
||||||
|
|
||||||
/* FIXME need to check if the groups are of the same type -- otherwise need to
|
/* FIXME need to check if the groups are of the same type -- otherwise need to
|
||||||
setup the scheduler again, if it is setup */
|
setup the scheduler again, if it is setup */
|
||||||
static GstOptSchedulerGroup *
|
static GstOptSchedulerGroup *
|
||||||
|
@ -2121,7 +2152,7 @@ element_get_reachables_func (GstElement * element, GstOptSchedulerGroup * group,
|
||||||
const GList *pads;
|
const GList *pads;
|
||||||
|
|
||||||
/* if no element or element not in group or been there, return NULL */
|
/* if no element or element not in group or been there, return NULL */
|
||||||
if (element == NULL || g_slist_find (group->elements, element) == NULL ||
|
if (element == NULL || !group_has_element (group, element) ||
|
||||||
GST_ELEMENT_IS_VISITED (element))
|
GST_ELEMENT_IS_VISITED (element))
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
|
@ -2337,6 +2368,7 @@ group_migrate_connected (GstOptScheduler * osched, GstElement * element,
|
||||||
gint len;
|
gint len;
|
||||||
|
|
||||||
if (GST_ELEMENT_IS_DECOUPLED (element)) {
|
if (GST_ELEMENT_IS_DECOUPLED (element)) {
|
||||||
|
GST_LOG ("element is decoupled and thus not in the group");
|
||||||
/* the element is decoupled and is therefore not in the group */
|
/* the element is decoupled and is therefore not in the group */
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -2359,7 +2391,7 @@ group_migrate_connected (GstOptScheduler * osched, GstElement * element,
|
||||||
gst_element_get_name (element));
|
gst_element_get_name (element));
|
||||||
return NULL;
|
return NULL;
|
||||||
} else if (len == 1) {
|
} else if (len == 1) {
|
||||||
remove_from_group (group, GST_ELEMENT (connected->data));
|
group = remove_from_group (group, GST_ELEMENT (connected->data));
|
||||||
GST_LOG
|
GST_LOG
|
||||||
("not migrating to new group as the group would only contain 1 element");
|
("not migrating to new group as the group would only contain 1 element");
|
||||||
g_list_free (connected);
|
g_list_free (connected);
|
||||||
|
@ -2385,7 +2417,7 @@ group_migrate_connected (GstOptScheduler * osched, GstElement * element,
|
||||||
/* remove last element from the group if any. Make sure not to remove
|
/* remove last element from the group if any. Make sure not to remove
|
||||||
* the loop based entry point of a group as this always needs one group */
|
* the loop based entry point of a group as this always needs one group */
|
||||||
if (group != NULL) {
|
if (group != NULL) {
|
||||||
if (g_slist_length (group->elements) == 1 &&
|
if (group_num_elements (group) == 1 &&
|
||||||
group->type != GST_OPT_SCHEDULER_GROUP_LOOP) {
|
group->type != GST_OPT_SCHEDULER_GROUP_LOOP) {
|
||||||
GST_LOG ("removing last element from old group");
|
GST_LOG ("removing last element from old group");
|
||||||
group = remove_from_group (group, GST_ELEMENT (group->elements->data));
|
group = remove_from_group (group, GST_ELEMENT (group->elements->data));
|
||||||
|
@ -2393,18 +2425,21 @@ group_migrate_connected (GstOptScheduler * osched, GstElement * element,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (g_slist_length (new_group->elements) == 1 &&
|
if (new_group != NULL) {
|
||||||
|
if (group_num_elements (new_group) == 1 &&
|
||||||
new_group->type != GST_OPT_SCHEDULER_GROUP_LOOP) {
|
new_group->type != GST_OPT_SCHEDULER_GROUP_LOOP) {
|
||||||
GST_LOG ("removing last element from new group");
|
GST_LOG ("removing last element from new group");
|
||||||
new_group =
|
new_group =
|
||||||
remove_from_group (new_group, GST_ELEMENT (new_group->elements->data));
|
remove_from_group (new_group,
|
||||||
|
GST_ELEMENT (new_group->elements->data));
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* at this point the new group lives in its own chain but might
|
/* at this point the new group lives in its own chain but might
|
||||||
* have to be merged with another chain, this happens when the new
|
* have to be merged with another chain, this happens when the new
|
||||||
* group has a link with another group in another chain */
|
* group has a link with another group in another chain */
|
||||||
rechain_group (new_group);
|
rechain_group (new_group);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
return new_group;
|
return new_group;
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,12 +4,12 @@ tests_pass = \
|
||||||
unlink_src unlink_sink \
|
unlink_src unlink_sink \
|
||||||
relink_src relink_sink \
|
relink_src relink_sink \
|
||||||
unref_src unref_sink \
|
unref_src unref_sink \
|
||||||
143777 143777-2 147713
|
143777 143777-2 147713 147894
|
||||||
|
|
||||||
# don't enable this one unless it actually works.
|
# don't enable this one unless it actually works.
|
||||||
# useless_iteration
|
# useless_iteration
|
||||||
|
|
||||||
tests_fail = 142183 142183-2 147894 147819
|
tests_fail = 142183 142183-2 147819
|
||||||
tests_ignore =
|
tests_ignore =
|
||||||
|
|
||||||
unlink_src_SOURCES = unlink.c
|
unlink_src_SOURCES = unlink.c
|
||||||
|
|
|
@ -4,12 +4,12 @@ tests_pass = \
|
||||||
unlink_src unlink_sink \
|
unlink_src unlink_sink \
|
||||||
relink_src relink_sink \
|
relink_src relink_sink \
|
||||||
unref_src unref_sink \
|
unref_src unref_sink \
|
||||||
143777 143777-2 147713
|
143777 143777-2 147713 147894
|
||||||
|
|
||||||
# don't enable this one unless it actually works.
|
# don't enable this one unless it actually works.
|
||||||
# useless_iteration
|
# useless_iteration
|
||||||
|
|
||||||
tests_fail = 142183 142183-2 147894 147819
|
tests_fail = 142183 142183-2 147819
|
||||||
tests_ignore =
|
tests_ignore =
|
||||||
|
|
||||||
unlink_src_SOURCES = unlink.c
|
unlink_src_SOURCES = unlink.c
|
||||||
|
|
Loading…
Reference in a new issue