예제 #1
0
        public override bool WriteData(WriteBuffer writer)
        {
            if (_init)
            {
                _dataCapacity = Bitmap.PixelWidth * Bitmap.PixelHeight * 2;

                writer.Write((int)OperationCode.DepthFrameTransfer);
                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, DepthToColorTransform);
                _init = false;

                return(false);
            }

            writer.Write((int)OperationCode.DepthFrameTransfer);
            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);
        }
예제 #2
0
        protected void StartSendingData()
        {
            _sendBuffer = new WriteBuffer(ushort.MaxValue);

            var sendArgs = new SocketAsyncEventArgs();

            sendArgs.SetBuffer(_sendBuffer.GetBuffer(), _sendBuffer.WriteOffset, ushort.MaxValue);
            sendArgs.Completed += SocketOperationCompleted;

            Task.Run(() => SendData(sendArgs));
        }
예제 #3
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);
        }
예제 #4
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);
                    }
                }
            }
        }
예제 #5
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);
        }