예제 #1
0
        public override bool WriteData(WriteBuffer writer)
        {
            if (_init)
            {
                writer.Write((int)OperationCode.UserFrameTransfer);
                writer.Write((int)OperationStatus.PushInit);
                writer.Write(Data.Length);

                _init = false;

                return(false);
            }

            writer.Write((int)OperationCode.UserFrameTransfer);
            writer.Write((int)OperationStatus.Push);

            // just for check?
            writer.Write(_offset);

            // todo configurable chunks size support
            // account for 4 bytes taken by chunkSize info!!
            var dataChunkSize = Math.Min(Data.Length - _offset, writer.RemainingPacketWriteCapacity - 4);

            writer.Write(dataChunkSize);

            int writeOffset;

            writer.ReserveForWrite(dataChunkSize, out writeOffset);
            unsafe
            {
                var data   = Data;
                var buffer = writer.GetBuffer();
                fixed(byte *bufferPtr = buffer)
                fixed(byte *dataSourcePtr = data)
                {
                    DataManipulation.Copy(dataSourcePtr + _offset, bufferPtr + writeOffset, (uint)dataChunkSize);
                }
            }
            _offset += dataChunkSize;
            return(_offset == Data.Length);
        }
예제 #2
0
        /// <summary>
        /// 64B + 4B flag
        /// </summary>
        protected void WriteTransformation(WriteBuffer writer, Matrix4x4?transformation)
        {
            writer.Write(transformation.HasValue ? 1 : 0);

            // 4 * 4 * sizeof(float)
            int writeOffset;

            // todo: check for fail of reservation?
            writer.ReserveForWrite(64, out writeOffset);
            if (transformation.HasValue)
            {
                var transMatrix = transformation.Value;
                var buffer      = writer.GetBuffer();
                unsafe
                {
                    fixed(byte *bufferPtr = buffer)
                    {
                        byte *transformationPtr = (byte *)&transMatrix;

                        DataManipulation.Copy(transformationPtr, bufferPtr + writeOffset, 64);
                    }
                }
            }
        }
예제 #3
0
        public override bool WriteData(WriteBuffer writer)
        {
            // frame packet generic header
            writer.Write((int)OperationCode.BodyFrameTransfer);
            writer.Write((int)OperationStatus.PushInit);

            writer.Write(BodyFrame.SystemRelativeTime.Value.Ticks);
            writer.Write(BodyFrame.BinaryData.Length);

            int writeOffset;

            writer.ReserveForWrite(BodyFrame.BinaryData.Length, out writeOffset);
            unsafe
            {
                var buffer = writer.GetBuffer();
                fixed(byte *bufferPtr = buffer)
                fixed(byte *sourceDataPtr = BodyFrame.BinaryData)
                {
                    DataManipulation.Copy(sourceDataPtr, bufferPtr + writeOffset, (uint)BodyFrame.BinaryData.Length);
                }
            }

            return(true);
        }
예제 #4
0
        public override bool WriteData(WriteBuffer writer)
        {
            if (_data == null)
            {
                using (var buffer = Bitmap.LockBuffer(BitmapBufferAccessMode.Read))
                    using (var bufferRef = buffer.CreateReference())
                    {
                        unsafe
                        {
                            byte *bufferPtr;
                            uint  bufferCapacity;
                            ((IMemoryBufferByteAccess)bufferRef).GetBuffer(out bufferPtr, out bufferCapacity);

                            _data = new byte[bufferCapacity];

                            fixed(byte *dataPtr = _data)
                            {
                                DataManipulation.Copy(bufferPtr, dataPtr, bufferCapacity);
                            }
                        }
                    }

                writer.Write((int)OperationCode.BodyIndexFrameTransfer);
                writer.Write((int)OperationStatus.PushInit);
                writer.Write((int)Bitmap.BitmapPixelFormat);
                writer.Write(Bitmap.PixelWidth);
                writer.Write(Bitmap.PixelHeight);
                writer.Write(_data.Length);

                // camera intrinsics
                WriteIntrinsics(writer, CameraIntrinsics);

                // todo write transformation
                WriteTransformation(writer, DepthToColorTransform);

                return(false);
            }

            writer.Write((int)OperationCode.BodyIndexFrameTransfer);
            writer.Write((int)OperationStatus.Push);

            // just for check?
            writer.Write(_offset);

            // todo configurable chunks size support
            var dataChunkSize = Math.Min(_data.Length - _offset, writer.RemainingPacketWriteCapacity - 4);

            writer.Write(dataChunkSize);

            // account for 4 bytes taken by chunkSize info!!

            int writeOffset;

            writer.ReserveForWrite(dataChunkSize, out writeOffset);
            unsafe
            {
                var buffer = writer.GetBuffer();
                fixed(byte *bufferPtr = buffer)
                fixed(byte *dataSourcePtr = _data)
                {
                    DataManipulation.Copy(dataSourcePtr + _offset, bufferPtr + writeOffset, (uint)dataChunkSize);
                }
            }

            _offset += dataChunkSize;
            return(_offset == _data.Length);
        }
예제 #5
0
 public abstract bool WriteData(WriteBuffer writer);
예제 #6
0
 public void WriteCommand(WriteBuffer writer)
 {
     writer.Write((int)OperationCode.CloseReader);
     writer.Write((int)Status);
     writer.Write((int)Type);
 }
예제 #7
0
        public override bool WriteData(WriteBuffer writer)
        {
            if (_init)
            {
                // downsize?
                // Bitmap = Bitmap.Downsize();

                // todo: handle different pixelformats
                _dataCapacity = Bitmap.PixelHeight * Bitmap.PixelWidth * 2;

                writer.Write((int)OperationCode.ColorFrameTransfer);
                writer.Write((int)OperationStatus.PushInit);
                writer.Write((int)Bitmap.BitmapPixelFormat);
                writer.Write(Bitmap.PixelWidth);
                writer.Write(Bitmap.PixelHeight);
                writer.Write(_dataCapacity);

                // camera intrinsics
                WriteIntrinsics(writer, CameraIntrinsics);

                // write transformation
                WriteTransformation(writer, ColorToDepthTransform);
                _init = false;

                return(false);
            }

            writer.Write((int)OperationCode.ColorFrameTransfer);
            writer.Write((int)OperationStatus.Push);

            // just for check?
            writer.Write(_offset);

            // todo configurable chunks size support
            // account for 4 bytes taken by chunkSize info!!
            var dataChunkSize = Math.Min(_dataCapacity - _offset, writer.RemainingPacketWriteCapacity - 4);

            writer.Write(dataChunkSize);

            int writeOffset;

            writer.ReserveForWrite(dataChunkSize, out writeOffset);
            unsafe
            {
                using (var bitBuffer = Bitmap.LockBuffer(BitmapBufferAccessMode.Read))
                    using (var bufferRef = bitBuffer.CreateReference())
                    {
                        byte *dataSourcePtr;
                        uint  bufferCapacity;
                        ((IMemoryBufferByteAccess)bufferRef).GetBuffer(out dataSourcePtr, out bufferCapacity);

                        var buffer = writer.GetBuffer();
                        fixed(byte *bufferPtr = buffer)
                        {
                            DataManipulation.Copy(dataSourcePtr + _offset, bufferPtr + writeOffset, (uint)dataChunkSize);
                        }
                    }
            }
            _offset += dataChunkSize;
            return(_offset == _dataCapacity);
        }