First you need to figure out exactly when/how you’re going to decide when to 
add a new stream.  I.e., you need to figure out what event will cause this to 
happen.

If it’s simply a delayed task - within the event loop (i.e., set up using 
“TaskScheduler::scheduleDelayedTask()”) - then you don’t need ‘event triggers’ 
at all.  Instead, simply add the new stream from the ‘delayed task’.  Ditto if 
the event occurs as a result of reading data from a socket.


If, however, you decide to do this from some external thread (i.e., from the 
thread that is *not* running the LIVE555 event loop), then you can call 
“triggerEvent()” from this external thread.  Note that “triggerEvent()” is the 
*only* LIVE555 code that you may call from this external thread; all other 
LIVE555 calls *must* be done from within the ‘LIVE555 event loop’ thread.

If you decide to use ‘event triggers’ (triggered from an external thread), then 
you are sort of on the right track, with a couple of corrections:

> myRTSPClient::createNew(env,url,etc.){
>    …
>    addStreamEventTriggerId = 
> envir().taskScheduler().createEventTrigger(addStreamToLoop);

Note that the function parameter to “createEventTrigger()” has to have the 
proper “TaskFunc” signature:
        typedef void TaskFunc(void* clientData);


> myClient =  myRTSPClient::createNew(env, url, etc.);
> ourScheduler->triggerEvent(myRTSPClient::addStreamEventTriggerId, myClient);

Because you are calling “triggerEvent()” from an external thread (again, if 
you’re in the LIVE555 event loop thread when you decide to create a new stream, 
then you don’t need event triggers at all), you can’t call 
“myRTSPClient::createNew()” from within that thread.  Instead, the 
“myRTSPClient::createNew()” call should occur (along with a subsequent 
“sendDescribeCommand()”) within the event handler function - i.e., within the 
LIVE555 event loop.

So, to get this, you can do something like:

///// Within the LIVE555 thread:

void newStreamHandler(void* clientData) {
        char* url = (char*)clientData;
        myRTSPClient* myClient =  myRTSPClient::createNew(env, url, etc.);
        myClient->addStreamToLoop();
}

TaskScheduler* live555TaskScheduler = &(envir().taskScheduler()); // A global 
variable
EventTriggerId newStreamEventTrigger =  
envir().taskScheduler().createEventTrigger(newStreamHandler); // A global 
variable
        // Note that you need to create only one event trigger

envir().taskScheduler().doEventLoop(); // does not return

///// Then later, within a separate thread:

live555TaskScheduler->triggerEvent(newStreamEventTrigger, 
url_for_the_new_stream);


Ross Finlayson
Live Networks, Inc.
http://www.live555.com/ <http://www.live555.com/>
_______________________________________________
live-devel mailing list
[email protected]
http://lists.live555.com/mailman/listinfo/live-devel

Reply via email to