mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-01-19 05:45:58 +00:00
update to latest copy
Original commit message from CVS: update to latest copy
This commit is contained in:
parent
781b4f7ecb
commit
3b2990b425
7 changed files with 129 additions and 101 deletions
|
@ -29,7 +29,7 @@
|
|||
#include <sys/mman.h>
|
||||
|
||||
/* we make too much noise for normal debugging... */
|
||||
//#define GST_DEBUG_FORCE_DISABLE
|
||||
#define GST_DEBUG_FORCE_DISABLE
|
||||
#include "gst_private.h"
|
||||
|
||||
#include "cothreads.h"
|
||||
|
|
29
gst/gstbin.c
29
gst/gstbin.c
|
@ -114,7 +114,7 @@ gst_bin_class_init (GstBinClass *klass)
|
|||
|
||||
klass->change_state_type = gst_bin_change_state_type;
|
||||
klass->create_plan = gst_bin_create_plan_func;
|
||||
klass->schedule = gst_bin_schedule_func;
|
||||
// klass->schedule = gst_bin_schedule_func;
|
||||
klass->iterate = gst_bin_iterate_func;
|
||||
|
||||
gstobject_class->save_thyself = gst_bin_save_thyself;
|
||||
|
@ -316,7 +316,7 @@ gst_bin_remove (GstBin *bin,
|
|||
(GST_STATE (bin) == GST_STATE_PAUSED));
|
||||
|
||||
// the element must have its parent set to the current bin
|
||||
g_return_if_fail (GST_ELEMENT_PARENT(element) == bin);
|
||||
g_return_if_fail (GST_ELEMENT_PARENT(element) == (GstElement *)bin);
|
||||
|
||||
// the element must be in the bin's list of children
|
||||
if (g_list_find(bin->children, element) == NULL) {
|
||||
|
@ -415,10 +415,10 @@ gst_bin_change_state (GstElement *element)
|
|||
static GstElementStateReturn
|
||||
gst_bin_change_state_norecurse (GstBin *bin)
|
||||
{
|
||||
|
||||
if (GST_ELEMENT_CLASS (parent_class)->change_state)
|
||||
if (GST_ELEMENT_CLASS (parent_class)->change_state) {
|
||||
GST_DEBUG(GST_CAT_STATES, "setting bin's own state\n");
|
||||
return GST_ELEMENT_CLASS (parent_class)->change_state (GST_ELEMENT (bin));
|
||||
else
|
||||
} else
|
||||
return GST_STATE_FAILURE;
|
||||
}
|
||||
|
||||
|
@ -738,9 +738,11 @@ typedef struct {
|
|||
} region_struct;
|
||||
|
||||
|
||||
/* seriously depracated!!! */
|
||||
static void
|
||||
gst_bin_create_plan_func (GstBin *bin)
|
||||
{
|
||||
/*
|
||||
GstElement *manager;
|
||||
GList *elements;
|
||||
GstElement *element;
|
||||
|
@ -749,6 +751,7 @@ gst_bin_create_plan_func (GstBin *bin)
|
|||
#endif
|
||||
GSList *pending = NULL;
|
||||
GstBin *pending_bin;
|
||||
*/
|
||||
|
||||
GST_DEBUG_ENTER("(\"%s\")",GST_ELEMENT_NAME (bin));
|
||||
|
||||
|
@ -943,7 +946,21 @@ gst_bin_iterate_func (GstBin *bin)
|
|||
// FIXME this should be lots more intelligent about where to start
|
||||
GST_DEBUG (0,"starting iteration via cothreads\n");
|
||||
|
||||
entry = GST_ELEMENT (chain->elements->data);
|
||||
entries = chain->elements;
|
||||
entry = NULL;
|
||||
|
||||
// find an element with a threadstate to start with
|
||||
while (entries) {
|
||||
entry = GST_ELEMENT (entries->data);
|
||||
|
||||
if (entry->threadstate)
|
||||
break;
|
||||
entries = g_list_next (entries);
|
||||
}
|
||||
// if we couldn't find one, bail out
|
||||
if (entries == NULL)
|
||||
GST_ERROR(GST_ELEMENT(bin),"no cothreaded elements found!");
|
||||
|
||||
GST_FLAG_SET (entry, GST_ELEMENT_COTHREAD_STOPPING);
|
||||
GST_DEBUG (0,"set COTHREAD_STOPPING flag on \"%s\"(@%p)\n",
|
||||
GST_ELEMENT_NAME (entry),entry);
|
||||
|
|
|
@ -721,7 +721,7 @@ gst_element_set_state (GstElement *element, GstElementState state)
|
|||
/* if that outright didn't work, we need to bail right away */
|
||||
/* NOTE: this will bail on ASYNC as well! */
|
||||
if (return_val == GST_STATE_FAILURE) {
|
||||
// GST_DEBUG (0,"have async return from '%s'\n",GST_ELEMENT_NAME (element));
|
||||
GST_DEBUG (GST_CAT_STATES,"have failed change_state return from '%s'\n",GST_ELEMENT_NAME (element));
|
||||
return return_val;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1205,6 +1205,8 @@ gst_pad_eos_func(GstPad *pad)
|
|||
GST_INFO (GST_CAT_PADS,"set EOS on sink pad %s:%s",GST_DEBUG_PAD_NAME(pad));
|
||||
GST_FLAG_SET (pad, GST_PAD_EOS);
|
||||
|
||||
gst_element_set_state (GST_ELEMENT(GST_PAD_PARENT(pad)), GST_STATE_READY);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
@ -1232,6 +1234,8 @@ gst_pad_set_eos(GstPad *pad)
|
|||
GST_INFO (GST_CAT_PADS,"set EOS on src pad %s:%s",GST_DEBUG_PAD_NAME(pad));
|
||||
GST_FLAG_SET (pad, GST_PAD_EOS);
|
||||
|
||||
gst_element_set_state (GST_ELEMENT(GST_PAD_PARENT(pad)), GST_STATE_READY);
|
||||
|
||||
gst_element_signal_eos (GST_ELEMENT (GST_PAD_PARENT (pad)));
|
||||
|
||||
return TRUE;
|
||||
|
|
|
@ -35,10 +35,10 @@ gst_bin_loopfunc_wrapper (int argc,char *argv[])
|
|||
GST_DEBUG_ENTER("(%d,'%s')",argc,name);
|
||||
|
||||
do {
|
||||
GST_DEBUG (0,"calling loopfunc %s for element %s\n",
|
||||
GST_DEBUG (GST_CAT_DATAFLOW,"calling loopfunc %s for element %s\n",
|
||||
GST_DEBUG_FUNCPTR_NAME (element->loopfunc),name);
|
||||
(element->loopfunc) (element);
|
||||
GST_DEBUG (0,"element %s ended loop function\n", name);
|
||||
GST_DEBUG (GST_CAT_DATAFLOW,"element %s ended loop function\n", name);
|
||||
} while (!GST_ELEMENT_IS_COTHREAD_STOPPING(element));
|
||||
GST_FLAG_UNSET(element,GST_ELEMENT_COTHREAD_STOPPING);
|
||||
|
||||
|
@ -57,7 +57,7 @@ gst_bin_chain_wrapper (int argc,char *argv[])
|
|||
GstBuffer *buf;
|
||||
|
||||
GST_DEBUG_ENTER("(\"%s\")",name);
|
||||
GST_DEBUG (0,"stepping through pads\n");
|
||||
GST_DEBUG (GST_CAT_DATAFLOW,"stepping through pads\n");
|
||||
do {
|
||||
pads = element->pads;
|
||||
while (pads) {
|
||||
|
@ -66,11 +66,11 @@ gst_bin_chain_wrapper (int argc,char *argv[])
|
|||
if (!GST_IS_REAL_PAD(pad)) continue;
|
||||
realpad = GST_REAL_PAD(pad);
|
||||
if (GST_RPAD_DIRECTION(realpad) == GST_PAD_SINK) {
|
||||
GST_DEBUG (0,"pulling a buffer from %s:%s\n", name, GST_PAD_NAME (pad));
|
||||
GST_DEBUG (GST_CAT_DATAFLOW,"pulling a buffer from %s:%s\n", name, GST_PAD_NAME (pad));
|
||||
buf = gst_pad_pull (pad);
|
||||
GST_DEBUG (0,"calling chain function of %s:%s\n", name, GST_PAD_NAME (pad));
|
||||
GST_DEBUG (GST_CAT_DATAFLOW,"calling chain function of %s:%s\n", name, GST_PAD_NAME (pad));
|
||||
if (buf) GST_RPAD_CHAINFUNC(realpad) (pad,buf);
|
||||
GST_DEBUG (0,"calling chain function of %s:%s done\n", name, GST_PAD_NAME (pad));
|
||||
GST_DEBUG (GST_CAT_DATAFLOW,"calling chain function of %s:%s done\n", name, GST_PAD_NAME (pad));
|
||||
}
|
||||
}
|
||||
} while (!GST_ELEMENT_IS_COTHREAD_STOPPING(element));
|
||||
|
@ -98,7 +98,7 @@ gst_bin_src_wrapper (int argc,char *argv[])
|
|||
realpad = (GstRealPad*)(pads->data);
|
||||
pads = g_list_next(pads);
|
||||
if (GST_RPAD_DIRECTION(realpad) == GST_PAD_SRC) {
|
||||
GST_DEBUG (0,"calling _getfunc for %s:%s\n",GST_DEBUG_PAD_NAME(realpad));
|
||||
GST_DEBUG (GST_CAT_DATAFLOW,"calling _getfunc for %s:%s\n",GST_DEBUG_PAD_NAME(realpad));
|
||||
if (realpad->regiontype != GST_REGION_NONE) {
|
||||
g_return_val_if_fail (GST_RPAD_GETREGIONFUNC(realpad) != NULL, 0);
|
||||
// if (GST_RPAD_GETREGIONFUNC(realpad) == NULL)
|
||||
|
@ -113,7 +113,7 @@ gst_bin_src_wrapper (int argc,char *argv[])
|
|||
buf = GST_RPAD_GETFUNC(realpad) ((GstPad*)realpad);
|
||||
}
|
||||
|
||||
GST_DEBUG (0,"calling gst_pad_push on pad %s:%s\n",GST_DEBUG_PAD_NAME(realpad));
|
||||
GST_DEBUG (GST_CAT_DATAFLOW,"calling gst_pad_push on pad %s:%s\n",GST_DEBUG_PAD_NAME(realpad));
|
||||
if (buf) gst_pad_push ((GstPad*)realpad, buf);
|
||||
}
|
||||
}
|
||||
|
@ -127,30 +127,29 @@ gst_bin_src_wrapper (int argc,char *argv[])
|
|||
static void
|
||||
gst_bin_pushfunc_proxy (GstPad *pad, GstBuffer *buf)
|
||||
{
|
||||
GstPad *peer = GST_RPAD_PEER(pad);
|
||||
cothread_state *threadstate;
|
||||
GstRealPad *peer = GST_RPAD_PEER(pad);
|
||||
|
||||
GST_DEBUG_ENTER("(%s:%s)",GST_DEBUG_PAD_NAME(pad));
|
||||
GST_DEBUG (GST_CAT_DATAFLOW,"putting buffer %p in peer's pen\n",buf);
|
||||
|
||||
// FIXME this should be bounded
|
||||
// loop until the bufferpen is empty so we can fill it up again
|
||||
while (GST_RPAD_BUFPEN(pad) != NULL) {
|
||||
threadstate = GST_ELEMENT (GST_PAD_PARENT (pad))->threadstate;
|
||||
GST_DEBUG (GST_CAT_DATAFLOW, "switching to %p to empty bufpen\n",threadstate);
|
||||
cothread_switch (threadstate);
|
||||
GST_DEBUG (GST_CAT_DATAFLOW, "switching to %p to empty bufpen\n",
|
||||
GST_ELEMENT (GST_PAD_PARENT (pad))->threadstate);
|
||||
cothread_switch (GST_ELEMENT (GST_PAD_PARENT (pad))->threadstate);
|
||||
|
||||
// we may no longer be the same pad, check.
|
||||
if (GST_RPAD_PEER(peer) != pad) {
|
||||
if (GST_RPAD_PEER(peer) != (GstRealPad *)pad) {
|
||||
GST_DEBUG (GST_CAT_DATAFLOW, "new pad in mid-switch!\n");
|
||||
pad = GST_RPAD_PEER(peer);
|
||||
pad = (GstPad *)GST_RPAD_PEER(peer);
|
||||
}
|
||||
}
|
||||
|
||||
threadstate = GST_ELEMENT (GST_PAD_PARENT (pad))->threadstate;
|
||||
// now fill the bufferpen and switch so it can be consumed
|
||||
GST_RPAD_BUFPEN(GST_RPAD_PEER(pad)) = buf;
|
||||
GST_DEBUG (GST_CAT_DATAFLOW,"switching to %p (@%p)\n",threadstate,&(GST_ELEMENT(GST_PAD_PARENT(pad))->threadstate));
|
||||
cothread_switch (threadstate);
|
||||
GST_DEBUG (GST_CAT_DATAFLOW,"switching to %p\n",GST_ELEMENT (GST_PAD_PARENT (pad))->threadstate);
|
||||
cothread_switch (GST_ELEMENT (GST_PAD_PARENT (pad))->threadstate);
|
||||
|
||||
GST_DEBUG (GST_CAT_DATAFLOW,"done switching\n");
|
||||
}
|
||||
|
@ -158,26 +157,23 @@ gst_bin_pushfunc_proxy (GstPad *pad, GstBuffer *buf)
|
|||
static GstBuffer*
|
||||
gst_bin_pullfunc_proxy (GstPad *pad)
|
||||
{
|
||||
GstPad *peer = GST_RPAD_PEER(pad);
|
||||
GstBuffer *buf;
|
||||
GstRealPad *peer = GST_RPAD_PEER(pad);
|
||||
|
||||
cothread_state *threadstate;
|
||||
GST_DEBUG_ENTER("(%s:%s)",GST_DEBUG_PAD_NAME(pad));
|
||||
|
||||
// FIXME this should be bounded
|
||||
// we will loop switching to the peer until it's filled up the bufferpen
|
||||
while (GST_RPAD_BUFPEN(pad) == NULL) {
|
||||
// get the new threadstate, if it changed (FIXME?)
|
||||
threadstate = GST_ELEMENT(GST_PAD_PARENT(pad))->threadstate;
|
||||
|
||||
GST_DEBUG (GST_CAT_DATAFLOW, "switching to \"%s\": %p to fill bufpen\n",
|
||||
GST_ELEMENT_NAME(GST_ELEMENT(GST_PAD_PARENT(pad))),threadstate);
|
||||
cothread_switch (threadstate);
|
||||
GST_ELEMENT_NAME(GST_ELEMENT(GST_PAD_PARENT(pad))),
|
||||
GST_ELEMENT(GST_PAD_PARENT(pad))->threadstate);
|
||||
cothread_switch (GST_ELEMENT(GST_PAD_PARENT(pad))->threadstate);
|
||||
|
||||
// we may no longer be the same pad, check.
|
||||
if (GST_RPAD_PEER(peer) != pad) {
|
||||
if (GST_RPAD_PEER(peer) != (GstRealPad *)pad) {
|
||||
GST_DEBUG (GST_CAT_DATAFLOW, "new pad in mid-switch!\n");
|
||||
pad = GST_RPAD_PEER(peer);
|
||||
pad = (GstPad *)GST_RPAD_PEER(peer);
|
||||
}
|
||||
}
|
||||
GST_DEBUG (GST_CAT_DATAFLOW,"done switching\n");
|
||||
|
@ -192,9 +188,8 @@ static GstBuffer*
|
|||
gst_bin_pullregionfunc_proxy (GstPad *pad,GstRegionType type,guint64 offset,guint64 len)
|
||||
{
|
||||
GstBuffer *buf;
|
||||
GstPad *peer = GST_RPAD_PEER(pad);
|
||||
GstRealPad *peer = GST_RPAD_PEER(pad);
|
||||
|
||||
cothread_state *threadstate = GST_ELEMENT(GST_PAD_PARENT(pad))->threadstate;
|
||||
GST_DEBUG_ENTER("%s:%s,%d,%lld,%lld",GST_DEBUG_PAD_NAME(pad),type,offset,len);
|
||||
|
||||
// put the region info into the pad
|
||||
|
@ -205,14 +200,14 @@ gst_bin_pullregionfunc_proxy (GstPad *pad,GstRegionType type,guint64 offset,guin
|
|||
// FIXME this should be bounded
|
||||
// we will loop switching to the peer until it's filled up the bufferpen
|
||||
while (GST_RPAD_BUFPEN(pad) == NULL) {
|
||||
threadstate = GST_ELEMENT (GST_PAD_PARENT (pad))->threadstate;
|
||||
GST_DEBUG (GST_CAT_DATAFLOW, "switching to %p to fill bufpen\n",threadstate);
|
||||
cothread_switch (threadstate);
|
||||
GST_DEBUG (GST_CAT_DATAFLOW, "switching to %p to fill bufpen\n",
|
||||
GST_ELEMENT(GST_PAD_PARENT(pad))->threadstate);
|
||||
cothread_switch (GST_ELEMENT(GST_PAD_PARENT(pad))->threadstate);
|
||||
|
||||
// we may no longer be the same pad, check.
|
||||
if (GST_RPAD_PEER(peer) != pad) {
|
||||
if (GST_RPAD_PEER(peer) != (GstRealPad *)pad) {
|
||||
GST_DEBUG (GST_CAT_DATAFLOW, "new pad in mid-switch!\n");
|
||||
pad = GST_RPAD_PEER(peer);
|
||||
pad = (GstPad *)GST_RPAD_PEER(peer);
|
||||
}
|
||||
}
|
||||
GST_DEBUG (GST_CAT_DATAFLOW,"done switching\n");
|
||||
|
@ -232,11 +227,11 @@ gst_schedule_cothreaded_chain (GstBin *bin, GstScheduleChain *chain) {
|
|||
GList *pads;
|
||||
GstPad *pad;
|
||||
|
||||
GST_DEBUG (0,"chain is using COTHREADS\n");
|
||||
GST_DEBUG (GST_CAT_SCHEDULING,"chain is using COTHREADS\n");
|
||||
|
||||
// first create thread context
|
||||
if (bin->threadcontext == NULL) {
|
||||
GST_DEBUG (0,"initializing cothread context\n");
|
||||
GST_DEBUG (GST_CAT_SCHEDULING,"initializing cothread context\n");
|
||||
bin->threadcontext = cothread_init ();
|
||||
}
|
||||
|
||||
|
@ -252,7 +247,7 @@ gst_schedule_cothreaded_chain (GstBin *bin, GstScheduleChain *chain) {
|
|||
// if the element has a loopfunc...
|
||||
if (element->loopfunc != NULL) {
|
||||
wrapper_function = GST_DEBUG_FUNCPTR(gst_bin_loopfunc_wrapper);
|
||||
GST_DEBUG (0,"element '%s' is a loop-based\n",GST_ELEMENT_NAME(element));
|
||||
GST_DEBUG (GST_CAT_SCHEDULING,"element '%s' is a loop-based\n",GST_ELEMENT_NAME(element));
|
||||
} else {
|
||||
// otherwise we need to decide what kind of cothread
|
||||
// if it's not DECOUPLED, we decide based on whether it's a source or not
|
||||
|
@ -260,10 +255,10 @@ gst_schedule_cothreaded_chain (GstBin *bin, GstScheduleChain *chain) {
|
|||
// if it doesn't have any sinks, it must be a source (duh)
|
||||
if (element->numsinkpads == 0) {
|
||||
wrapper_function = GST_DEBUG_FUNCPTR(gst_bin_src_wrapper);
|
||||
GST_DEBUG (0,"element '%s' is a source, using _src_wrapper\n",GST_ELEMENT_NAME(element));
|
||||
GST_DEBUG (GST_CAT_SCHEDULING,"element '%s' is a source, using _src_wrapper\n",GST_ELEMENT_NAME(element));
|
||||
} else {
|
||||
wrapper_function = GST_DEBUG_FUNCPTR(gst_bin_chain_wrapper);
|
||||
GST_DEBUG (0,"element '%s' is a filter, using _chain_wrapper\n",GST_ELEMENT_NAME(element));
|
||||
GST_DEBUG (GST_CAT_SCHEDULING,"element '%s' is a filter, using _chain_wrapper\n",GST_ELEMENT_NAME(element));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -282,10 +277,10 @@ gst_schedule_cothreaded_chain (GstBin *bin, GstScheduleChain *chain) {
|
|||
) {
|
||||
// set the chain proxies
|
||||
if (GST_RPAD_DIRECTION(pad) == GST_PAD_SINK) {
|
||||
GST_DEBUG (0,"copying chain function into push proxy for %s:%s\n",GST_DEBUG_PAD_NAME(pad));
|
||||
GST_DEBUG (GST_CAT_SCHEDULING,"copying chain function into push proxy for %s:%s\n",GST_DEBUG_PAD_NAME(pad));
|
||||
GST_RPAD_PUSHFUNC(pad) = GST_RPAD_CHAINFUNC(pad);
|
||||
} else {
|
||||
GST_DEBUG (0,"copying get function into pull proxy for %s:%s\n",GST_DEBUG_PAD_NAME(pad));
|
||||
GST_DEBUG (GST_CAT_SCHEDULING,"copying get function into pull proxy for %s:%s\n",GST_DEBUG_PAD_NAME(pad));
|
||||
GST_RPAD_PULLFUNC(pad) = GST_RPAD_GETFUNC(pad);
|
||||
GST_RPAD_PULLREGIONFUNC(pad) = GST_RPAD_GETREGIONFUNC(pad);
|
||||
}
|
||||
|
@ -293,10 +288,10 @@ gst_schedule_cothreaded_chain (GstBin *bin, GstScheduleChain *chain) {
|
|||
// otherwise we really are a cothread
|
||||
} else {
|
||||
if (gst_pad_get_direction (pad) == GST_PAD_SINK) {
|
||||
GST_DEBUG (0,"setting cothreaded push proxy for sinkpad %s:%s\n",GST_DEBUG_PAD_NAME(pad));
|
||||
GST_DEBUG (GST_CAT_SCHEDULING,"setting cothreaded push proxy for sinkpad %s:%s\n",GST_DEBUG_PAD_NAME(pad));
|
||||
GST_RPAD_PUSHFUNC(pad) = GST_DEBUG_FUNCPTR(gst_bin_pushfunc_proxy);
|
||||
} else {
|
||||
GST_DEBUG (0,"setting cothreaded pull proxy for srcpad %s:%s\n",GST_DEBUG_PAD_NAME(pad));
|
||||
GST_DEBUG (GST_CAT_SCHEDULING,"setting cothreaded pull proxy for srcpad %s:%s\n",GST_DEBUG_PAD_NAME(pad));
|
||||
GST_RPAD_PULLFUNC(pad) = GST_DEBUG_FUNCPTR(gst_bin_pullfunc_proxy);
|
||||
GST_RPAD_PULLREGIONFUNC(pad) = GST_DEBUG_FUNCPTR(gst_bin_pullregionfunc_proxy);
|
||||
}
|
||||
|
@ -307,10 +302,10 @@ gst_schedule_cothreaded_chain (GstBin *bin, GstScheduleChain *chain) {
|
|||
if (wrapper_function != NULL) {
|
||||
if (element->threadstate == NULL) {
|
||||
element->threadstate = cothread_create (bin->threadcontext);
|
||||
GST_DEBUG (0,"created cothread %p for '%s'\n",element->threadstate,GST_ELEMENT_NAME(element));
|
||||
GST_DEBUG (GST_CAT_SCHEDULING,"created cothread %p for '%s'\n",element->threadstate,GST_ELEMENT_NAME(element));
|
||||
}
|
||||
cothread_setfunc (element->threadstate, wrapper_function, 0, (char **)element);
|
||||
GST_DEBUG (0,"set wrapper function for '%s' to &%s\n",GST_ELEMENT_NAME(element),
|
||||
GST_DEBUG (GST_CAT_SCHEDULING,"set wrapper function for '%s' to &%s\n",GST_ELEMENT_NAME(element),
|
||||
GST_DEBUG_FUNCPTR_NAME(wrapper_function));
|
||||
}
|
||||
}
|
||||
|
@ -323,7 +318,7 @@ gst_schedule_chained_chain (GstBin *bin, _GstBinChain *chain) {
|
|||
GList *pads;
|
||||
GstPad *pad;
|
||||
|
||||
GST_DEBUG (0,"chain entered\n");
|
||||
GST_DEBUG (GST_CAT_SCHEDULING,"chain entered\n");
|
||||
// walk through all the elements
|
||||
elements = chain->elements;
|
||||
while (elements) {
|
||||
|
@ -338,10 +333,10 @@ gst_schedule_chained_chain (GstBin *bin, _GstBinChain *chain) {
|
|||
if (!GST_IS_REAL_PAD(pad)) continue;
|
||||
|
||||
if (GST_RPAD_DIRECTION(pad) == GST_PAD_SINK) {
|
||||
GST_DEBUG (0,"copying chain function into push proxy for %s:%s\n",GST_DEBUG_PAD_NAME(pad));
|
||||
GST_DEBUG (GST_CAT_SCHEDULING,"copying chain function into push proxy for %s:%s\n",GST_DEBUG_PAD_NAME(pad));
|
||||
GST_RPAD_PUSHFUNC(pad) = GST_RPAD_CHAINFUNC(pad);
|
||||
} else {
|
||||
GST_DEBUG (0,"copying get function into pull proxy for %s:%s\n",GST_DEBUG_PAD_NAME(pad));
|
||||
GST_DEBUG (GST_CAT_SCHEDULING,"copying get function into pull proxy for %s:%s\n",GST_DEBUG_PAD_NAME(pad));
|
||||
GST_RPAD_PULLFUNC(pad) = GST_RPAD_GETFUNC(pad);
|
||||
GST_RPAD_PULLREGIONFUNC(pad) = GST_RPAD_GETREGIONFUNC(pad);
|
||||
}
|
||||
|
@ -349,6 +344,7 @@ gst_schedule_chained_chain (GstBin *bin, _GstBinChain *chain) {
|
|||
}
|
||||
}
|
||||
|
||||
/* depracated!! */
|
||||
static void
|
||||
gst_bin_schedule_cleanup (GstBin *bin)
|
||||
{
|
||||
|
@ -360,6 +356,7 @@ gst_bin_schedule_cleanup (GstBin *bin)
|
|||
chain = (_GstBinChain *)(chains->data);
|
||||
chains = g_list_next(chains);
|
||||
|
||||
// g_list_free(chain->disabled);
|
||||
g_list_free(chain->elements);
|
||||
g_list_free(chain->entries);
|
||||
|
||||
|
@ -373,10 +370,11 @@ gst_bin_schedule_cleanup (GstBin *bin)
|
|||
static void
|
||||
gst_scheduler_handle_eos (GstElement *element, _GstBinChain *chain)
|
||||
{
|
||||
GST_DEBUG (0,"chain removed from scheduler, EOS from element \"%s\"\n", GST_ELEMENT_NAME (element));
|
||||
GST_DEBUG (GST_CAT_SCHEDULING,"chain removed from scheduler, EOS from element \"%s\"\n", GST_ELEMENT_NAME (element));
|
||||
chain->need_scheduling = FALSE;
|
||||
}
|
||||
|
||||
/*
|
||||
void gst_bin_schedule_func(GstBin *bin) {
|
||||
GList *elements;
|
||||
GstElement *element;
|
||||
|
@ -385,14 +383,14 @@ void gst_bin_schedule_func(GstBin *bin) {
|
|||
GstPad *pad;
|
||||
GstElement *peerparent;
|
||||
GList *chains;
|
||||
_GstBinChain *chain;
|
||||
GstScheduleChain *chain;
|
||||
|
||||
GST_DEBUG_ENTER("(\"%s\")",GST_ELEMENT_NAME (GST_ELEMENT (bin)));
|
||||
|
||||
gst_bin_schedule_cleanup(bin);
|
||||
|
||||
// next we have to find all the separate scheduling chains
|
||||
GST_DEBUG (0,"attempting to find scheduling chains...\n");
|
||||
GST_DEBUG (GST_CAT_SCHEDULING,"attempting to find scheduling chains...\n");
|
||||
// first make a copy of the managed_elements we can mess with
|
||||
elements = g_list_copy (bin->managed_elements);
|
||||
// we have to repeat until the list is empty to get all chains
|
||||
|
@ -402,12 +400,12 @@ void gst_bin_schedule_func(GstBin *bin) {
|
|||
// if this is a DECOUPLED element
|
||||
if (GST_FLAG_IS_SET (element, GST_ELEMENT_DECOUPLED)) {
|
||||
// skip this element entirely
|
||||
GST_DEBUG (0,"skipping '%s' because it's decoupled\n",GST_ELEMENT_NAME(element));
|
||||
GST_DEBUG (GST_CAT_SCHEDULING,"skipping '%s' because it's decoupled\n",GST_ELEMENT_NAME(element));
|
||||
elements = g_list_next (elements);
|
||||
continue;
|
||||
}
|
||||
|
||||
GST_DEBUG (0,"starting with element '%s'\n",GST_ELEMENT_NAME(element));
|
||||
GST_DEBUG (GST_CAT_SCHEDULING,"starting with element '%s'\n",GST_ELEMENT_NAME(element));
|
||||
|
||||
// prime the pending list with the first element off the top
|
||||
pending = g_slist_prepend (NULL, element);
|
||||
|
@ -425,7 +423,7 @@ void gst_bin_schedule_func(GstBin *bin) {
|
|||
pending = g_slist_remove (pending, element);
|
||||
|
||||
// add ourselves to the chain's list of elements
|
||||
GST_DEBUG (0,"adding '%s' to chain\n",GST_ELEMENT_NAME(element));
|
||||
GST_DEBUG (GST_CAT_SCHEDULING,"adding '%s' to chain\n",GST_ELEMENT_NAME(element));
|
||||
chain->elements = g_list_prepend (chain->elements, element);
|
||||
chain->num_elements++;
|
||||
gtk_signal_connect (GTK_OBJECT (element), "eos", gst_scheduler_handle_eos, chain);
|
||||
|
@ -440,13 +438,13 @@ void gst_bin_schedule_func(GstBin *bin) {
|
|||
if ((element->manager == GST_ELEMENT(bin)) &&
|
||||
!GST_FLAG_IS_SET (element, GST_ELEMENT_DECOUPLED)) {
|
||||
// remove ourselves from the outer list of all managed elements
|
||||
// GST_DEBUG (0,"removing '%s' from list of possible elements\n",GST_ELEMENT_NAME(element));
|
||||
// GST_DEBUG (GST_CAT_SCHEDULING,"removing '%s' from list of possible elements\n",GST_ELEMENT_NAME(element));
|
||||
elements = g_list_remove (elements, element);
|
||||
|
||||
// if this element is a source, add it as an entry
|
||||
if (element->numsinkpads == 0) {
|
||||
chain->entries = g_list_prepend (chain->entries, element);
|
||||
GST_DEBUG (0,"added '%s' as SRC entry into the chain\n",GST_ELEMENT_NAME(element));
|
||||
GST_DEBUG (GST_CAT_SCHEDULING,"added '%s' as SRC entry into the chain\n",GST_ELEMENT_NAME(element));
|
||||
}
|
||||
|
||||
// now we have to walk the pads to find peers
|
||||
|
@ -455,7 +453,7 @@ void gst_bin_schedule_func(GstBin *bin) {
|
|||
pad = GST_PAD (pads->data);
|
||||
pads = g_list_next (pads);
|
||||
if (!GST_IS_REAL_PAD(pad)) continue;
|
||||
GST_DEBUG (0,"have pad %s:%s\n",GST_DEBUG_PAD_NAME(pad));
|
||||
GST_DEBUG (GST_CAT_SCHEDULING,"have pad %s:%s\n",GST_DEBUG_PAD_NAME(pad));
|
||||
|
||||
if (GST_RPAD_PEER(pad) == NULL) continue;
|
||||
if (GST_RPAD_PEER(pad) == NULL) GST_ERROR(pad,"peer is null!");
|
||||
|
@ -464,13 +462,13 @@ void gst_bin_schedule_func(GstBin *bin) {
|
|||
|
||||
peerparent = GST_ELEMENT(GST_PAD_PARENT (GST_PAD(GST_RPAD_PEER(pad))));
|
||||
|
||||
GST_DEBUG (0,"peer pad %p\n", GST_RPAD_PEER(pad));
|
||||
GST_DEBUG (GST_CAT_SCHEDULING,"peer pad %p\n", GST_RPAD_PEER(pad));
|
||||
// only bother with if the pad's peer's parent is this bin or it's DECOUPLED
|
||||
// only add it if it's in the list of un-visited elements still
|
||||
if ((g_list_find (elements, peerparent) != NULL) ||
|
||||
GST_FLAG_IS_SET (peerparent, GST_ELEMENT_DECOUPLED)) {
|
||||
// add the peer element to the pending list
|
||||
GST_DEBUG (0,"adding '%s' to list of pending elements\n",
|
||||
GST_DEBUG (GST_CAT_SCHEDULING,"adding '%s' to list of pending elements\n",
|
||||
GST_ELEMENT_NAME(peerparent));
|
||||
pending = g_slist_prepend (pending, peerparent);
|
||||
|
||||
|
@ -479,36 +477,36 @@ void gst_bin_schedule_func(GstBin *bin) {
|
|||
(GST_FLAG_IS_SET (peerparent, GST_ELEMENT_DECOUPLED))) {
|
||||
chain->entries = g_list_prepend (chain->entries, peerparent);
|
||||
gtk_signal_connect (GTK_OBJECT (peerparent), "eos", gst_scheduler_handle_eos, chain);
|
||||
GST_DEBUG (0,"added '%s' as DECOUPLED entry into the chain\n",GST_ELEMENT_NAME(peerparent));
|
||||
GST_DEBUG (GST_CAT_SCHEDULING,"added '%s' as DECOUPLED entry into the chain\n",GST_ELEMENT_NAME(peerparent));
|
||||
}
|
||||
} else
|
||||
GST_DEBUG (0,"element '%s' has already been dealt with\n",GST_ELEMENT_NAME(peerparent));
|
||||
GST_DEBUG (GST_CAT_SCHEDULING,"element '%s' has already been dealt with\n",GST_ELEMENT_NAME(peerparent));
|
||||
}
|
||||
}
|
||||
} while (pending);
|
||||
|
||||
// add the chain to the bin
|
||||
GST_DEBUG (0,"have chain with %d elements: ",chain->num_elements);
|
||||
GST_DEBUG (GST_CAT_SCHEDULING,"have chain with %d elements: ",chain->num_elements);
|
||||
{ GList *elements = chain->elements;
|
||||
while (elements) {
|
||||
element = GST_ELEMENT (elements->data);
|
||||
elements = g_list_next(elements);
|
||||
GST_DEBUG_NOPREFIX(0,"%s, ",GST_ELEMENT_NAME(element));
|
||||
GST_DEBUG_NOPREFIX(GST_CAT_SCHEDULING,"%s, ",GST_ELEMENT_NAME(element));
|
||||
}
|
||||
}
|
||||
GST_DEBUG_NOPREFIX(0,"\n");
|
||||
GST_DEBUG_NOPREFIX(GST_CAT_DATAFLOW,"\n");
|
||||
bin->chains = g_list_prepend (bin->chains, chain);
|
||||
bin->num_chains++;
|
||||
}
|
||||
// free up the list in case it's full of DECOUPLED elements
|
||||
g_list_free (elements);
|
||||
|
||||
GST_DEBUG (0,"\nwe have %d chains to schedule\n",bin->num_chains);
|
||||
GST_DEBUG (GST_CAT_SCHEDULING,"\nwe have %d chains to schedule\n",bin->num_chains);
|
||||
|
||||
// now we have to go through all the chains and schedule them
|
||||
chains = bin->chains;
|
||||
while (chains) {
|
||||
chain = (_GstBinChain *)(chains->data);
|
||||
chain = (GstScheduleChain *)(chains->data);
|
||||
chains = g_list_next (chains);
|
||||
|
||||
// schedule as appropriate
|
||||
|
@ -521,6 +519,7 @@ void gst_bin_schedule_func(GstBin *bin) {
|
|||
|
||||
GST_DEBUG_LEAVE("(\"%s\")",GST_ELEMENT_NAME(GST_ELEMENT(bin)));
|
||||
}
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
|
@ -774,7 +773,6 @@ void gst_bin_schedule_func(GstBin *bin) {
|
|||
*/
|
||||
|
||||
|
||||
|
||||
/*************** INCREMENTAL SCHEDULING CODE STARTS HERE ***************/
|
||||
|
||||
//static GstSchedule realsched;
|
||||
|
@ -912,7 +910,7 @@ gst_schedule_chain_enable_element (GstScheduleChain *chain, GstElement *element)
|
|||
chain->elements = g_list_prepend (chain->elements, element);
|
||||
|
||||
// reschedule the chain
|
||||
gst_schedule_cothreaded_chain(chain->sched->parent,chain);
|
||||
gst_schedule_cothreaded_chain(GST_BIN(chain->sched->parent),chain);
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -927,7 +925,7 @@ gst_schedule_chain_disable_element (GstScheduleChain *chain, GstElement *element
|
|||
chain->disabled = g_list_prepend (chain->disabled, element);
|
||||
|
||||
// reschedule the chain
|
||||
gst_schedule_cothreaded_chain(chain->sched->parent,chain);
|
||||
gst_schedule_cothreaded_chain(GST_BIN(chain->sched->parent),chain);
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -1081,8 +1079,8 @@ gst_schedule_pad_disconnect (GstSchedule *sched, GstPad *srcpad, GstPad *sinkpad
|
|||
GST_INFO (GST_CAT_SCHEDULING, "have pad disconnected callback on %s:%s",GST_DEBUG_PAD_NAME(srcpad));
|
||||
|
||||
// we need to have the parent elements of each pad
|
||||
element1 = GST_PAD_PARENT(srcpad);
|
||||
element2 = GST_PAD_PARENT(sinkpad);
|
||||
element1 = GST_ELEMENT(GST_PAD_PARENT(srcpad));
|
||||
element2 = GST_ELEMENT(GST_PAD_PARENT(sinkpad));
|
||||
GST_INFO (GST_CAT_SCHEDULING, "disconnecting elements \"%s\" and \"%s\"",
|
||||
GST_ELEMENT_NAME(element1), GST_ELEMENT_NAME(element2));
|
||||
|
||||
|
@ -1187,9 +1185,6 @@ gst_schedule_disable_element (GstSchedule *sched, GstElement *element)
|
|||
void
|
||||
gst_schedule_remove_element (GstSchedule *sched, GstElement *element)
|
||||
{
|
||||
GList *chains;
|
||||
GstScheduleChain *chain;
|
||||
|
||||
g_return_if_fail (element != NULL);
|
||||
g_return_if_fail (GST_IS_ELEMENT(element));
|
||||
|
||||
|
@ -1212,14 +1207,10 @@ gst_schedule_remove_element (GstSchedule *sched, GstElement *element)
|
|||
gboolean
|
||||
gst_schedule_iterate (GstSchedule *sched)
|
||||
{
|
||||
GstBin *bin = sched->parent;
|
||||
GstBin *bin = GST_BIN(sched->parent);
|
||||
GList *chains;
|
||||
GstScheduleChain *chain;
|
||||
GList *entries;
|
||||
GstElement *entry;
|
||||
GList *pads;
|
||||
GstPad *pad;
|
||||
GstBuffer *buf = NULL;
|
||||
gint num_scheduled = 0;
|
||||
gboolean eos = FALSE;
|
||||
|
||||
|
@ -1231,6 +1222,7 @@ gst_schedule_iterate (GstSchedule *sched)
|
|||
|
||||
// step through all the chains
|
||||
chains = sched->chains;
|
||||
if (chains == NULL) return FALSE;
|
||||
while (chains) {
|
||||
chain = (GstScheduleChain *)(chains->data);
|
||||
chains = g_list_next (chains);
|
||||
|
@ -1240,18 +1232,27 @@ gst_schedule_iterate (GstSchedule *sched)
|
|||
// if (chain->need_cothreads) {
|
||||
// all we really have to do is switch to the first child
|
||||
// FIXME this should be lots more intelligent about where to start
|
||||
GST_DEBUG (0,"starting iteration via cothreads\n");
|
||||
GST_DEBUG (GST_CAT_DATAFLOW,"starting iteration via cothreads\n");
|
||||
|
||||
entry = GST_ELEMENT (chain->elements->data);
|
||||
GST_FLAG_SET (entry, GST_ELEMENT_COTHREAD_STOPPING);
|
||||
GST_DEBUG (0,"set COTHREAD_STOPPING flag on \"%s\"(@%p)\n",
|
||||
GST_ELEMENT_NAME (entry),entry);
|
||||
cothread_switch (entry->threadstate);
|
||||
if (chain->elements) {
|
||||
// FIXME FIXME FIXME need to not use a DECOUPLED element as entry
|
||||
entry = GST_ELEMENT (chain->elements->data);
|
||||
if (entry) {
|
||||
GST_FLAG_SET (entry, GST_ELEMENT_COTHREAD_STOPPING);
|
||||
GST_DEBUG (GST_CAT_DATAFLOW,"set COTHREAD_STOPPING flag on \"%s\"(@%p)\n",
|
||||
GST_ELEMENT_NAME (entry),entry);
|
||||
cothread_switch (entry->threadstate);
|
||||
} else {
|
||||
GST_INFO (GST_CAT_DATAFLOW,"no entry into chain!");
|
||||
}
|
||||
} else {
|
||||
GST_INFO (GST_CAT_DATAFLOW,"no entry into chain!");
|
||||
}
|
||||
|
||||
/*
|
||||
} else {
|
||||
GST_DEBUG (0,"starting iteration via chain-functions\n");
|
||||
|
||||
GST_DEBUG (GST_CAT_DATAFLOW,"starting iteration via chain-functions\n");
|
||||
|
||||
entries = chain->entries;
|
||||
|
||||
g_assert (entries != NULL);
|
||||
|
@ -1260,7 +1261,7 @@ gst_schedule_iterate (GstSchedule *sched)
|
|||
entry = GST_ELEMENT (entries->data);
|
||||
entries = g_list_next (entries);
|
||||
|
||||
GST_DEBUG (0,"have entry \"%s\"\n",GST_ELEMENT_NAME (entry));
|
||||
GST_DEBUG (GST_CAT_DATAFLOW,"have entry \"%s\"\n",GST_ELEMENT_NAME (entry));
|
||||
|
||||
if (GST_IS_BIN (entry)) {
|
||||
gst_bin_iterate (GST_BIN (entry));
|
||||
|
@ -1269,7 +1270,7 @@ gst_schedule_iterate (GstSchedule *sched)
|
|||
while (pads) {
|
||||
pad = GST_PAD (pads->data);
|
||||
if (GST_RPAD_DIRECTION(pad) == GST_PAD_SRC) {
|
||||
GST_DEBUG (0,"calling getfunc of %s:%s\n",GST_DEBUG_PAD_NAME(pad));
|
||||
GST_DEBUG (GST_CAT_DATAFLOW,"calling getfunc of %s:%s\n",GST_DEBUG_PAD_NAME(pad));
|
||||
if (GST_REAL_PAD(pad)->getfunc == NULL)
|
||||
fprintf(stderr, "error, no getfunc in \"%s\"\n", GST_ELEMENT_NAME (entry));
|
||||
else
|
||||
|
@ -1290,9 +1291,9 @@ gst_schedule_iterate (GstSchedule *sched)
|
|||
// are there any other elements that are still busy?
|
||||
if (bin->num_eos_providers) {
|
||||
GST_LOCK (bin);
|
||||
GST_DEBUG (0,"waiting for eos providers\n");
|
||||
GST_DEBUG (GST_CATA_DATAFLOW,"waiting for eos providers\n");
|
||||
g_cond_wait (bin->eoscond, GST_OBJECT(bin)->lock);
|
||||
GST_DEBUG (0,"num eos providers %d\n", bin->num_eos_providers);
|
||||
GST_DEBUG (GST_CAT_DATAFLOW,"num eos providers %d\n", bin->num_eos_providers);
|
||||
GST_UNLOCK (bin);
|
||||
}
|
||||
else {
|
||||
|
@ -1302,7 +1303,7 @@ gst_schedule_iterate (GstSchedule *sched)
|
|||
}
|
||||
*/
|
||||
|
||||
GST_DEBUG (0, "leaving (%s)\n", GST_ELEMENT_NAME (bin));
|
||||
GST_DEBUG (GST_CAT_DATAFLOW, "leaving (%s)\n", GST_ELEMENT_NAME (bin));
|
||||
return !eos;
|
||||
}
|
||||
|
||||
|
|
|
@ -66,6 +66,7 @@ struct _GstThread {
|
|||
pthread_t thread_id; /* id of the thread, if any */
|
||||
GMutex *lock; /* thread lock/condititon pair... */
|
||||
GCond *cond; /* used to control the thread */
|
||||
gboolean signaling;
|
||||
|
||||
gint transition; /* the current state transition */
|
||||
};
|
||||
|
|
|
@ -1,3 +1,5 @@
|
|||
<<<<<<< incsched.c
|
||||
<<<<<<< incsched.c
|
||||
#include <stdlib.h>
|
||||
#include <gst/gst.h>
|
||||
|
||||
|
@ -118,8 +120,11 @@ int main(int argc,char *argv[]) {
|
|||
g_print("\n\nIterating:\n");
|
||||
gst_bin_iterate(thread);
|
||||
|
||||
return;
|
||||
//return;
|
||||
g_print("\n\nSetting EOS on fakesrc and iterating again:\n");
|
||||
gtk_object_set(GTK_OBJECT(src),"eos",TRUE,NULL);
|
||||
gst_bin_iterate(thread);
|
||||
|
||||
g_print("\n\nIterating:\n");
|
||||
gst_bin_iterate(thread);
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue