The call to doGetNextFrame (doGetNextFrame(void *data, int len) in my code) only happens when data is present. Than in (doGetNextFrame(void *data, int len) in my code) function I call deliverFrame(data, len); function passing the data.

But the function deliverFrame(data, len); the if statement if (! isCurrentlyAwaitingData()) return; (part of deviceSource.cpp) returns most of the time, so only 1 frame in ~5 make into fTo.

In deliverFrame function, which of the following is correct?

  FramedSource::afterGetting(this);  <-only 1 and 5 frames
or
nextTask() = envir().taskScheduler().scheduleDelayedTask(0, (TaskFunc*)afterGetting, this); <-this gives the error "getNextFrame(): attempting to read more than once at the same time!"

Thanks
Austin

On Dec 26, 2008, at 7:59 PM, Ross Finlayson wrote:

Hello All,
I have created my own deviceSource.cpp for my live input from QTKit, I call doGetNextFrame with my data and than pass it to deliverFrame. I have based my streaming from MPEG4ToVideoStreamer, which blocks at env->taskScheduler().doEventLoop(); // does not return and does not allow my live input code to continue. It there a way to allow my other code to continue.

"deliverFrame()" should be called *only when* data is available to be delivered to the downstream object. (Your "doGetNextFrame()" implementation should return immediately - without calling "deliverFrame()" - if no data is currently available to be delivered.)

This means that the availabllty of new data needs to be recognized/ handled as an 'event' by the event loop.

Unfortunately there's no one standard way of handling the arrival of new data as an 'event', because it depends on your particular environment (in particular, the nature of your input device). If your input device can be treated as an open file, then it's easy, because you can use the event loop's existing "select()" mechanism, by calling "TaskScheduler:: turnOnBackgroundReadHandling()" (see the comments in "DeviceSource.cpp"). You should do it this way, if you can.

If, however, your input device cannot be treated as an open file, then you have to do something else to handle the arrival of new data as an 'event'. Some people use the optional "watchVariable" parameter (to "TaskScheduler::doEventLoop()") for this purpose. (See, for example, <http://lists.live555.com/pipermail/live-devel/2005-September/003276.html >. Note, however, that if you use the 'watchVariable' feature, you should also note this point: <http://lists.live555.com/pipermail/live-devel/2006-March/004192.html >)

An alternative way to recognize the arrival of new data as an event would be to subclass "TaskScheduler" to implement your own event loop - but that is more difficult.
--

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

_______________________________________________
live-devel mailing list
[email protected]
http://lists.live555.com/mailman/listinfo/live-devel

Reply via email to