Appspotdemo.Mono.Droid.FramePool.takeFrame C# (CSharp) Method

takeFrame() public method

public takeFrame ( VideoRenderer source ) : VideoRenderer.I420Frame
source VideoRenderer
return VideoRenderer.I420Frame
        public virtual VideoRenderer.I420Frame takeFrame(VideoRenderer.I420Frame source)
        {
            long desc = summarizeFrameDimensions(source);
            VideoRenderer.I420Frame dst = null;
            lock (availableFrames)
            {
                LinkedList<VideoRenderer.I420Frame> frames;
                availableFrames.TryGetValue(desc, out frames);
                if (frames == null)
                {
                    frames = new LinkedList<VideoRenderer.I420Frame>();
                    availableFrames[desc] = frames;
                }
                if (frames.Count > 0)
                {
                    dst = frames.First.Value;
                    frames.RemoveFirst();
                }
                else
                {
                    dst = new VideoRenderer.I420Frame(source.Width, source.Height, source.YuvStrides.ToArray(), null);
                }
            }
            return dst;
        }

Usage Example

コード例 #1
0
        /// <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);
            }
        }