private void OnDatagramReceived(object sender, UdpDatagramReceivedEventArgs <byte[]> e)
        {
            try
            {
                UdpPacket udpPacket = UdpPacket.FromArray(e.Datagram);

                if (udpPacket.Total == 1)
                {
                    RtpPacket packet = new RtpPacket(udpPacket.Payload, udpPacket.PayloadSize);
                    Bitmap    bitmap = packet.ToBitmap();
                    RaiseNewFrameEvent(bitmap, Epoch.GetDateTimeByYesterdayTotalMilliseconds(packet.Timestamp));
                }
                else
                {
                    // rearrage packets to one packet
                    if (packetCache.ContainsKey(udpPacket.Sequence))
                    {
                        List <UdpPacket> udpPackets = null;
                        if (packetCache.TryGetValue(udpPacket.Sequence, out udpPackets))
                        {
                            udpPackets.Add(udpPacket);

                            if (udpPackets.Count == udpPacket.Total)
                            {
                                packetCache.TryRemove(udpPacket.Sequence, out udpPackets);

                                udpPackets = udpPackets.OrderBy(u => u.Order).ToList();
                                int rtpPacketLength = udpPackets.Sum(u => u.PayloadSize);
                                int maxPacketLength = udpPackets.Select(u => u.PayloadSize).Max();

                                byte[] rtpPacket = new byte[rtpPacketLength];
                                foreach (var item in udpPackets)
                                {
                                    Buffer.BlockCopy(item.Payload, 0, rtpPacket, (item.Order - 1) * maxPacketLength, item.PayloadSize);
                                }

                                RtpPacket packet = new RtpPacket(rtpPacket, rtpPacket.Length);
                                Bitmap    bitmap = packet.ToBitmap();
                                RaiseNewFrameEvent(bitmap, Epoch.GetDateTimeByYesterdayTotalMilliseconds(packet.Timestamp));

                                packetCache.Clear();
                            }
                        }
                    }
                    else
                    {
                        List <UdpPacket> udpPackets = new List <UdpPacket>();
                        udpPackets.Add(udpPacket);
                        packetCache.AddOrUpdate(udpPacket.Sequence, udpPackets, (k, v) => { return(udpPackets); });
                    }
                }
            }
            catch (Exception ex)
            {
                RaiseVideoSourceExceptionEvent(ex.Message);
            }
        }
Example #2
0
        private void OnDatagramReceived(object sender, UdpDatagramReceivedEventArgs<byte[]> e)
        {
            try
              {
            UdpPacket udpPacket = UdpPacket.FromArray(e.Datagram);

            if (udpPacket.Total == 1)
            {
              RtpPacket packet = new RtpPacket(udpPacket.Payload, udpPacket.PayloadSize);
              Bitmap bitmap = packet.ToBitmap();
              RaiseNewFrameEvent(bitmap, Epoch.GetDateTimeByYesterdayTotalMilliseconds(packet.Timestamp));
            }
            else
            {
              // rearrage packets to one packet
              if (packetCache.ContainsKey(udpPacket.Sequence))
              {
            List<UdpPacket> udpPackets = null;
            if (packetCache.TryGetValue(udpPacket.Sequence, out udpPackets))
            {
              udpPackets.Add(udpPacket);

              if (udpPackets.Count == udpPacket.Total)
              {
                packetCache.TryRemove(udpPacket.Sequence, out udpPackets);

                udpPackets = udpPackets.OrderBy(u => u.Order).ToList();
                int rtpPacketLength = udpPackets.Sum(u => u.PayloadSize);
                int maxPacketLength = udpPackets.Select(u => u.PayloadSize).Max();

                byte[] rtpPacket = new byte[rtpPacketLength];
                foreach (var item in udpPackets)
                {
                  Buffer.BlockCopy(item.Payload, 0, rtpPacket, (item.Order - 1) * maxPacketLength, item.PayloadSize);
                }

                RtpPacket packet = new RtpPacket(rtpPacket, rtpPacket.Length);
                Bitmap bitmap = packet.ToBitmap();
                RaiseNewFrameEvent(bitmap, Epoch.GetDateTimeByYesterdayTotalMilliseconds(packet.Timestamp));

                packetCache.Clear();
              }
            }
              }
              else
              {
            List<UdpPacket> udpPackets = new List<UdpPacket>();
            udpPackets.Add(udpPacket);
            packetCache.AddOrUpdate(udpPacket.Sequence, udpPackets, (k, v) => { return udpPackets; });
              }
            }
              }
              catch (Exception ex)
              {
            RaiseVideoSourceExceptionEvent(ex.Message);
              }
        }