public static EnumResponse FromResponse(WebcamResponse response) { var curr = new EnumResponse(); var packet = response.packet; var offset = 0; curr.index = BitConverter.ToInt32(packet, offset); offset += 4; var nLen = BitConverter.ToInt32(packet, offset); offset += 4; curr.name = Encoding.Unicode.GetString(packet, offset, nLen); offset += nLen; var nDevice = BitConverter.ToInt32(packet, offset); offset += 4; curr.device = Encoding.Unicode.GetString(packet, offset, nDevice); offset += nDevice; return(curr); }
public static HresultResponse FromResponse(WebcamResponse response) { var start = new HresultResponse(); start.type = response.type; start.hr = BitConverter.ToInt32(response.packet, 0); return(start); }
public static FormatResponse FromResponse(WebcamResponse response) { var format = new FormatResponse(); format.Index = BitConverter.ToInt32(response.packet, 0); format.Width = BitConverter.ToInt32(response.packet, 8); format.Height = BitConverter.ToInt32(response.packet, 12); format.Compression = BitConverter.ToUInt32(response.packet, 20); return(format); }
void ProcessFrame(WebcamResponse frame) { if (_format == null) { return; } var timeStamp = new TimeSpan( BitConverter.ToInt64(frame.packet, 0) ); var bmp = new Bitmap(_format.Width, _format.Height, PixelFormat.Format24bppRgb); var data = bmp.LockBits( new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb ); var dataSize = data.Stride * data.Height; if (frame.packetSize - 8 == dataSize) { Marshal.Copy(frame.packet, 8, data.Scan0, dataSize); } bmp.UnlockBits(data); if (_framesOnDemand) { OnDemandCaptureFrame(timeStamp, bmp); } else { OnCaptureFrame(timeStamp, bmp); } }
IEnumerator <ITask> ProcessPipe(NamedPipeClientStream client) { Port <IAsyncResult> continuation = new Port <IAsyncResult>(); for (; ;) { IAsyncResult ar = null; var response = new WebcamResponse(); client.BeginRead(response.header, 0, WebcamResponse.HeaderSize, continuation.Post, null ); yield return(Arbiter.Receive(false, continuation, result => ar = result)); var length = client.EndRead(ar); if (length != 8) { if (0 < Interlocked.CompareExchange(ref _shutdown, 1, 1)) { LogInfo("Pipe has been closed"); client = null; } else { LogError("Bad header length read from pipe"); } yield break; } response.packet = new byte[response.packetSize]; client.BeginRead(response.packet, 0, response.packetSize, continuation.Post, null ); yield return(Arbiter.Receive(false, continuation, result => ar = result)); length = client.EndRead(ar); if (length != response.packetSize) { if (0 < Interlocked.CompareExchange(ref _shutdown, 1, 1)) { LogInfo("Pipe has been closed"); client = null; } else { LogError("Bad packet length read from pipe"); } yield break; } if (response.IsKnownType) { var item = response.KnownType; if (item is EnumResponse) { _pipeDataPort.Post((EnumResponse)item); } else if (item is FormatResponse) { var format = (FormatResponse)item; if (format.Index == -1) { _format = format; if (_state.Selected != null) { if (_state.Selected.Format == null) { _state.Selected.Format = new Format(); } _state.Selected.Format.Width = _format.Width; _state.Selected.Format.Height = _format.Height; } } else { _pipeDataPort.Post(format); } } else if (item is HresultResponse) { _pipeDataPort.Post((HresultResponse)item); } } else if (response.IsFrame) { ProcessFrame(response); } } }