mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-06-07 07:58:51 +00:00
Closed 22145 - gstelement.c: support hotswapping of loopfunc
Original commit message from CVS: Closed 22145 - gstelement.c: support hotswapping of loopfunc Added a flag GST_ELEMENT_NEW_LOOPFUNC that's set when a new loopfunc is set, which needs to be obeyed by the loopfuncs themselves. The assumption is that only a loopfunc or an element that knows what it's doing will ever change the loopfunc pointer, so they can be responsible for exitting the loopfunc itself appropriately. The loopfunc_wrapper function has been changed to call the loopfunc pointer itself in a loop. If the loopfunc changes, the current loop is supposed to exit, which causes the loopfunc_wrapper to start up the new loopfunc.
This commit is contained in:
parent
c758337d5a
commit
9120d1bd43
2 changed files with 18 additions and 3 deletions
|
@ -758,7 +758,14 @@ int
|
||||||
gst_element_loopfunc_wrapper (int argc, char **argv)
|
gst_element_loopfunc_wrapper (int argc, char **argv)
|
||||||
{
|
{
|
||||||
GstElement *element = GST_ELEMENT (argv);
|
GstElement *element = GST_ELEMENT (argv);
|
||||||
element->loopfunc (element);
|
while (1) {
|
||||||
|
/* if NEW_LOOPFUNC is set, clear it, we're implicitly updating */
|
||||||
|
if (GST_FLAG_IS_SET(element,GST_ELEMENT_NEW_LOOPFUNC))
|
||||||
|
GST_FLAG_UNSET(element,GST_ELEMENT_NEW_LOOPFUNC);
|
||||||
|
|
||||||
|
/* start up the loop function */
|
||||||
|
element->loopfunc (element);
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -770,16 +777,22 @@ gst_element_loopfunc_wrapper (int argc, char **argv)
|
||||||
* This sets the loop function for the element. The function pointed to
|
* This sets the loop function for the element. The function pointed to
|
||||||
* can deviate from the GstElementLoopFunction definition in type of
|
* can deviate from the GstElementLoopFunction definition in type of
|
||||||
* pointer only.
|
* pointer only.
|
||||||
|
*
|
||||||
|
* NOTE: in order for this to take effect, the current loop function *must*
|
||||||
|
* exit. Assuming the loop function itself is the only one who will cause
|
||||||
|
* a new loopfunc to be assigned, this should be no problem.
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
gst_element_set_loop_function(GstElement *element,
|
gst_element_set_loop_function(GstElement *element,
|
||||||
GstElementLoopFunction loop)
|
GstElementLoopFunction loop)
|
||||||
{
|
{
|
||||||
|
/* set the loop function */
|
||||||
element->loopfunc = loop;
|
element->loopfunc = loop;
|
||||||
|
|
||||||
|
/* set the NEW_LOOPFUNC flag so everyone knows to go try again */
|
||||||
|
GST_FLAG_SET(element,GST_ELEMENT_NEW_LOOPFUNC);
|
||||||
|
|
||||||
/* if there's a threadstate, reset the function pointer */
|
/* if there's a threadstate, reset the function pointer */
|
||||||
/* FIXME: need to figure out how to make the loop functions exit when there's
|
|
||||||
* a new one, so we can hotswap them. */
|
|
||||||
if (element->threadstate != NULL)
|
if (element->threadstate != NULL)
|
||||||
// note that this casts a GstElement * to a char **. Ick.
|
// note that this casts a GstElement * to a char **. Ick.
|
||||||
cothread_setfunc (element->threadstate, gst_element_loopfunc_wrapper,
|
cothread_setfunc (element->threadstate, gst_element_loopfunc_wrapper,
|
||||||
|
|
|
@ -79,6 +79,8 @@ typedef enum {
|
||||||
GST_ELEMENT_MULTI_IN = (1 << 4),
|
GST_ELEMENT_MULTI_IN = (1 << 4),
|
||||||
GST_ELEMENT_THREAD_SUGGESTED = (1 << 5),
|
GST_ELEMENT_THREAD_SUGGESTED = (1 << 5),
|
||||||
GST_ELEMENT_NO_SEEK = (1 << 6),
|
GST_ELEMENT_NO_SEEK = (1 << 6),
|
||||||
|
|
||||||
|
GST_ELEMENT_NEW_LOOPFUNC = (1 << 16),
|
||||||
} GstElementFlags;
|
} GstElementFlags;
|
||||||
|
|
||||||
#define GST_ELEMENT_IS_MULTI_IN(obj) (GST_FLAGS(obj) & GST_ELEMENT_MULTI_IN)
|
#define GST_ELEMENT_IS_MULTI_IN(obj) (GST_FLAGS(obj) & GST_ELEMENT_MULTI_IN)
|
||||||
|
|
Loading…
Reference in a new issue