On 22 apr 2014, at 23:20, Ross Finlayson <finlay...@live555.com> wrote:

>> I was hoping that there was some built in rate limitation that only caused 
>> doGetNextFrame()
>> to get called when a new frame was needed. 
> 
> No, it's the data source that decides when it delivers data.  There are two 
> possible ways to do this:
> 
> If your data source class encodes and delivers a frame immediately when 
> "doGetNextFrame()" is called, then presumably you are also setting 
> "fDurationInMicroseconds" before you complete delivery to the downstream 
> object (using "FramedSource::afterGetting()").  (If you are 
> encoding/delivering a frame immediately, but *not* setting 
> "fDurationInMicroseconds", then "fDurationInMicroseconds" is staying at its 
> default value of 0, and you will be delivering frames as fast as you can 
> generate them, which is bad :-)  In this case, to change the frame rate, just 
> change the value of "fDurationInMicroseconds".

No, I do not set fDurationInMicroseconds, I did not even know about it. Based 
on my timing it does look like
the frames are sent as fast as they can be grabbed, scaled and encoded to JPEG. 
I assume that
fDurationInMicroseconds means the duration of that single frame and if set to 
the equivalent of, say,
1 second then doGetNextFrame() would be called once per second or so?

> If, however, you want your data source class to not encode/deliver a frame 
> immediately, but instead wait for the encoder to make a new frame available, 
> then - as you noted - the encoder will need to be a separate thread of 
> control (so that you don't delay, waiting for the encoded frame to come 
> available).  In this case you would implement your 'data source' class 
> similar to the demo code that's in "DeviceSource.cpp".  Note that in this 
> code's "doGetNextFrame()" implementation, if no frame is immediately 
> available to be delivered, we return immediately (i.e., do not block).  
> Instead, we rely upon a separate thread of control (the encoder thread) later 
> 'signaling' the availability of a new frame - e.g., using 
> "TaskScheduler::triggerEvent()".  (Note that "triggerEvent()" is the *only* 
> LIVE555 function that can be called from a non-LIVE555 event loop thread.)

I have used triggerEvent() successfully when I did try to run my own Boost 
based event loop. It did get too
messy though, but the events worked perfectly.

I think I prefer to handle the rate limitation using the first method and only 
complicate things if necessary.

Thank you for your explanation. I enjoy reading your answers on this mailing 
list, they are teaching
me a lot. 

-- 
Jan Ekholm
jan.ekh...@d-pointer.com




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

Reply via email to