gst/schedulers/gstoptimalscheduler.c

Original commit message from CVS:
* gst/schedulers/gstoptimalscheduler.c
(gst_opt_scheduler_pad_unlink): Fix bug that causes totem to
crash on MPEG playback. My boolean arithmetic is a bit rusty.
This commit is contained in:
Johan Dahlin 2004-03-15 19:24:35 +00:00
parent 7073ff35de
commit 84f49e604d
2 changed files with 259 additions and 240 deletions

View file

@ -1,5 +1,9 @@
2004-03-15 Johan Dahlin <johan@gnome.org> 2004-03-15 Johan Dahlin <johan@gnome.org>
* gst/schedulers/gstoptimalscheduler.c
(gst_opt_scheduler_pad_unlink): Fix bug that causes totem to
crash on MPEG playback. My boolean arithmetic is a bit rusty.
* tools/Makefile.am (EXTRA_DIST): Add gst-indent * tools/Makefile.am (EXTRA_DIST): Add gst-indent
2004-03-15 Thomas Vander Stichele <thomas at apestaart dot org> 2004-03-15 Thomas Vander Stichele <thomas at apestaart dot org>

View file

@ -66,7 +66,8 @@ typedef enum
GST_OPT_SCHEDULER_STATE_ERROR, GST_OPT_SCHEDULER_STATE_ERROR,
GST_OPT_SCHEDULER_STATE_RUNNING, GST_OPT_SCHEDULER_STATE_RUNNING,
GST_OPT_SCHEDULER_STATE_INTERRUPTED GST_OPT_SCHEDULER_STATE_INTERRUPTED
} GstOptSchedulerState; }
GstOptSchedulerState;
struct _GstOptScheduler struct _GstOptScheduler
{ {
@ -100,7 +101,8 @@ typedef enum
GST_OPT_SCHEDULER_CHAIN_DIRTY = (1 << 1), GST_OPT_SCHEDULER_CHAIN_DIRTY = (1 << 1),
GST_OPT_SCHEDULER_CHAIN_DISABLED = (1 << 2), GST_OPT_SCHEDULER_CHAIN_DISABLED = (1 << 2),
GST_OPT_SCHEDULER_CHAIN_RUNNING = (1 << 3), GST_OPT_SCHEDULER_CHAIN_RUNNING = (1 << 3),
} GstOptSchedulerChainFlags; }
GstOptSchedulerChainFlags;
#define GST_OPT_SCHEDULER_CHAIN_DISABLE(chain) ((chain)->flags |= GST_OPT_SCHEDULER_CHAIN_DISABLED) #define GST_OPT_SCHEDULER_CHAIN_DISABLE(chain) ((chain)->flags |= GST_OPT_SCHEDULER_CHAIN_DISABLED)
#define GST_OPT_SCHEDULER_CHAIN_ENABLE(chain) ((chain)->flags &= ~GST_OPT_SCHEDULER_CHAIN_DISABLED) #define GST_OPT_SCHEDULER_CHAIN_ENABLE(chain) ((chain)->flags &= ~GST_OPT_SCHEDULER_CHAIN_DISABLED)
@ -132,13 +134,15 @@ typedef enum
GST_OPT_SCHEDULER_GROUP_RUNNING = (1 << 4), /* this group is running */ GST_OPT_SCHEDULER_GROUP_RUNNING = (1 << 4), /* this group is running */
GST_OPT_SCHEDULER_GROUP_SCHEDULABLE = (1 << 5), /* this group is schedulable */ GST_OPT_SCHEDULER_GROUP_SCHEDULABLE = (1 << 5), /* this group is schedulable */
GST_OPT_SCHEDULER_GROUP_VISITED = (1 << 6), /* this group is visited when finding links */ GST_OPT_SCHEDULER_GROUP_VISITED = (1 << 6), /* this group is visited when finding links */
} GstOptSchedulerGroupFlags; }
GstOptSchedulerGroupFlags;
typedef enum typedef enum
{ {
GST_OPT_SCHEDULER_GROUP_GET = 1, GST_OPT_SCHEDULER_GROUP_GET = 1,
GST_OPT_SCHEDULER_GROUP_LOOP = 2, GST_OPT_SCHEDULER_GROUP_LOOP = 2,
} GstOptSchedulerGroupType; }
GstOptSchedulerGroupType;
#define GST_OPT_SCHEDULER_GROUP_SET_FLAG(group,flag) ((group)->flags |= (flag)) #define GST_OPT_SCHEDULER_GROUP_SET_FLAG(group,flag) ((group)->flags |= (flag))
#define GST_OPT_SCHEDULER_GROUP_UNSET_FLAG(group,flag) ((group)->flags &= ~(flag)) #define GST_OPT_SCHEDULER_GROUP_UNSET_FLAG(group,flag) ((group)->flags &= ~(flag))
@ -272,7 +276,8 @@ typedef struct _GstOptSchedulerCtx GstOptSchedulerCtx;
typedef enum typedef enum
{ {
GST_OPT_SCHEDULER_CTX_DISABLED = (1 << 1), /* the element is disabled */ GST_OPT_SCHEDULER_CTX_DISABLED = (1 << 1), /* the element is disabled */
} GstOptSchedulerCtxFlags; }
GstOptSchedulerCtxFlags;
struct _GstOptSchedulerCtx struct _GstOptSchedulerCtx
{ {
@ -1595,7 +1600,8 @@ typedef enum
GST_OPT_CHAIN_TO_CHAIN, GST_OPT_CHAIN_TO_CHAIN,
GST_OPT_CHAIN_TO_LOOP, GST_OPT_CHAIN_TO_LOOP,
GST_OPT_LOOP_TO_LOOP, GST_OPT_LOOP_TO_LOOP,
} LinkType; }
LinkType;
/* /*
* Entry points for this scheduler. * Entry points for this scheduler.
@ -2064,8 +2070,8 @@ group_dec_links_for_element (GstOptSchedulerGroup * group, GstElement * element)
} }
static void static void
gst_opt_scheduler_pad_unlink (GstScheduler * sched, GstPad * srcpad, gst_opt_scheduler_pad_unlink (GstScheduler * sched,
GstPad * sinkpad) GstPad * srcpad, GstPad * sinkpad)
{ {
GstOptScheduler *osched = GST_OPT_SCHEDULER (sched); GstOptScheduler *osched = GST_OPT_SCHEDULER (sched);
GstElement *element1, *element2; GstElement *element1, *element2;
@ -2133,7 +2139,6 @@ gst_opt_scheduler_pad_unlink (GstScheduler * sched, GstPad * srcpad,
else { else {
gboolean still_link1, still_link2; gboolean still_link1, still_link2;
GstOptSchedulerGroup *group; GstOptSchedulerGroup *group;
GstElement *element = NULL; /* shut up gcc */
/* 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;
@ -2158,7 +2163,8 @@ gst_opt_scheduler_pad_unlink (GstScheduler * sched, GstPad * srcpad,
while (group->elements) while (group->elements)
for (l = group->elements; l && l->data; l = l->next) { for (l = group->elements; l && l->data; l = l->next) {
element = (GstElement *) l->data; GstElement *element = (GstElement *) l->data;
if (GST_ELEMENT_IS_DECOUPLED (element)) if (GST_ELEMENT_IS_DECOUPLED (element))
continue; continue;
@ -2202,28 +2208,37 @@ gst_opt_scheduler_pad_unlink (GstScheduler * sched, GstPad * srcpad,
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 == element && if (!(group->entry == element1 &&
group->type == GST_OPT_SCHEDULER_GROUP_LOOP) && group->type == GST_OPT_SCHEDULER_GROUP_LOOP) &&
!GST_ELEMENT_IS_DECOUPLED (element)) { !GST_ELEMENT_IS_DECOUPLED (element1)) {
GST_LOG ("element is separated from the group"); GST_LOG ("el ement1 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 */
group_dec_links_for_element (group, element); group_dec_links_for_element (group, element1);
remove_from_group (group, element); remove_from_group (group, element1);
} else { } else {
GST_LOG ("element is decoupled or entry in loop based group"); GST_LOG ("element1 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)) {
GST_LOG ("element2 is separated from the group");
/* have to decrement links to other groups from other pads */
group_dec_links_for_element (group, element2);
remove_from_group (group, element2);
} else {
GST_LOG ("element2 is decoupled or entry in loop based group");
}
} }
} }
} }