private void OnVideoPacketAcquired(VideoPacket packet) { if (_packetRecorderWorker.IsAlive) _packetRecorderWorker.EnqueuePacket(packet); if (_videoPacketDecoderWorker.IsAlive) _videoPacketDecoderWorker.EnqueuePacket(packet); }
public unsafe bool TryDecode(ref VideoPacket packet, out VideoFrame frame) { if (_videoDecoder == null) _videoDecoder = new VideoDecoder(); fixed (byte* pData = &packet.Data[0]) { _avPacket.data = pData; _avPacket.size = packet.Data.Length; if (_videoDecoder.TryDecode(ref _avPacket, ref _avFrame)) { if (_videoConverter == null) _videoConverter = new VideoConverter(_pixelFormat.ToAVPixelFormat()); byte[] data = _videoConverter.ConvertFrame(ref _avFrame); frame = new VideoFrame(); frame.Timestamp = packet.Timestamp; frame.Number = packet.FrameNumber; frame.Width = packet.Width; frame.Height = packet.Height; frame.Depth = data.Length/(packet.Width*packet.Height); frame.PixelFormat = _pixelFormat; frame.Data = data; return true; } } frame = null; return false; }
public void EnqueuePacket(VideoPacket packet) { if (_skipFrames && packet.FrameType == VideoFrameType.I && _packetQueue.Count > SkipFramesThreshold) { Trace.TraceInformation("Skipping {0} frames.", _packetQueue.Count); _packetQueue.Flush(); } _packetQueue.Enqueue(packet); }
public void Write(VideoPacket packet) { Write(packet.Timestamp); Write(packet.FrameNumber); Write(packet.Height); Write(packet.Width); Write((byte) packet.FrameType); Write(packet.Data.Length); Write(packet.Data); }
public VideoPacket ReadVideoPacket() { var packet = new VideoPacket(); packet.Timestamp = ReadInt64(); packet.FrameNumber = ReadUInt32(); packet.Height = ReadUInt16(); packet.Width = ReadUInt16(); packet.FrameType = (VideoFrameType) ReadByte(); int dataSize = ReadInt32(); packet.Data = ReadBytes(dataSize); return packet; }
private void OnVideoPacketAcquired(VideoPacket packet) { if (VideoPacketAcquired != null) VideoPacketAcquired(packet); }
protected override unsafe void Loop(CancellationToken token) { using (var tcpClient = new TcpClient(_configuration.DroneHostname, 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) { int read = stream.Read(buffer, offset, NetworkStreamReadSize); if (read == 0) { Thread.Sleep(1); continue; } offset += read; 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 = VideoFrameTypeConverter.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); } } } }
public void EnqueuePacket(VideoPacket packet) { _packetQueue.Enqueue(packet); }
/// <summary> /// Queue Videopacket for encoding /// </summary> /// <param name="packet">VideoPacket</param> private void OnVideoPacketAcquired(VideoPacket packet) { if (videoPacketDecoderWorker.IsAlive) videoPacketDecoderWorker.EnqueuePacket(packet); }
private void OnVideoPacketAcquired(VideoPacket packet) { _videoPacketDecoderWorker.EnqueuePacket(packet); Thread.Sleep(20); }
private void OnVideoPacketAcquired(VideoPacket packet) { if (packetRecorderWorker != null && packetRecorderWorker.IsAlive) packetRecorderWorker.EnqueuePacket(packet); if (videoPacketDecoderWorker.IsAlive) videoPacketDecoderWorker.EnqueuePacket(packet); }