public static void WritePacket(this BinaryWriter writer, VideoPacket packet) { writer.Write(packet.Timestamp); writer.Write(packet.FrameNumber); writer.Write(packet.Height); writer.Write(packet.Width); writer.Write((byte) packet.FrameType); writer.Write(packet.Data.Length); writer.Write(packet.Data); }
public static VideoPacket ReadVideoPacket(this BinaryReader reader) { var packet = new VideoPacket(); packet.Timestamp = reader.ReadInt64(); packet.FrameNumber = reader.ReadUInt32(); packet.Height = reader.ReadUInt16(); packet.Width = reader.ReadUInt16(); packet.FrameType = (FrameType) reader.ReadByte(); int dataSize = reader.ReadInt32(); packet.Data = reader.ReadBytes(dataSize); return packet; }
public bool TryDecode(ref VideoPacket packet, out VideoFrame frame) { if (_videoDecoder == null) _videoDecoder = new VideoDecoder(); frame = new VideoFrame(); FFmpegNative.AVFrame avFrame; if (_videoDecoder.TryDecode(ref packet.Data, out avFrame)) { if (_videoConverter == null) _videoConverter = new VideoConverter(PixelFormatHelper.ToAVPixelFormat(_pixelFormat)); frame.Timestamp = packet.Timestamp; frame.FrameNumber = packet.FrameNumber; frame.PixelFormat = _pixelFormat; frame.Data = _videoConverter.ConvertFrame(avFrame); return true; } return false; }
protected override unsafe void Loop(CancellationToken token) { using (var tcpClient = new TcpClient(_config.Hostname, VideoPort)) using (NetworkStream stream = tcpClient.GetStream()) { var packet = new VideoPacket(); byte[] packetData = null; int offset = 0; int frameStart = 0; int frameEnd = 0; var buffer = new byte[FrameBufferSize]; fixed (byte* pBuffer = &buffer[0]) while (token.IsCancellationRequested == false) { offset += stream.Read(buffer, offset, NetworkStreamReadSize); if (packetData == null) { // lookup for a frame start int maxSearchIndex = offset - sizeof (parrot_video_encapsulation_t); for (int i = 0; i < maxSearchIndex; i++) { if (buffer[i] == 'P' && buffer[i + 1] == 'a' && buffer[i + 2] == 'V' && buffer[i + 3] == 'E') { parrot_video_encapsulation_t pve = *(parrot_video_encapsulation_t*) (pBuffer + i); packetData = new byte[pve.payload_size]; packet = new VideoPacket { Timestamp = DateTime.UtcNow.Ticks, FrameNumber = pve.frame_number, Width = pve.display_width, Height = pve.display_height, FrameType = Convert(pve.frame_type), Data = packetData }; frameStart = i + pve.header_size; frameEnd = frameStart + packet.Data.Length; break; } } if (packetData == null) { // frame is not detected offset -= maxSearchIndex; Array.Copy(buffer, maxSearchIndex, buffer, 0, offset); } } if (packetData != null && offset >= frameEnd) { // frame acquired Array.Copy(buffer, frameStart, packetData, 0, packetData.Length); _videoPacketAcquired(packet); // clean up acquired frame packetData = null; offset -= frameEnd; Array.Copy(buffer, frameEnd, buffer, 0, offset); } Thread.Sleep(10); } } }
public void EnqueuePacket(VideoPacket packet) { _packetQueue.Enqueue(packet); }
private void OnVideoPacketAcquired(VideoPacket packet) { if (VideoPacketAcquired != null) VideoPacketAcquired(packet); }