/// <summary>
/// Queue |frame| to be uploaded. </summary>
public virtual void queueFrame(Endpoint stream, Org.Webrtc.VideoRenderer.I420Frame frame)
{
// Paying for the copy of the YUV data here allows CSC and painting time
// to get spent on the render thread instead of the UI thread.
abortUnless(FramePool.validateDimensions(frame), "Frame too large!");
VideoRenderer.I420Frame frameCopy = framePool.takeFrame(frame).CopyFrom(frame);
bool needToScheduleRender;
lock (framesToRender)
{
// A new render needs to be scheduled (via updateFrames()) iff there isn't
// already a render scheduled, which is true iff framesToRender is empty.
needToScheduleRender = framesToRender.Count == 0;
VideoRenderer.I420Frame frameToDrop;
framesToRender.TryGetValue(stream, out frameToDrop);
framesToRender[stream] = frameCopy;
if (frameToDrop != null)
{
framePool.returnFrame(frameToDrop);
}
}
if (needToScheduleRender)
{
QueueEvent(updateFrames);
}
}