/// <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); } }