Exemplo n.º 1
0
 private void OnVideoPacketAcquired(VideoPacket packet)
 {
     if (_packetRecorderWorker.IsAlive)
         _packetRecorderWorker.EnqueuePacket(packet);
     if (_videoPacketDecoderWorker.IsAlive)
         _videoPacketDecoderWorker.EnqueuePacket(packet);
 }
Exemplo n.º 2
0
        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;
        }
Exemplo n.º 3
0
 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);
 }
Exemplo n.º 4
0
 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);
 }
Exemplo n.º 5
0
 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;
 }
Exemplo n.º 6
0
 private void OnVideoPacketAcquired(VideoPacket packet)
 {
     if (VideoPacketAcquired != null)
         VideoPacketAcquired(packet);
 }
Exemplo n.º 7
0
        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);
                        }
                    }
            }
        }
Exemplo n.º 8
0
 public void EnqueuePacket(VideoPacket packet)
 {
     _packetQueue.Enqueue(packet);
 }
Exemplo n.º 9
0
 /// <summary>
 /// Queue Videopacket for encoding
 /// </summary>
 /// <param name="packet">VideoPacket</param>
 private void OnVideoPacketAcquired(VideoPacket packet)
 {
     if (videoPacketDecoderWorker.IsAlive)
         videoPacketDecoderWorker.EnqueuePacket(packet);
 }
Exemplo n.º 10
0
 private void OnVideoPacketAcquired(VideoPacket packet)
 {
     _videoPacketDecoderWorker.EnqueuePacket(packet);
     Thread.Sleep(20);
 }
Exemplo n.º 11
0
 private void OnVideoPacketAcquired(VideoPacket packet)
 {
     if (packetRecorderWorker != null && packetRecorderWorker.IsAlive)
         packetRecorderWorker.EnqueuePacket(packet);
     if (videoPacketDecoderWorker.IsAlive)
         videoPacketDecoderWorker.EnqueuePacket(packet);
 }