コード例 #1
0
ファイル: BinaryHelper.cs プロジェクト: AerynSun/AR.Drone
 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);
 }
コード例 #2
0
ファイル: BinaryHelper.cs プロジェクト: AerynSun/AR.Drone
 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;
 }
コード例 #3
0
        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;
        }
コード例 #4
0
        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);
                    }
            }
        }
コード例 #5
0
 public void EnqueuePacket(VideoPacket packet)
 {
     _packetQueue.Enqueue(packet);
 }
コード例 #6
0
ファイル: ARDroneClient.cs プロジェクト: AerynSun/AR.Drone
 private void OnVideoPacketAcquired(VideoPacket packet)
 {
     if (VideoPacketAcquired != null)
         VideoPacketAcquired(packet);
 }