mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-06-07 07:58:51 +00:00
gst/: implement gst_pad_collect as replacement for gst_pad_select.
Original commit message from CVS: * gst/gstpad.c: (gst_pad_collect_array), (gst_pad_collectv), (gst_pad_collect), (gst_pad_collect_valist), (gst_pad_selectv), (gst_pad_select): * gst/gstpad.h: * gst/gstscheduler.c: (gst_scheduler_pad_select), (gst_scheduler_lock_element), (gst_scheduler_unlock_element): * gst/gstscheduler.h: implement gst_pad_collect as replacement for gst_pad_select. deprecate gst_pad_select and gst_scheduler_(un)lock_element add new flag GST_SCHEDULER_FLAG_NEW_API for API that implements the new pad_select, lock and unlock calls. * gst/cothreads.c: (cothread_destroy), (cothread_switch): * gst/cothreads.h: * gst/schedulers/cothreads_compat.h: * gst/schedulers/gthread-cothreads.h: remove unused cothread_lock and cothread_unlock calls * gst/schedulers/entryscheduler.c: (gst_entry_scheduler_class_init), (gst_entry_scheduler_init), (_can_schedule_loop), (gst_entry_scheduler_get_handler), (gst_entry_scheduler_pad_select): update to new API * gst/schedulers/gstbasicscheduler.c: (gst_basic_scheduler_class_init), (gst_basic_scheduler_init), (gst_basic_scheduler_pad_select): remove useless lock and unlock calls, update pad_select to new API (untested) * gst/schedulers/gstoptimalscheduler.c: (gst_opt_scheduler_class_init): remove useless select, lock and unlock function calls * gst/elements/gstaggregator.c: (gst_aggregator_loop): use gst_pad_collect instead of gst_pad_select
This commit is contained in:
parent
343d14cf0e
commit
ac5674b03b
14 changed files with 248 additions and 227 deletions
34
ChangeLog
34
ChangeLog
|
@ -1,3 +1,37 @@
|
||||||
|
2004-04-04 Benjamin Otte <otte@gnome.org>
|
||||||
|
|
||||||
|
* gst/gstpad.c: (gst_pad_collect_array), (gst_pad_collectv),
|
||||||
|
(gst_pad_collect), (gst_pad_collect_valist), (gst_pad_selectv),
|
||||||
|
(gst_pad_select):
|
||||||
|
* gst/gstpad.h:
|
||||||
|
* gst/gstscheduler.c: (gst_scheduler_pad_select),
|
||||||
|
(gst_scheduler_lock_element), (gst_scheduler_unlock_element):
|
||||||
|
* gst/gstscheduler.h:
|
||||||
|
implement gst_pad_collect as replacement for gst_pad_select.
|
||||||
|
deprecate gst_pad_select and gst_scheduler_(un)lock_element
|
||||||
|
add new flag GST_SCHEDULER_FLAG_NEW_API for API that implements the
|
||||||
|
new pad_select, lock and unlock calls.
|
||||||
|
* gst/cothreads.c: (cothread_destroy), (cothread_switch):
|
||||||
|
* gst/cothreads.h:
|
||||||
|
* gst/schedulers/cothreads_compat.h:
|
||||||
|
* gst/schedulers/gthread-cothreads.h:
|
||||||
|
remove unused cothread_lock and cothread_unlock calls
|
||||||
|
* gst/schedulers/entryscheduler.c:
|
||||||
|
(gst_entry_scheduler_class_init), (gst_entry_scheduler_init),
|
||||||
|
(_can_schedule_loop), (gst_entry_scheduler_get_handler),
|
||||||
|
(gst_entry_scheduler_pad_select):
|
||||||
|
update to new API
|
||||||
|
* gst/schedulers/gstbasicscheduler.c:
|
||||||
|
(gst_basic_scheduler_class_init), (gst_basic_scheduler_init),
|
||||||
|
(gst_basic_scheduler_pad_select):
|
||||||
|
remove useless lock and unlock calls, update pad_select to new API
|
||||||
|
(untested)
|
||||||
|
* gst/schedulers/gstoptimalscheduler.c:
|
||||||
|
(gst_opt_scheduler_class_init):
|
||||||
|
remove useless select, lock and unlock function calls
|
||||||
|
* gst/elements/gstaggregator.c: (gst_aggregator_loop):
|
||||||
|
use gst_pad_collect instead of gst_pad_select
|
||||||
|
|
||||||
2004-04-04 Benjamin Otte <otte@gnome.org>
|
2004-04-04 Benjamin Otte <otte@gnome.org>
|
||||||
|
|
||||||
* gst/schedulers/entryscheduler.c: (_can_schedule_get),
|
* gst/schedulers/entryscheduler.c: (_can_schedule_get),
|
||||||
|
|
|
@ -363,10 +363,6 @@ cothread_destroy (cothread_state * cothread)
|
||||||
/* cothread 0 needs to be destroyed specially */
|
/* cothread 0 needs to be destroyed specially */
|
||||||
g_assert (cothreadnum != 0);
|
g_assert (cothreadnum != 0);
|
||||||
|
|
||||||
/* we have to unlock here because we might be switched out
|
|
||||||
* with the lock held */
|
|
||||||
cothread_unlock (cothread);
|
|
||||||
|
|
||||||
/* doing cleanups of the cothread create */
|
/* doing cleanups of the cothread create */
|
||||||
GST_CAT_DEBUG (GST_CAT_COTHREADS,
|
GST_CAT_DEBUG (GST_CAT_COTHREADS,
|
||||||
"destroy cothread %d with magic number 0x%x", cothreadnum,
|
"destroy cothread %d with magic number 0x%x", cothreadnum,
|
||||||
|
@ -679,43 +675,5 @@ nocurrent:
|
||||||
exit (2);
|
exit (2);
|
||||||
#endif /* COTHREAD_PARANOID */
|
#endif /* COTHREAD_PARANOID */
|
||||||
selfswitch:
|
selfswitch:
|
||||||
g_warning
|
|
||||||
("cothread: trying to switch to same thread, legal but not necessary");
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* cothread_lock:
|
|
||||||
* @cothread: cothread state to lock
|
|
||||||
*
|
|
||||||
* Locks the cothread state.
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
cothread_lock (cothread_state * cothread)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* cothread_trylock:
|
|
||||||
* @cothread: cothread state to try to lock
|
|
||||||
*
|
|
||||||
* Try to lock the cothread state
|
|
||||||
*
|
|
||||||
* Returns: TRUE if the cothread could be locked.
|
|
||||||
*/
|
|
||||||
gboolean
|
|
||||||
cothread_trylock (cothread_state * cothread)
|
|
||||||
{
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* cothread_unlock:
|
|
||||||
* @cothread: cothread state to unlock
|
|
||||||
*
|
|
||||||
* Unlock the cothread state.
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
cothread_unlock (cothread_state * cothread)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
|
@ -70,10 +70,6 @@ void cothread_set_private (cothread_state *cothread,
|
||||||
gpointer data);
|
gpointer data);
|
||||||
gpointer cothread_get_private (cothread_state *cothread);
|
gpointer cothread_get_private (cothread_state *cothread);
|
||||||
|
|
||||||
void cothread_lock (cothread_state *cothread);
|
|
||||||
gboolean cothread_trylock (cothread_state *cothread);
|
|
||||||
void cothread_unlock (cothread_state *cothread);
|
|
||||||
|
|
||||||
cothread_state* cothread_main (cothread_context *ctx);
|
cothread_state* cothread_main (cothread_context *ctx);
|
||||||
cothread_state* cothread_current_main (void);
|
cothread_state* cothread_current_main (void);
|
||||||
cothread_state* cothread_current (void);
|
cothread_state* cothread_current (void);
|
||||||
|
|
|
@ -336,8 +336,7 @@ gst_aggregator_loop (GstElement * element)
|
||||||
|
|
||||||
debug = "loop_select";
|
debug = "loop_select";
|
||||||
|
|
||||||
pad = gst_pad_selectv (aggregator->sinkpads);
|
buf = GST_BUFFER (gst_pad_collectv (&pad, aggregator->sinkpads));
|
||||||
buf = GST_BUFFER (gst_pad_pull (pad));
|
|
||||||
|
|
||||||
gst_aggregator_push (aggregator, pad, buf, debug);
|
gst_aggregator_push (aggregator, pad, buf, debug);
|
||||||
} else {
|
} else {
|
||||||
|
|
180
gst/gstpad.c
180
gst/gstpad.c
|
@ -3116,6 +3116,125 @@ gst_pad_pull (GstPad * pad)
|
||||||
return GST_DATA (gst_event_new (GST_EVENT_INTERRUPT));
|
return GST_DATA (gst_event_new (GST_EVENT_INTERRUPT));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
GstData *
|
||||||
|
gst_pad_collect_array (GstScheduler * scheduler, GstPad ** selected,
|
||||||
|
GstPad ** padlist)
|
||||||
|
{
|
||||||
|
GstSchedulerClass *klass = GST_SCHEDULER_GET_CLASS (scheduler);
|
||||||
|
|
||||||
|
if (!GST_FLAG_IS_SET (scheduler, GST_SCHEDULER_FLAG_NEW_API) ||
|
||||||
|
!klass->pad_select) {
|
||||||
|
/* better randomness? */
|
||||||
|
if (selected)
|
||||||
|
*selected = padlist[0];
|
||||||
|
return gst_pad_pull (padlist[0]);
|
||||||
|
} else {
|
||||||
|
GstPad *select;
|
||||||
|
|
||||||
|
return klass->pad_select (scheduler, selected ? selected : &select,
|
||||||
|
padlist);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gst_pad_collectv:
|
||||||
|
* @selected: set to the pad the buffer comes from if not NULL
|
||||||
|
* @padlist: a #GList of sink pads.
|
||||||
|
*
|
||||||
|
* Waits for a buffer on any of the list of pads. Each #GstPad in @padlist must
|
||||||
|
* belong to the same element and be owned by the caller.
|
||||||
|
*
|
||||||
|
* Returns: the #GstData that was available
|
||||||
|
*/
|
||||||
|
GstData *
|
||||||
|
gst_pad_collectv (GstPad ** selected, const GList * padlist)
|
||||||
|
{
|
||||||
|
/* need to use alloca here because we must not leak data */
|
||||||
|
GstPad **pads;
|
||||||
|
GstPad *test;
|
||||||
|
GstElement *element = NULL;
|
||||||
|
int i = 0;
|
||||||
|
|
||||||
|
g_return_val_if_fail (padlist != NULL, NULL);
|
||||||
|
pads = g_alloca (sizeof (gpointer) * (g_list_length ((GList *) padlist) + 1));
|
||||||
|
for (; padlist; padlist = g_list_next (padlist)) {
|
||||||
|
test = GST_PAD (padlist->data);
|
||||||
|
g_return_val_if_fail (GST_IS_PAD (test), NULL);
|
||||||
|
g_return_val_if_fail (GST_PAD_IS_SINK (test), NULL);
|
||||||
|
if (element) {
|
||||||
|
g_return_val_if_fail (element == gst_pad_get_parent (test), NULL);
|
||||||
|
} else {
|
||||||
|
element = gst_pad_get_parent (test);
|
||||||
|
}
|
||||||
|
pads[i++] = test;
|
||||||
|
}
|
||||||
|
pads[i] = NULL;
|
||||||
|
|
||||||
|
return gst_pad_collect_array (GST_SCHEDULER (element), selected, pads);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gst_pad_collect:
|
||||||
|
* @selected: set to the pad the buffer comes from if not NULL
|
||||||
|
* @pad: first pad
|
||||||
|
* @...: more sink pads.
|
||||||
|
*
|
||||||
|
* Waits for a buffer on the given set of pads.
|
||||||
|
*
|
||||||
|
* Returns: the #GstData that was available.
|
||||||
|
*/
|
||||||
|
GstData *
|
||||||
|
gst_pad_collect (GstPad ** selected, GstPad * pad, ...)
|
||||||
|
{
|
||||||
|
GstData *result;
|
||||||
|
va_list var_args;
|
||||||
|
|
||||||
|
g_return_val_if_fail (GST_IS_PAD (pad), NULL);
|
||||||
|
|
||||||
|
va_start (var_args, pad);
|
||||||
|
|
||||||
|
result = gst_pad_collect_valist (selected, pad, var_args);
|
||||||
|
|
||||||
|
va_end (var_args);
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gst_pad_collect_valist:
|
||||||
|
* @selected: set to the pad the buffer comes from if not NULL
|
||||||
|
* @pad: first pad
|
||||||
|
* @...: more sink pads.
|
||||||
|
*
|
||||||
|
* Waits for a buffer on the given set of pads.
|
||||||
|
*
|
||||||
|
* Returns: the #GstData that was available.
|
||||||
|
*/
|
||||||
|
GstData *
|
||||||
|
gst_pad_collect_valist (GstPad ** selected, GstPad * pad, va_list var_args)
|
||||||
|
{
|
||||||
|
GstPad **padlist;
|
||||||
|
GstElement *element = NULL;
|
||||||
|
gint i = 0, maxlength;
|
||||||
|
|
||||||
|
g_return_val_if_fail (GST_IS_PAD (pad), NULL);
|
||||||
|
|
||||||
|
while (pad) {
|
||||||
|
g_return_val_if_fail (i < maxlength, NULL);
|
||||||
|
if (element) {
|
||||||
|
g_return_val_if_fail (element == gst_pad_get_parent (pad), NULL);
|
||||||
|
} else {
|
||||||
|
element = gst_pad_get_parent (pad);
|
||||||
|
maxlength = element->numsinkpads;
|
||||||
|
/* can we make this list a bit smaller than this upper limit? */
|
||||||
|
padlist = g_alloca (sizeof (gpointer) * (maxlength + 1));
|
||||||
|
}
|
||||||
|
padlist[i++] = pad;
|
||||||
|
pad = va_arg (var_args, GstPad *);
|
||||||
|
}
|
||||||
|
return gst_pad_collect_array (GST_SCHEDULER (element), selected, padlist);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* gst_pad_selectv:
|
* gst_pad_selectv:
|
||||||
* @padlist: a #GList of sink pads.
|
* @padlist: a #GList of sink pads.
|
||||||
|
@ -3129,40 +3248,7 @@ gst_pad_pull (GstPad * pad)
|
||||||
GstPad *
|
GstPad *
|
||||||
gst_pad_selectv (GList * padlist)
|
gst_pad_selectv (GList * padlist)
|
||||||
{
|
{
|
||||||
GstPad *pad;
|
|
||||||
|
|
||||||
pad = gst_scheduler_pad_select (GST_PAD_PARENT (padlist->data)->sched,
|
|
||||||
padlist);
|
|
||||||
return pad;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* FIXME 0.9: Don't allow the first pad to be NULL */
|
|
||||||
/**
|
|
||||||
* gst_pad_select:
|
|
||||||
* @pad: a first sink #GstPad to perform the select on.
|
|
||||||
* @...: A NULL-terminated list of more pads to select on.
|
|
||||||
*
|
|
||||||
* Waits for a buffer on the given set of pads.
|
|
||||||
*
|
|
||||||
* Returns: the #GstPad that has a buffer available.
|
|
||||||
* Use #gst_pad_pull() to get the buffer.
|
|
||||||
*/
|
|
||||||
GstPad *
|
|
||||||
gst_pad_select (GstPad * pad, ...)
|
|
||||||
{
|
|
||||||
GstPad *result;
|
|
||||||
va_list var_args;
|
|
||||||
|
|
||||||
if (pad == NULL)
|
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
va_start (var_args, pad);
|
|
||||||
|
|
||||||
result = gst_pad_select_valist (pad, var_args);
|
|
||||||
|
|
||||||
va_end (var_args);
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -3194,6 +3280,34 @@ gst_pad_select_valist (GstPad * pad, va_list var_args)
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gst_pad_select:
|
||||||
|
* @pad: a first sink #GstPad to perform the select on.
|
||||||
|
* @...: A NULL-terminated list of more pads to select on.
|
||||||
|
*
|
||||||
|
* Waits for a buffer on the given set of pads.
|
||||||
|
*
|
||||||
|
* Returns: the #GstPad that has a buffer available.
|
||||||
|
* Use #gst_pad_pull() to get the buffer.
|
||||||
|
*/
|
||||||
|
GstPad *
|
||||||
|
gst_pad_select (GstPad * pad, ...)
|
||||||
|
{
|
||||||
|
GstPad *result;
|
||||||
|
va_list var_args;
|
||||||
|
|
||||||
|
if (pad == NULL)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
va_start (var_args, pad);
|
||||||
|
|
||||||
|
result = gst_pad_select_valist (pad, var_args);
|
||||||
|
|
||||||
|
va_end (var_args);
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
/************************************************************************
|
/************************************************************************
|
||||||
*
|
*
|
||||||
* templates
|
* templates
|
||||||
|
|
|
@ -443,10 +443,15 @@ void gst_pad_push (GstPad *pad, GstData *data);
|
||||||
GstData* gst_pad_pull (GstPad *pad);
|
GstData* gst_pad_pull (GstPad *pad);
|
||||||
gboolean gst_pad_send_event (GstPad *pad, GstEvent *event);
|
gboolean gst_pad_send_event (GstPad *pad, GstEvent *event);
|
||||||
gboolean gst_pad_event_default (GstPad *pad, GstEvent *event);
|
gboolean gst_pad_event_default (GstPad *pad, GstEvent *event);
|
||||||
|
#ifndef GST_DISABLE_DEPRECATED
|
||||||
GstPad* gst_pad_selectv (GList *padlist);
|
GstPad* gst_pad_selectv (GList *padlist);
|
||||||
GstPad* gst_pad_select (GstPad *pad, ...);
|
GstPad* gst_pad_select (GstPad *pad, ...);
|
||||||
GstPad* gst_pad_select_valist (GstPad *pad, va_list varargs);
|
GstPad* gst_pad_select_valist (GstPad *pad, va_list varargs);
|
||||||
|
#endif
|
||||||
|
/* FIXME 0.9: rename to _select? Otherwise rename SchedulerClass pointer */
|
||||||
|
GstData * gst_pad_collectv (GstPad **selected, const GList *padlist);
|
||||||
|
GstData * gst_pad_collect (GstPad **selected, GstPad *pad, ...);
|
||||||
|
GstData * gst_pad_collect_valist (GstPad **selected, GstPad *pad, va_list varargs);
|
||||||
|
|
||||||
/* convert/query/format functions */
|
/* convert/query/format functions */
|
||||||
void gst_pad_set_formats_function (GstPad *pad,
|
void gst_pad_set_formats_function (GstPad *pad,
|
||||||
|
|
|
@ -198,16 +198,9 @@ gst_scheduler_pad_unlink (GstScheduler * sched, GstPad * srcpad,
|
||||||
GstPad *
|
GstPad *
|
||||||
gst_scheduler_pad_select (GstScheduler * sched, GList * padlist)
|
gst_scheduler_pad_select (GstScheduler * sched, GList * padlist)
|
||||||
{
|
{
|
||||||
GstSchedulerClass *sclass;
|
|
||||||
|
|
||||||
g_return_val_if_fail (GST_IS_SCHEDULER (sched), NULL);
|
g_return_val_if_fail (GST_IS_SCHEDULER (sched), NULL);
|
||||||
g_return_val_if_fail (padlist != NULL, NULL);
|
g_return_val_if_fail (padlist != NULL, NULL);
|
||||||
|
|
||||||
sclass = GST_SCHEDULER_GET_CLASS (sched);
|
|
||||||
|
|
||||||
if (sclass->pad_select)
|
|
||||||
sclass->pad_select (sched, padlist);
|
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -418,15 +411,8 @@ gst_scheduler_remove_scheduler (GstScheduler * sched, GstScheduler * sched2)
|
||||||
void
|
void
|
||||||
gst_scheduler_lock_element (GstScheduler * sched, GstElement * element)
|
gst_scheduler_lock_element (GstScheduler * sched, GstElement * element)
|
||||||
{
|
{
|
||||||
GstSchedulerClass *sclass;
|
|
||||||
|
|
||||||
g_return_if_fail (GST_IS_SCHEDULER (sched));
|
g_return_if_fail (GST_IS_SCHEDULER (sched));
|
||||||
g_return_if_fail (GST_IS_ELEMENT (element));
|
g_return_if_fail (GST_IS_ELEMENT (element));
|
||||||
|
|
||||||
sclass = GST_SCHEDULER_GET_CLASS (sched);
|
|
||||||
|
|
||||||
if (sclass->lock_element)
|
|
||||||
sclass->lock_element (sched, element);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -445,9 +431,6 @@ gst_scheduler_unlock_element (GstScheduler * sched, GstElement * element)
|
||||||
g_return_if_fail (GST_IS_ELEMENT (element));
|
g_return_if_fail (GST_IS_ELEMENT (element));
|
||||||
|
|
||||||
sclass = GST_SCHEDULER_GET_CLASS (sched);
|
sclass = GST_SCHEDULER_GET_CLASS (sched);
|
||||||
|
|
||||||
if (sclass->unlock_element)
|
|
||||||
sclass->unlock_element (sched, element);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -40,6 +40,8 @@ G_BEGIN_DECLS
|
||||||
typedef enum {
|
typedef enum {
|
||||||
/* this scheduler works with a fixed clock */
|
/* this scheduler works with a fixed clock */
|
||||||
GST_SCHEDULER_FLAG_FIXED_CLOCK = GST_OBJECT_FLAG_LAST,
|
GST_SCHEDULER_FLAG_FIXED_CLOCK = GST_OBJECT_FLAG_LAST,
|
||||||
|
/* this scheduler supports select and lock calls */
|
||||||
|
GST_SCHEDULER_FLAG_NEW_API,
|
||||||
|
|
||||||
/* padding */
|
/* padding */
|
||||||
GST_SCHEDULER_FLAG_LAST = GST_OBJECT_FLAG_LAST + 4
|
GST_SCHEDULER_FLAG_LAST = GST_OBJECT_FLAG_LAST + 4
|
||||||
|
@ -87,14 +89,17 @@ struct _GstSchedulerClass {
|
||||||
void (*remove_scheduler) (GstScheduler *sched, GstScheduler *sched2);
|
void (*remove_scheduler) (GstScheduler *sched, GstScheduler *sched2);
|
||||||
GstElementStateReturn (*state_transition) (GstScheduler *sched, GstElement *element, gint transition);
|
GstElementStateReturn (*state_transition) (GstScheduler *sched, GstElement *element, gint transition);
|
||||||
void (*scheduling_change) (GstScheduler *sched, GstElement *element);
|
void (*scheduling_change) (GstScheduler *sched, GstElement *element);
|
||||||
void (*lock_element) (GstScheduler *sched, GstElement *element);
|
/* next two are optional, require NEW_API flag */
|
||||||
void (*unlock_element) (GstScheduler *sched, GstElement *element);
|
/* FIXME 0.9: rename to (un)lock_object */
|
||||||
|
void (*lock_element) (GstScheduler *sched, GstObject *object);
|
||||||
|
void (*unlock_element) (GstScheduler *sched, GstObject *object);
|
||||||
gboolean (*yield) (GstScheduler *sched, GstElement *element);
|
gboolean (*yield) (GstScheduler *sched, GstElement *element);
|
||||||
gboolean (*interrupt) (GstScheduler *sched, GstElement *element);
|
gboolean (*interrupt) (GstScheduler *sched, GstElement *element);
|
||||||
void (*error) (GstScheduler *sched, GstElement *element);
|
void (*error) (GstScheduler *sched, GstElement *element);
|
||||||
void (*pad_link) (GstScheduler *sched, GstPad *srcpad, GstPad *sinkpad);
|
void (*pad_link) (GstScheduler *sched, GstPad *srcpad, GstPad *sinkpad);
|
||||||
void (*pad_unlink) (GstScheduler *sched, GstPad *srcpad, GstPad *sinkpad);
|
void (*pad_unlink) (GstScheduler *sched, GstPad *srcpad, GstPad *sinkpad);
|
||||||
void (*pad_select) (GstScheduler *sched, GList *padlist);
|
/* optional, requires NEW_API flag */
|
||||||
|
GstData * (*pad_select) (GstScheduler *sched, GstPad **selected, GstPad **pads);
|
||||||
GstClockReturn (*clock_wait) (GstScheduler *sched, GstElement *element,
|
GstClockReturn (*clock_wait) (GstScheduler *sched, GstElement *element,
|
||||||
GstClockID id, GstClockTimeDiff *jitter);
|
GstClockID id, GstClockTimeDiff *jitter);
|
||||||
GstSchedulerState (*iterate) (GstScheduler *sched);
|
GstSchedulerState (*iterate) (GstScheduler *sched);
|
||||||
|
@ -119,14 +124,18 @@ void gst_scheduler_add_scheduler (GstScheduler *sched, GstScheduler *sched2);
|
||||||
void gst_scheduler_remove_scheduler (GstScheduler *sched, GstScheduler *sched2);
|
void gst_scheduler_remove_scheduler (GstScheduler *sched, GstScheduler *sched2);
|
||||||
GstElementStateReturn gst_scheduler_state_transition (GstScheduler *sched, GstElement *element, gint transition);
|
GstElementStateReturn gst_scheduler_state_transition (GstScheduler *sched, GstElement *element, gint transition);
|
||||||
void gst_scheduler_scheduling_change (GstScheduler *sched, GstElement *element);
|
void gst_scheduler_scheduling_change (GstScheduler *sched, GstElement *element);
|
||||||
|
#ifndef GST_DISABLE_DEPRECATED
|
||||||
void gst_scheduler_lock_element (GstScheduler *sched, GstElement *element);
|
void gst_scheduler_lock_element (GstScheduler *sched, GstElement *element);
|
||||||
void gst_scheduler_unlock_element (GstScheduler *sched, GstElement *element);
|
void gst_scheduler_unlock_element (GstScheduler *sched, GstElement *element);
|
||||||
|
#endif
|
||||||
gboolean gst_scheduler_yield (GstScheduler *sched, GstElement *element);
|
gboolean gst_scheduler_yield (GstScheduler *sched, GstElement *element);
|
||||||
gboolean gst_scheduler_interrupt (GstScheduler *sched, GstElement *element);
|
gboolean gst_scheduler_interrupt (GstScheduler *sched, GstElement *element);
|
||||||
void gst_scheduler_error (GstScheduler *sched, GstElement *element);
|
void gst_scheduler_error (GstScheduler *sched, GstElement *element);
|
||||||
void gst_scheduler_pad_link (GstScheduler *sched, GstPad *srcpad, GstPad *sinkpad);
|
void gst_scheduler_pad_link (GstScheduler *sched, GstPad *srcpad, GstPad *sinkpad);
|
||||||
void gst_scheduler_pad_unlink (GstScheduler *sched, GstPad *srcpad, GstPad *sinkpad);
|
void gst_scheduler_pad_unlink (GstScheduler *sched, GstPad *srcpad, GstPad *sinkpad);
|
||||||
|
#ifndef GST_DISABLE_DEPRECATED
|
||||||
GstPad* gst_scheduler_pad_select (GstScheduler *sched, GList *padlist);
|
GstPad* gst_scheduler_pad_select (GstScheduler *sched, GList *padlist);
|
||||||
|
#endif
|
||||||
GstClockReturn gst_scheduler_clock_wait (GstScheduler *sched, GstElement *element,
|
GstClockReturn gst_scheduler_clock_wait (GstScheduler *sched, GstElement *element,
|
||||||
GstClockID id, GstClockTimeDiff *jitter);
|
GstClockID id, GstClockTimeDiff *jitter);
|
||||||
gboolean gst_scheduler_iterate (GstScheduler *sched);
|
gboolean gst_scheduler_iterate (GstScheduler *sched);
|
||||||
|
|
|
@ -61,9 +61,6 @@ typedef cothread_state cothread;
|
||||||
#define do_cothread_context_init() (cothread_context_init ())
|
#define do_cothread_context_init() (cothread_context_init ())
|
||||||
#define do_cothread_context_destroy(context) cothread_context_free (context)
|
#define do_cothread_context_destroy(context) cothread_context_free (context)
|
||||||
|
|
||||||
#define do_cothread_lock(cothread) cothread_lock(cothread)
|
|
||||||
#define do_cothread_unlock(cothread) cothread_unlock(cothread)
|
|
||||||
|
|
||||||
#define do_cothread_get_current(context) (cothread_current())
|
#define do_cothread_get_current(context) (cothread_current())
|
||||||
#define do_cothread_get_main(context) (cothread_current_main())
|
#define do_cothread_get_main(context) (cothread_current_main())
|
||||||
|
|
||||||
|
|
|
@ -179,10 +179,6 @@ static void gst_entry_scheduler_remove_element (GstScheduler * sched,
|
||||||
GstElement * element);
|
GstElement * element);
|
||||||
static GstElementStateReturn gst_entry_scheduler_state_transition (GstScheduler
|
static GstElementStateReturn gst_entry_scheduler_state_transition (GstScheduler
|
||||||
* sched, GstElement * element, gint transition);
|
* sched, GstElement * element, gint transition);
|
||||||
static void gst_entry_scheduler_lock_element (GstScheduler * sched,
|
|
||||||
GstElement * element);
|
|
||||||
static void gst_entry_scheduler_unlock_element (GstScheduler * sched,
|
|
||||||
GstElement * element);
|
|
||||||
static gboolean gst_entry_scheduler_yield (GstScheduler * sched,
|
static gboolean gst_entry_scheduler_yield (GstScheduler * sched,
|
||||||
GstElement * element);
|
GstElement * element);
|
||||||
static gboolean gst_entry_scheduler_interrupt (GstScheduler * sched,
|
static gboolean gst_entry_scheduler_interrupt (GstScheduler * sched,
|
||||||
|
@ -193,8 +189,8 @@ static void gst_entry_scheduler_pad_link (GstScheduler * sched, GstPad * srcpad,
|
||||||
GstPad * sinkpad);
|
GstPad * sinkpad);
|
||||||
static void gst_entry_scheduler_pad_unlink (GstScheduler * sched,
|
static void gst_entry_scheduler_pad_unlink (GstScheduler * sched,
|
||||||
GstPad * srcpad, GstPad * sinkpad);
|
GstPad * srcpad, GstPad * sinkpad);
|
||||||
static GstData *gst_entry_scheduler_select (GstScheduler * sched,
|
static GstData *gst_entry_scheduler_pad_select (GstScheduler * sched,
|
||||||
GstPad ** pulled_from, GList * list);
|
GstPad ** pulled_from, GstPad ** pads);
|
||||||
static GstSchedulerState gst_entry_scheduler_iterate (GstScheduler * sched);
|
static GstSchedulerState gst_entry_scheduler_iterate (GstScheduler * sched);
|
||||||
static void gst_entry_scheduler_show (GstScheduler * scheduler);
|
static void gst_entry_scheduler_show (GstScheduler * scheduler);
|
||||||
|
|
||||||
|
@ -211,14 +207,12 @@ gst_entry_scheduler_class_init (gpointer klass, gpointer class_data)
|
||||||
scheduler->add_element = gst_entry_scheduler_add_element;
|
scheduler->add_element = gst_entry_scheduler_add_element;
|
||||||
scheduler->remove_element = gst_entry_scheduler_remove_element;
|
scheduler->remove_element = gst_entry_scheduler_remove_element;
|
||||||
scheduler->state_transition = gst_entry_scheduler_state_transition;
|
scheduler->state_transition = gst_entry_scheduler_state_transition;
|
||||||
scheduler->lock_element = gst_entry_scheduler_lock_element;
|
|
||||||
scheduler->unlock_element = gst_entry_scheduler_unlock_element;
|
|
||||||
scheduler->yield = gst_entry_scheduler_yield;
|
scheduler->yield = gst_entry_scheduler_yield;
|
||||||
scheduler->interrupt = gst_entry_scheduler_interrupt;
|
scheduler->interrupt = gst_entry_scheduler_interrupt;
|
||||||
scheduler->error = gst_entry_scheduler_error;
|
scheduler->error = gst_entry_scheduler_error;
|
||||||
scheduler->pad_link = gst_entry_scheduler_pad_link;
|
scheduler->pad_link = gst_entry_scheduler_pad_link;
|
||||||
scheduler->pad_unlink = gst_entry_scheduler_pad_unlink;
|
scheduler->pad_unlink = gst_entry_scheduler_pad_unlink;
|
||||||
//scheduler->pad_select = gst_entry_scheduler_pad_select;
|
scheduler->pad_select = gst_entry_scheduler_pad_select;
|
||||||
scheduler->clock_wait = NULL;
|
scheduler->clock_wait = NULL;
|
||||||
scheduler->iterate = gst_entry_scheduler_iterate;
|
scheduler->iterate = gst_entry_scheduler_iterate;
|
||||||
scheduler->show = gst_entry_scheduler_show;
|
scheduler->show = gst_entry_scheduler_show;
|
||||||
|
@ -229,6 +223,7 @@ gst_entry_scheduler_class_init (gpointer klass, gpointer class_data)
|
||||||
static void
|
static void
|
||||||
gst_entry_scheduler_init (GstEntryScheduler * scheduler)
|
gst_entry_scheduler_init (GstEntryScheduler * scheduler)
|
||||||
{
|
{
|
||||||
|
GST_FLAG_SET (scheduler, GST_SCHEDULER_FLAG_NEW_API);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -247,7 +242,7 @@ gst_entry_scheduler_init (GstEntryScheduler * scheduler)
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
CothreadPrivate element;
|
CothreadPrivate element;
|
||||||
GList *sinkpads;
|
GstPad **sinkpads;
|
||||||
}
|
}
|
||||||
LoopPrivate;
|
LoopPrivate;
|
||||||
|
|
||||||
|
@ -257,6 +252,7 @@ static gboolean
|
||||||
_can_schedule_loop (GstRealPad * pad)
|
_can_schedule_loop (GstRealPad * pad)
|
||||||
{
|
{
|
||||||
LoopPrivate *priv;
|
LoopPrivate *priv;
|
||||||
|
gint i = 0;
|
||||||
|
|
||||||
g_assert (PAD_PRIVATE (pad));
|
g_assert (PAD_PRIVATE (pad));
|
||||||
|
|
||||||
|
@ -268,7 +264,11 @@ _can_schedule_loop (GstRealPad * pad)
|
||||||
if (!priv->sinkpads)
|
if (!priv->sinkpads)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
return g_list_find (priv->sinkpads, pad) != NULL;
|
while (priv->sinkpads[i]) {
|
||||||
|
if (pad == GST_REAL_PAD (priv->sinkpads[i++]))
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
|
@ -709,14 +709,14 @@ gst_entry_scheduler_get_handler (GstPad * pad)
|
||||||
{
|
{
|
||||||
GstData *data;
|
GstData *data;
|
||||||
GstEntryScheduler *sched = GST_ENTRY_SCHEDULER (gst_pad_get_scheduler (pad));
|
GstEntryScheduler *sched = GST_ENTRY_SCHEDULER (gst_pad_get_scheduler (pad));
|
||||||
GList list = { NULL, NULL, NULL };
|
GstPad *pads[2] = { NULL, NULL };
|
||||||
GstPad *ret;
|
GstPad *ret;
|
||||||
|
|
||||||
pad = GST_PAD_PEER (pad);
|
pad = GST_PAD_PEER (pad);
|
||||||
list.data = pad;
|
pads[0] = pad;
|
||||||
GST_LOG_OBJECT (sched, "pad %s:%s pulls", GST_DEBUG_PAD_NAME (pad));
|
GST_LOG_OBJECT (sched, "pad %s:%s pulls", GST_DEBUG_PAD_NAME (pad));
|
||||||
|
|
||||||
data = gst_entry_scheduler_select (GST_SCHEDULER (sched), &ret, &list);
|
data = gst_entry_scheduler_pad_select (GST_SCHEDULER (sched), &ret, pads);
|
||||||
g_assert (pad == ret);
|
g_assert (pad == ret);
|
||||||
|
|
||||||
GST_LOG_OBJECT (sched, "done with %s:%s", GST_DEBUG_PAD_NAME (pad));
|
GST_LOG_OBJECT (sched, "done with %s:%s", GST_DEBUG_PAD_NAME (pad));
|
||||||
|
@ -735,30 +735,29 @@ gst_entry_scheduler_event_handler (GstPad * srcpad, GstEvent * event)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static GstData *
|
static GstData *
|
||||||
gst_entry_scheduler_select (GstScheduler * scheduler, GstPad ** pulled_from,
|
gst_entry_scheduler_pad_select (GstScheduler * scheduler, GstPad ** pulled_from,
|
||||||
GList * list)
|
GstPad ** pads)
|
||||||
{
|
{
|
||||||
GstData *data;
|
GstData *data;
|
||||||
GstRealPad *pad;
|
GstRealPad *pad;
|
||||||
GList *walk;
|
|
||||||
GstElement *element = NULL;
|
GstElement *element = NULL;
|
||||||
GstEntryScheduler *sched = GST_ENTRY_SCHEDULER (scheduler);
|
GstEntryScheduler *sched = GST_ENTRY_SCHEDULER (scheduler);
|
||||||
|
gint i = 0;
|
||||||
|
|
||||||
/* sanity check */
|
/* sanity check */
|
||||||
for (walk = list; walk; walk = g_list_next (walk)) {
|
while (pads[i]) {
|
||||||
pad = GST_REAL_PAD (walk->data);
|
pad = GST_REAL_PAD (pads[i++]);
|
||||||
g_assert (!element || element == gst_pad_get_parent (GST_PAD (pad)));
|
|
||||||
if (PAD_PRIVATE (pad)->bufpen) {
|
if (PAD_PRIVATE (pad)->bufpen) {
|
||||||
sched->schedule_now =
|
sched->schedule_now =
|
||||||
g_list_remove (sched->schedule_now, PAD_PRIVATE (pad));
|
g_list_remove (sched->schedule_now, PAD_PRIVATE (pad));
|
||||||
goto found;
|
goto found;
|
||||||
}
|
}
|
||||||
element = gst_pad_get_parent (GST_PAD (pad));
|
|
||||||
}
|
}
|
||||||
|
element = gst_pad_get_parent (GST_PAD (pad));
|
||||||
g_assert (element);
|
g_assert (element);
|
||||||
g_assert (ELEMENT_PRIVATE (element)->main ==
|
g_assert (ELEMENT_PRIVATE (element)->main ==
|
||||||
gst_entry_scheduler_loop_wrapper);
|
gst_entry_scheduler_loop_wrapper);
|
||||||
LOOP_PRIVATE (element)->sinkpads = list;
|
LOOP_PRIVATE (element)->sinkpads = pads;
|
||||||
ELEMENT_PRIVATE (element)->wait = WAIT_FOR_PADS;
|
ELEMENT_PRIVATE (element)->wait = WAIT_FOR_PADS;
|
||||||
schedule_next_element (SCHED (element));
|
schedule_next_element (SCHED (element));
|
||||||
LOOP_PRIVATE (element)->sinkpads = NULL;
|
LOOP_PRIVATE (element)->sinkpads = NULL;
|
||||||
|
@ -937,18 +936,6 @@ gst_entry_scheduler_state_transition (GstScheduler * scheduler,
|
||||||
return GST_STATE_SUCCESS;
|
return GST_STATE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
gst_entry_scheduler_lock_element (GstScheduler * sched, GstElement * element)
|
|
||||||
{
|
|
||||||
g_warning ("What's this?");
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
gst_entry_scheduler_unlock_element (GstScheduler * sched, GstElement * element)
|
|
||||||
{
|
|
||||||
g_warning ("What's this?");
|
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
gst_entry_scheduler_yield (GstScheduler * sched, GstElement * element)
|
gst_entry_scheduler_yield (GstScheduler * sched, GstElement * element)
|
||||||
{
|
{
|
||||||
|
|
|
@ -129,10 +129,6 @@ static void gst_basic_scheduler_remove_element (GstScheduler * sched,
|
||||||
GstElement * element);
|
GstElement * element);
|
||||||
static GstElementStateReturn gst_basic_scheduler_state_transition (GstScheduler
|
static GstElementStateReturn gst_basic_scheduler_state_transition (GstScheduler
|
||||||
* sched, GstElement * element, gint transition);
|
* sched, GstElement * element, gint transition);
|
||||||
static void gst_basic_scheduler_lock_element (GstScheduler * sched,
|
|
||||||
GstElement * element);
|
|
||||||
static void gst_basic_scheduler_unlock_element (GstScheduler * sched,
|
|
||||||
GstElement * element);
|
|
||||||
static gboolean gst_basic_scheduler_yield (GstScheduler * sched,
|
static gboolean gst_basic_scheduler_yield (GstScheduler * sched,
|
||||||
GstElement * element);
|
GstElement * element);
|
||||||
static gboolean gst_basic_scheduler_interrupt (GstScheduler * sched,
|
static gboolean gst_basic_scheduler_interrupt (GstScheduler * sched,
|
||||||
|
@ -143,8 +139,8 @@ static void gst_basic_scheduler_pad_link (GstScheduler * sched, GstPad * srcpad,
|
||||||
GstPad * sinkpad);
|
GstPad * sinkpad);
|
||||||
static void gst_basic_scheduler_pad_unlink (GstScheduler * sched,
|
static void gst_basic_scheduler_pad_unlink (GstScheduler * sched,
|
||||||
GstPad * srcpad, GstPad * sinkpad);
|
GstPad * srcpad, GstPad * sinkpad);
|
||||||
static void gst_basic_scheduler_pad_select (GstScheduler * sched,
|
static GstData *gst_basic_scheduler_pad_select (GstScheduler * sched,
|
||||||
GList * padlist);
|
GstPad ** selected, GstPad ** padlist);
|
||||||
static GstSchedulerState gst_basic_scheduler_iterate (GstScheduler * sched);
|
static GstSchedulerState gst_basic_scheduler_iterate (GstScheduler * sched);
|
||||||
|
|
||||||
static void gst_basic_scheduler_show (GstScheduler * sched);
|
static void gst_basic_scheduler_show (GstScheduler * sched);
|
||||||
|
@ -229,10 +225,6 @@ gst_basic_scheduler_class_init (GstBasicSchedulerClass * klass)
|
||||||
GST_DEBUG_FUNCPTR (gst_basic_scheduler_remove_element);
|
GST_DEBUG_FUNCPTR (gst_basic_scheduler_remove_element);
|
||||||
gstscheduler_class->state_transition =
|
gstscheduler_class->state_transition =
|
||||||
GST_DEBUG_FUNCPTR (gst_basic_scheduler_state_transition);
|
GST_DEBUG_FUNCPTR (gst_basic_scheduler_state_transition);
|
||||||
gstscheduler_class->lock_element =
|
|
||||||
GST_DEBUG_FUNCPTR (gst_basic_scheduler_lock_element);
|
|
||||||
gstscheduler_class->unlock_element =
|
|
||||||
GST_DEBUG_FUNCPTR (gst_basic_scheduler_unlock_element);
|
|
||||||
gstscheduler_class->yield = GST_DEBUG_FUNCPTR (gst_basic_scheduler_yield);
|
gstscheduler_class->yield = GST_DEBUG_FUNCPTR (gst_basic_scheduler_yield);
|
||||||
gstscheduler_class->interrupt =
|
gstscheduler_class->interrupt =
|
||||||
GST_DEBUG_FUNCPTR (gst_basic_scheduler_interrupt);
|
GST_DEBUG_FUNCPTR (gst_basic_scheduler_interrupt);
|
||||||
|
@ -258,6 +250,8 @@ gst_basic_scheduler_init (GstBasicScheduler * scheduler)
|
||||||
scheduler->num_elements = 0;
|
scheduler->num_elements = 0;
|
||||||
scheduler->chains = NULL;
|
scheduler->chains = NULL;
|
||||||
scheduler->num_chains = 0;
|
scheduler->num_chains = 0;
|
||||||
|
|
||||||
|
GST_FLAG_SET (scheduler, GST_SCHEDULER_FLAG_NEW_API);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -1197,20 +1191,6 @@ gst_basic_scheduler_state_transition (GstScheduler * sched,
|
||||||
return GST_STATE_SUCCESS;
|
return GST_STATE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
gst_basic_scheduler_lock_element (GstScheduler * sched, GstElement * element)
|
|
||||||
{
|
|
||||||
if (GST_ELEMENT_THREADSTATE (element))
|
|
||||||
do_cothread_lock (GST_ELEMENT_THREADSTATE (element));
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
gst_basic_scheduler_unlock_element (GstScheduler * sched, GstElement * element)
|
|
||||||
{
|
|
||||||
if (GST_ELEMENT_THREADSTATE (element))
|
|
||||||
do_cothread_unlock (GST_ELEMENT_THREADSTATE (element));
|
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
gst_basic_scheduler_yield (GstScheduler * sched, GstElement * element)
|
gst_basic_scheduler_yield (GstScheduler * sched, GstElement * element)
|
||||||
{
|
{
|
||||||
|
@ -1336,40 +1316,39 @@ gst_basic_scheduler_pad_unlink (GstScheduler * sched, GstPad * srcpad,
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static GstData *
|
||||||
gst_basic_scheduler_pad_select (GstScheduler * sched, GList * padlist)
|
gst_basic_scheduler_pad_select (GstScheduler * sched, GstPad ** selected,
|
||||||
|
GstPad ** padlist)
|
||||||
{
|
{
|
||||||
GstPad *pad = NULL;
|
GstData *data;
|
||||||
GList *padlist2 = padlist;
|
GstPad *pad;
|
||||||
|
gint i;
|
||||||
|
|
||||||
GST_INFO ("performing select");
|
GST_INFO ("performing select");
|
||||||
|
|
||||||
while (padlist2) {
|
while (padlist[i]) {
|
||||||
pad = GST_PAD (padlist2->data);
|
pad = padlist[i];
|
||||||
|
|
||||||
|
|
||||||
padlist2 = g_list_next (padlist2);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* else there is nothing ready to consume, set up the select functions */
|
|
||||||
while (padlist) {
|
|
||||||
pad = GST_PAD (padlist->data);
|
|
||||||
|
|
||||||
GST_RPAD_CHAINHANDLER (pad) =
|
GST_RPAD_CHAINHANDLER (pad) =
|
||||||
GST_DEBUG_FUNCPTR (gst_basic_scheduler_select_proxy);
|
GST_DEBUG_FUNCPTR (gst_basic_scheduler_select_proxy);
|
||||||
|
|
||||||
padlist = g_list_next (padlist);
|
|
||||||
}
|
}
|
||||||
if (pad != NULL) {
|
|
||||||
GstRealPad *peer = GST_RPAD_PEER (pad);
|
|
||||||
|
|
||||||
do_element_switch (GST_PAD_PARENT (peer));
|
do_element_switch (GST_PAD_PARENT (GST_PAD_PEER (pad)));
|
||||||
|
|
||||||
/* FIXME disabled for now */
|
while (padlist[i]) {
|
||||||
/* pad = GST_ELEMENT (GST_PAD_PARENT (pad))->select_pad; */
|
pad = padlist[i];
|
||||||
|
|
||||||
g_assert (pad != NULL);
|
if (GST_RPAD_BUFPEN (pad)) {
|
||||||
|
*selected = pad;
|
||||||
|
data = GST_RPAD_BUFPEN (pad);
|
||||||
|
GST_RPAD_BUFPEN (pad) = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
GST_RPAD_CHAINHANDLER (pad) =
|
||||||
|
GST_DEBUG_FUNCPTR (gst_basic_scheduler_chainhandler_proxy);
|
||||||
|
}
|
||||||
|
|
||||||
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
static GstSchedulerState
|
static GstSchedulerState
|
||||||
|
|
|
@ -323,10 +323,6 @@ static GstElementStateReturn gst_opt_scheduler_state_transition (GstScheduler *
|
||||||
sched, GstElement * element, gint transition);
|
sched, GstElement * element, gint transition);
|
||||||
static void gst_opt_scheduler_scheduling_change (GstScheduler * sched,
|
static void gst_opt_scheduler_scheduling_change (GstScheduler * sched,
|
||||||
GstElement * element);
|
GstElement * element);
|
||||||
static void gst_opt_scheduler_lock_element (GstScheduler * sched,
|
|
||||||
GstElement * element);
|
|
||||||
static void gst_opt_scheduler_unlock_element (GstScheduler * sched,
|
|
||||||
GstElement * element);
|
|
||||||
static gboolean gst_opt_scheduler_yield (GstScheduler * sched,
|
static gboolean gst_opt_scheduler_yield (GstScheduler * sched,
|
||||||
GstElement * element);
|
GstElement * element);
|
||||||
static gboolean gst_opt_scheduler_interrupt (GstScheduler * sched,
|
static gboolean gst_opt_scheduler_interrupt (GstScheduler * sched,
|
||||||
|
@ -337,8 +333,6 @@ static void gst_opt_scheduler_pad_link (GstScheduler * sched, GstPad * srcpad,
|
||||||
GstPad * sinkpad);
|
GstPad * sinkpad);
|
||||||
static void gst_opt_scheduler_pad_unlink (GstScheduler * sched, GstPad * srcpad,
|
static void gst_opt_scheduler_pad_unlink (GstScheduler * sched, GstPad * srcpad,
|
||||||
GstPad * sinkpad);
|
GstPad * sinkpad);
|
||||||
static void gst_opt_scheduler_pad_select (GstScheduler * sched,
|
|
||||||
GList * padlist);
|
|
||||||
static GstSchedulerState gst_opt_scheduler_iterate (GstScheduler * sched);
|
static GstSchedulerState gst_opt_scheduler_iterate (GstScheduler * sched);
|
||||||
|
|
||||||
static void gst_opt_scheduler_show (GstScheduler * sched);
|
static void gst_opt_scheduler_show (GstScheduler * sched);
|
||||||
|
@ -407,10 +401,6 @@ gst_opt_scheduler_class_init (GstOptSchedulerClass * klass)
|
||||||
GST_DEBUG_FUNCPTR (gst_opt_scheduler_state_transition);
|
GST_DEBUG_FUNCPTR (gst_opt_scheduler_state_transition);
|
||||||
gstscheduler_class->scheduling_change =
|
gstscheduler_class->scheduling_change =
|
||||||
GST_DEBUG_FUNCPTR (gst_opt_scheduler_scheduling_change);
|
GST_DEBUG_FUNCPTR (gst_opt_scheduler_scheduling_change);
|
||||||
gstscheduler_class->lock_element =
|
|
||||||
GST_DEBUG_FUNCPTR (gst_opt_scheduler_lock_element);
|
|
||||||
gstscheduler_class->unlock_element =
|
|
||||||
GST_DEBUG_FUNCPTR (gst_opt_scheduler_unlock_element);
|
|
||||||
gstscheduler_class->yield = GST_DEBUG_FUNCPTR (gst_opt_scheduler_yield);
|
gstscheduler_class->yield = GST_DEBUG_FUNCPTR (gst_opt_scheduler_yield);
|
||||||
gstscheduler_class->interrupt =
|
gstscheduler_class->interrupt =
|
||||||
GST_DEBUG_FUNCPTR (gst_opt_scheduler_interrupt);
|
GST_DEBUG_FUNCPTR (gst_opt_scheduler_interrupt);
|
||||||
|
@ -418,8 +408,6 @@ gst_opt_scheduler_class_init (GstOptSchedulerClass * klass)
|
||||||
gstscheduler_class->pad_link = GST_DEBUG_FUNCPTR (gst_opt_scheduler_pad_link);
|
gstscheduler_class->pad_link = GST_DEBUG_FUNCPTR (gst_opt_scheduler_pad_link);
|
||||||
gstscheduler_class->pad_unlink =
|
gstscheduler_class->pad_unlink =
|
||||||
GST_DEBUG_FUNCPTR (gst_opt_scheduler_pad_unlink);
|
GST_DEBUG_FUNCPTR (gst_opt_scheduler_pad_unlink);
|
||||||
gstscheduler_class->pad_select =
|
|
||||||
GST_DEBUG_FUNCPTR (gst_opt_scheduler_pad_select);
|
|
||||||
gstscheduler_class->clock_wait = NULL;
|
gstscheduler_class->clock_wait = NULL;
|
||||||
gstscheduler_class->iterate = GST_DEBUG_FUNCPTR (gst_opt_scheduler_iterate);
|
gstscheduler_class->iterate = GST_DEBUG_FUNCPTR (gst_opt_scheduler_iterate);
|
||||||
gstscheduler_class->show = GST_DEBUG_FUNCPTR (gst_opt_scheduler_show);
|
gstscheduler_class->show = GST_DEBUG_FUNCPTR (gst_opt_scheduler_show);
|
||||||
|
@ -1787,20 +1775,6 @@ gst_opt_scheduler_remove_element (GstScheduler * sched, GstElement * element)
|
||||||
GST_ELEMENT (element)->sched_private = NULL;
|
GST_ELEMENT (element)->sched_private = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
gst_opt_scheduler_lock_element (GstScheduler * sched, GstElement * element)
|
|
||||||
{
|
|
||||||
//GstOptScheduler *osched = GST_OPT_SCHEDULER (sched);
|
|
||||||
g_warning ("lock element, implement me");
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
gst_opt_scheduler_unlock_element (GstScheduler * sched, GstElement * element)
|
|
||||||
{
|
|
||||||
//GstOptScheduler *osched = GST_OPT_SCHEDULER (sched);
|
|
||||||
g_warning ("unlock element, implement me");
|
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
gst_opt_scheduler_yield (GstScheduler * sched, GstElement * element)
|
gst_opt_scheduler_yield (GstScheduler * sched, GstElement * element)
|
||||||
{
|
{
|
||||||
|
@ -2315,14 +2289,6 @@ gst_opt_scheduler_pad_unlink (GstScheduler * sched,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
gst_opt_scheduler_pad_select (GstScheduler * sched, GList * padlist)
|
|
||||||
{
|
|
||||||
//GstOptScheduler *osched = GST_OPT_SCHEDULER (sched);
|
|
||||||
|
|
||||||
g_warning ("pad select, implement me");
|
|
||||||
}
|
|
||||||
|
|
||||||
/* a scheduler iteration is done by looping and scheduling the active chains */
|
/* a scheduler iteration is done by looping and scheduling the active chains */
|
||||||
static GstSchedulerState
|
static GstSchedulerState
|
||||||
gst_opt_scheduler_iterate (GstScheduler * sched)
|
gst_opt_scheduler_iterate (GstScheduler * sched)
|
||||||
|
|
|
@ -76,8 +76,6 @@ static cothread * cothread_create (cothread_context *conte
|
||||||
}G_STMT_END
|
}G_STMT_END
|
||||||
static void do_cothread_switch (cothread *to);
|
static void do_cothread_switch (cothread *to);
|
||||||
static void do_cothread_destroy (cothread *thread);
|
static void do_cothread_destroy (cothread *thread);
|
||||||
#define do_cothread_lock(cothread) /* FIXME */
|
|
||||||
#define do_cothread_unlock(cothread) /* FIXME */
|
|
||||||
#define do_cothread_get_current(context) ((context)->current)
|
#define do_cothread_get_current(context) ((context)->current)
|
||||||
#define do_cothread_get_main(context) ((context)->main)
|
#define do_cothread_get_main(context) ((context)->main)
|
||||||
|
|
||||||
|
@ -210,8 +208,5 @@ do_cothread_destroy (cothread *thread)
|
||||||
/* the mutex was locked by the thread that we joined, no need to lock again */
|
/* the mutex was locked by the thread that we joined, no need to lock again */
|
||||||
}
|
}
|
||||||
|
|
||||||
#define do_cothread_lock(cothread) /* FIXME */
|
|
||||||
#define do_cothread_unlock(cothread) /* FIXME */
|
|
||||||
|
|
||||||
#define do_cothread_get_current(context) ((context)->current)
|
#define do_cothread_get_current(context) ((context)->current)
|
||||||
#define do_cothread_get_main(context) ((context)->main)
|
#define do_cothread_get_main(context) ((context)->main)
|
||||||
|
|
|
@ -336,8 +336,7 @@ gst_aggregator_loop (GstElement * element)
|
||||||
|
|
||||||
debug = "loop_select";
|
debug = "loop_select";
|
||||||
|
|
||||||
pad = gst_pad_selectv (aggregator->sinkpads);
|
buf = GST_BUFFER (gst_pad_collectv (&pad, aggregator->sinkpads));
|
||||||
buf = GST_BUFFER (gst_pad_pull (pad));
|
|
||||||
|
|
||||||
gst_aggregator_push (aggregator, pad, buf, debug);
|
gst_aggregator_push (aggregator, pad, buf, debug);
|
||||||
} else {
|
} else {
|
||||||
|
|
Loading…
Reference in a new issue