GST_DEBUG_ENTER ("(%d,'%s')", argc, name);
do {
- GST_DEBUG (GST_CAT_DATAFLOW, "calling loopfunc %s for element %s\n",
+ GST_DEBUG (GST_CAT_DATAFLOW, "calling loopfunc %s for element %s",
GST_DEBUG_FUNCPTR_NAME (element->loopfunc), name);
(element->loopfunc) (element);
- GST_DEBUG (GST_CAT_DATAFLOW, "element %s ended loop function\n", name);
+ GST_DEBUG (GST_CAT_DATAFLOW, "element %s ended loop function", name);
} while (!GST_ELEMENT_IS_COTHREAD_STOPPING (element));
GST_FLAG_UNSET (element, GST_ELEMENT_COTHREAD_STOPPING);
GList *pads;
GstFastScheduler *sched;
- GST_DEBUG (GST_CAT_SCHEDULING, "element is using COTHREADS\n");
+ GST_DEBUG (GST_CAT_SCHEDULING, "element is using COTHREADS");
sched = (GstFastScheduler *) GST_ELEMENT_SCHED (bin);
g_assert (GST_IS_FAST_SCHEDULER (sched));
gst_element_error (element, "could not create cothread for \"%s\"",
GST_ELEMENT_NAME (element), NULL);
return FALSE;
- GST_DEBUG (GST_CAT_SCHEDULING, "created cothread %p for '%s' with wrapper function &%s\n",
+ GST_DEBUG (GST_CAT_SCHEDULING, "created cothread %p for '%s' with wrapper function &%s",
GST_ELEMENT_THREADSTATE (element),
GST_ELEMENT_NAME (element), GST_DEBUG_FUNCPTR_NAME (wrapper_function));
}
} else {
do_cothread_setfunc (GST_ELEMENT_THREADSTATE (element), sched->context, wrapper_function, 0, (char **) element);
- GST_DEBUG (GST_CAT_SCHEDULING, "set wrapper function for '%s' to &%s\n",
+ GST_DEBUG (GST_CAT_SCHEDULING, "set wrapper function for '%s' to &%s",
GST_ELEMENT_NAME (element), GST_DEBUG_FUNCPTR_NAME (wrapper_function));
}
pads = g_list_next (pads);
if (GST_PAD_DIRECTION (pad) == GST_PAD_SRC) {
- GST_DEBUG (GST_CAT_SCHEDULING, "setting gethandler to getfunc_proxy for %s:%s\n", GST_DEBUG_PAD_NAME (pad));
+ GST_DEBUG (GST_CAT_SCHEDULING, "setting gethandler to getfunc_proxy for %s:%s", GST_DEBUG_PAD_NAME (pad));
GST_RPAD_GETHANDLER (pad) = gst_fast_scheduler_getfunc_proxy;
}
else {
- GST_DEBUG (GST_CAT_SCHEDULING, "setting chainhandler to chainfunc_proxy for %s:%s\n", GST_DEBUG_PAD_NAME (pad));
+ GST_DEBUG (GST_CAT_SCHEDULING, "setting chainhandler to chainfunc_proxy for %s:%s", GST_DEBUG_PAD_NAME (pad));
GST_RPAD_CHAINHANDLER (pad) = gst_fast_scheduler_chainfunc_proxy;
}
}
return TRUE;
}
+static void
+gst_fast_scheduler_event_proxy (GstPad *pad, GstBuffer *buf)
+{
+ if (GST_IS_EVENT (buf))
+ GST_RPAD_EVENTFUNC (pad) (pad, GST_EVENT (buf));
+ else
+ GST_RPAD_CHAINFUNC (pad) (pad, buf);
+}
+
+
static gboolean
gst_fast_scheduler_chained_element (GstBin *bin, GstElement *element) {
GList *pads;
GstPad *pad;
- GST_DEBUG (GST_CAT_SCHEDULING,"chain entered\n");
+ GST_DEBUG (GST_CAT_SCHEDULING,"chain entered");
/* walk through all the pads */
pads = gst_element_get_pad_list (element);
continue;
if (GST_RPAD_DIRECTION (pad) == GST_PAD_SINK) {
- GST_DEBUG (GST_CAT_SCHEDULING,"copying chain function into chain handler for %s:%s\n",GST_DEBUG_PAD_NAME (pad));
- GST_RPAD_CHAINHANDLER (pad) = GST_RPAD_CHAINFUNC (pad);
+ GST_DEBUG (GST_CAT_SCHEDULING,"copying chain function into chain handler for %s:%s",GST_DEBUG_PAD_NAME (pad));
+ if (!GST_FLAG_IS_SET (element, GST_ELEMENT_EVENT_AWARE))
+ GST_RPAD_CHAINHANDLER (pad) = gst_fast_scheduler_event_proxy;
+ else
+ GST_RPAD_CHAINHANDLER (pad) = GST_RPAD_CHAINFUNC (pad);
} else {
- GST_DEBUG (GST_CAT_SCHEDULING,"copying get function into get handler for %s:%s\n",GST_DEBUG_PAD_NAME (pad));
+ GST_DEBUG (GST_CAT_SCHEDULING,"copying get function into get handler for %s:%s",GST_DEBUG_PAD_NAME (pad));
if (!GST_RPAD_GETFUNC (pad))
GST_RPAD_GETHANDLER (pad) = gst_fast_scheduler_getfunc_proxy;
else
/* add the element to the chain */
gst_fast_scheduler_chain_add_element (chain, element);
- GST_DEBUG (GST_CAT_SCHEDULING, "recursing on element \"%s\"\n", GST_ELEMENT_NAME (element));
+ GST_DEBUG (GST_CAT_SCHEDULING, "recursing on element \"%s\"", GST_ELEMENT_NAME (element));
/* now go through all the pads and see which peers can be added */
pads = element->pads;
while (pads) {
pad = GST_PAD (pads->data);
pads = g_list_next (pads);
- GST_DEBUG (GST_CAT_SCHEDULING, "have pad %s:%s, checking for valid peer\n",
+ GST_DEBUG (GST_CAT_SCHEDULING, "have pad %s:%s, checking for valid peer",
GST_DEBUG_PAD_NAME (pad));
/* if the peer exists and could be in the same chain */
if (GST_PAD_PEER (pad)) {
- GST_DEBUG (GST_CAT_SCHEDULING, "has peer %s:%s\n", GST_DEBUG_PAD_NAME (GST_PAD_PEER (pad)));
+ GST_DEBUG (GST_CAT_SCHEDULING, "has peer %s:%s", GST_DEBUG_PAD_NAME (GST_PAD_PEER (pad)));
peerelement = GST_PAD_PARENT (GST_PAD_PEER (pad));
if (GST_ELEMENT_SCHED (GST_PAD_PARENT (pad)) == GST_ELEMENT_SCHED (peerelement)) {
- GST_DEBUG (GST_CAT_SCHEDULING, "peer \"%s\" is valid for same chain\n",
+ GST_DEBUG (GST_CAT_SCHEDULING, "peer \"%s\" is valid for same chain",
GST_ELEMENT_NAME (peerelement));
/* if it's not already in a chain, add it to this one */
if (gst_fast_scheduler_find_chain (chain->sched, peerelement) == NULL) {
/* first create thread context */
if (fast->context == NULL) {
- GST_DEBUG (GST_CAT_SCHEDULING, "initializing cothread context\n");
+ GST_DEBUG (GST_CAT_SCHEDULING, "initializing cothread context");
fast->context = do_cothread_context_init ();
}
}
GST_INFO (GST_CAT_SCHEDULING, "have pad connected callback on %s:%s to %s:%s",
GST_DEBUG_PAD_NAME (srcpad), GST_DEBUG_PAD_NAME (sinkpad));
- GST_DEBUG (GST_CAT_SCHEDULING, "srcpad sched is %p, sinkpad sched is %p\n",
+ GST_DEBUG (GST_CAT_SCHEDULING, "srcpad sched is %p, sinkpad sched is %p",
GST_ELEMENT_SCHED (srcelement), GST_ELEMENT_SCHED (sinkelement));
if (GST_ELEMENT_SCHED (srcelement) == GST_ELEMENT_SCHED (sinkelement)) {
chains = bsched->chains;
if (chains == NULL) {
- GST_DEBUG (GST_CAT_DATAFLOW, "no chains!\n");
+ GST_DEBUG (GST_CAT_DATAFLOW, "no chains!");
state = GST_SCHEDULER_STATE_STOPPED;
/* we just pick the first cothreaded element */
GstElement *entry = GST_ELEMENT (chain->cothreaded_elements->data);
- GST_DEBUG (GST_CAT_DATAFLOW, "starting iteration via cothreads\n");
+ GST_DEBUG (GST_CAT_DATAFLOW, "starting iteration via cothreads");
GST_FLAG_SET (entry, GST_ELEMENT_COTHREAD_STOPPING);
- GST_DEBUG (GST_CAT_DATAFLOW, "set COTHREAD_STOPPING flag on \"%s\"(@%p)\n",
+ GST_DEBUG (GST_CAT_DATAFLOW, "set COTHREAD_STOPPING flag on \"%s\"(@%p)",
GST_ELEMENT_NAME (entry), entry);
if (GST_ELEMENT_THREADSTATE (entry)) {
do_cothread_switch (GST_ELEMENT_THREADSTATE (entry));
}
else {
- GST_DEBUG (GST_CAT_DATAFLOW, "cothread switch not possible, element has no threadstate\n");
+ GST_DEBUG (GST_CAT_DATAFLOW, "cothread switch not possible, element has no threadstate");
- GST_DEBUG (GST_CAT_DATAFLOW, "leaving (%s)\n", GST_ELEMENT_NAME (bin));
+ GST_DEBUG (GST_CAT_DATAFLOW, "leaving (%s)", GST_ELEMENT_NAME (bin));
state = GST_SCHEDULER_STATE_ERROR;
goto exit;
}
- GST_DEBUG (GST_CAT_SCHEDULING, "loopfunc of element %s ended\n", GST_ELEMENT_NAME (entry));
+ GST_DEBUG (GST_CAT_SCHEDULING, "loopfunc of element %s ended", GST_ELEMENT_NAME (entry));
scheduled++;
}
if (entry) {
GList *pads = gst_element_get_pad_list (entry);
- GST_DEBUG (GST_CAT_DATAFLOW, "starting chained iteration\n");
+ GST_DEBUG (GST_CAT_DATAFLOW, "starting chained iteration");
while (pads) {
GstPad *pad = GST_PAD_CAST (pads->data);
}
}
- GST_DEBUG (GST_CAT_DATAFLOW, "leaving (%s)\n", GST_ELEMENT_NAME (bin));
+ GST_DEBUG (GST_CAT_DATAFLOW, "leaving (%s)", GST_ELEMENT_NAME (bin));
if (scheduled == 0) {
GST_INFO (GST_CAT_DATAFLOW, "nothing was scheduled, return STOPPED");
}
exit:
- GST_DEBUG (GST_CAT_DATAFLOW, "leaving (%s) %d\n", GST_ELEMENT_NAME (bin), state);
+ GST_DEBUG (GST_CAT_DATAFLOW, "leaving (%s) %d", GST_ELEMENT_NAME (bin), state);
return state;
}
GstFastScheduler *bsched = GST_FAST_SCHEDULER (sched);
if (sched == NULL) {
- g_print ("scheduler doesn't exist for this element\n");
+ g_print ("scheduler doesn't exist for this element");
return;
}