public static ColorFrameData CreateData(this ColorFrameReference frameRef)
        {
            using (var frame = frameRef.AcquireFrame())
            {
                if (frame == null)
                {
                    return null;
                }

                var frameDesc = frame.FrameDescription;

                // TODO: Avoid allocate byte array every time
                var data = new byte[frameDesc.Width * frameDesc.Height * sizeof(int)];
                // TODO: Check if Bgra can be written to bitmap directly
                frame.CopyConvertedFrameDataToArray(data, ColorImageFormat.Bgra);

                return new ColorFrameData()
                {
                    RelativeTime = frame.RelativeTime,
                    Width = frameDesc.Width,
                    Height = frameDesc.Height,
                    Data = data,
                };
            }
        }
        public static DepthFrameData CreateData(this DepthFrameReference frameRef)
        {
            using (var frame = frameRef.AcquireFrame())
            {
                if (frame == null)
                {
                    return null;
                }

                var frameDesc = frame.FrameDescription;

                // TODO: Avoid allocate ushort array every time
                var data = new ushort[frameDesc.Width * frameDesc.Height];
                frame.CopyFrameDataToArray(data);

                return new DepthFrameData()
                {
                    RelativeTime = frame.RelativeTime,
                    Width = frameDesc.Width,
                    Height = frameDesc.Height,
                    Data = data,
                    MinReliableDistance = frame.DepthMinReliableDistance,
                    MaxReliableDistance = frame.DepthMaxReliableDistance,
                };
            }
        }
        public static BodyFrameData CreateData(this BodyFrameReference frameRef, TimeSpan relativeTime)
        {
            using (var frame = frameRef.AcquireFrame())
            {
                if (frame == null)
                {
                    return null;
                }

                // TODO: Avoid allocate body array every time
                var coordinateMapper = frame.BodyFrameSource.KinectSensor.CoordinateMapper;
                var bodies = new Body[frame.BodyCount];
                frame.GetAndRefreshBodyData(bodies);

                return new BodyFrameData()
                {
                    RelativeTime = relativeTime,
                    Bodies = Array.ConvertAll(bodies, b => CreateBody(b, coordinateMapper)),
                };
            }
        }