According to the DeviceSource.cpp template, the doGetNextFrame() should deliver a frame "in a non-blocking fashion i.e., so that we return immediately from this function even if no data is currently available."

However, if no data is available, the afterGetting() function is not invoked within doGetNextFrame (since no new data is delivered) and this causes the doGetNextFrame() function never to be called again by the internal live555 API. Any suggestions on how this problem should be handled?

When the new data does arrive - later - it must be handled as an 'event' - i.e., within the event loop. The event handler can then call "doGetNextFrame()" again.

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.

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. (Others may subclass "TaskScheduler" to implement their own event loop, although that is more difficult.)
Thank you for your suggestions. In my application, data is being pulled from a circular queue containing uncompressed video data which I compress and write to fTo within the doGetNextFrame() function. My application is multi-threaded (with a single thread accessing the live555 API as mentioned in the FAQ). So under those premise, do you see any potential problem with having a doGetNextFrame() function that blocks when there is no data available in the queue?

_______________________________________________
live-devel mailing list
live-devel@lists.live555.com
http://lists.live555.com/mailman/listinfo/live-devel

Reply via email to