Example #1
0
        /// <summary>
        /// RTP(RFC3550)协议数据包
        /// </summary>
        /// <param name="playloadType">数据报文有效载荷类型</param>
        /// <param name="sequenceNumber">数据报文序列号值</param>
        /// <param name="timestamp">数据报文采样时刻</param>
        /// <param name="frame">图片</param>
        public RtpPacket(RtpPayloadType playloadType, int sequenceNumber, long timestamp, Image frame)
        {
            // fill changing header fields
            SequenceNumber = sequenceNumber;
            Timestamp      = timestamp;
            PayloadType    = playloadType;

            // build the header bistream
            _header = new byte[HeaderSize];

            // fill the header array of byte with RTP header fields
            _header[0] = (byte)((Version << 6) | (Padding << 5) | (Extension << 4) | CC);
            _header[1] = (byte)((Marker << 7) | (int)PayloadType);
            _header[2] = (byte)(SequenceNumber >> 8);
            _header[3] = (byte)(SequenceNumber);
            for (int i = 0; i < 4; i++)
            {
                _header[7 - i] = (byte)(Timestamp >> (8 * i));
            }
            for (int i = 0; i < 4; i++)
            {
                _header[11 - i] = (byte)(SSRC >> (8 * i));
            }

            // fill the payload bitstream
            using (MemoryStream ms = new MemoryStream())
            {
                frame.Save(ms, ImageFormat.Jpeg);
                _payload     = ms.ToArray();
                _payloadSize = _payload.Length;
            }
        }
        internal void MessageReceived(object sender, MessageReceivedEventArgs <RtpPacket> message)
        {
            var            packet = message.Message;
            RtpPayloadType ptype  = packet.Header.PayloadType;

            Debug.WriteLine($"Received {ptype}");
            switch (ptype)
            {
            case RtpPayloadType.Control:
                OnControlHandshake(packet);
                break;

            case RtpPayloadType.ChannelControl:
                var controlMsg = packet.Payload as Nano.Packets.ChannelControl;
                _channelManager.HandleChannelControl(controlMsg, packet.Header.ChannelId);
                break;

            case RtpPayloadType.Streamer:
                var streamer = packet.Payload as Nano.Packets.Streamer;
                _channelManager.HandleStreamer(streamer, packet.Header.ChannelId);
                break;

            case RtpPayloadType.UDPHandshake:
                throw new NotSupportedException($"UDP HandshakeType from server received");

            default:
                throw new NotSupportedException($"Unsupported payload type: {ptype}");
            }
        }
Example #3
0
        /// <summary>
        /// RTP(RFC3550)协议数据包
        /// </summary>
        /// <param name="playloadType">数据报文有效载荷类型</param>
        /// <param name="sequenceNumber">数据报文序列号值</param>
        /// <param name="timestamp">数据报文采样时刻</param>
        /// <param name="data">数据</param>
        /// <param name="dataSize">数据长度</param>
        public RtpPacket(RtpPayloadType playloadType, int sequenceNumber, long timestamp, byte[] data, int dataSize)
        {
            // fill changing header fields
            SequenceNumber = sequenceNumber;
            Timestamp      = timestamp;
            PayloadType    = playloadType;

            // build the header bistream
            _header = new byte[HeaderSize];

            // fill the header array of byte with RTP header fields
            _header[0] = (byte)((Version << 6) | (Padding << 5) | (Extension << 4) | CC);
            _header[1] = (byte)((Marker << 7) | (int)PayloadType);
            _header[2] = (byte)(SequenceNumber >> 8);
            _header[3] = (byte)(SequenceNumber);
            for (int i = 0; i < 4; i++)
            {
                _header[7 - i] = (byte)(Timestamp >> (8 * i));
            }
            for (int i = 0; i < 4; i++)
            {
                _header[11 - i] = (byte)(SSRC >> (8 * i));
            }

            // fill the payload bitstream
            _payload     = new byte[dataSize];
            _payloadSize = dataSize;

            // fill payload array of byte from data (given in parameter of the constructor)
            Array.Copy(data, 0, _payload, 0, dataSize);
        }
        private static ISerializableLE CreateFromPayloadType(RtpPayloadType payloadType)
        {
            var type = RtpPayloadTypeAttribute.GetTypeForMessageType(payloadType);

            if (type == null)
            {
                return(null);
            }

            return((ISerializableLE)Activator.CreateInstance(type));
        }
Example #5
0
        public void ExtractData(ref NetworkHost sourceHost, NetworkHost destinationHost, IEnumerable <PacketParser.Packets.AbstractPacket> packetList)
        {
            Packets.UdpPacket udpPacket = null;


            foreach (Packets.AbstractPacket p in packetList)
            {
                if (p.GetType() == typeof(Packets.UdpPacket))
                {
                    udpPacket = (Packets.UdpPacket)p;
                }
                else if (udpPacket != null && p.GetType() == typeof(Packets.RtpPacket))
                {
                    Packets.RtpPacket rtpPacket = (Packets.RtpPacket)p;
                    if (Enum.IsDefined(typeof(RtpPayloadType), rtpPacket.PayloadType))
                    {
                        RtpPayloadType payloadType = (RtpPayloadType)rtpPacket.PayloadType;
                        FiveTuple      fiveTuple   = new FiveTuple(sourceHost, udpPacket.SourcePort, destinationHost, udpPacket.DestinationPort, FiveTuple.TransportProtocol.UDP);

                        AudioStream audioStream;
                        Tuple <System.Net.IPAddress, ushort, System.Net.IPAddress, ushort, RtpPayloadType> key = new Tuple <System.Net.IPAddress, ushort, System.Net.IPAddress, ushort, RtpPayloadType>(sourceHost.IPAddress, udpPacket.SourcePort, destinationHost.IPAddress, udpPacket.DestinationPort, payloadType);
                        if (this.audioStreams.ContainsKey(key))
                        {
                            audioStream = this.audioStreams[key];
                        }
                        else
                        {
                            //FileTransfer.FileStreamAssembler assembler = new FileTransfer.FileStreamAssembler(MainPacketHandler.FileStreamAssemblerList, fiveTuple, true, FileTransfer.FileStreamTypes.RTP, "AudioStream-" + fiveTuple.GetHashCode() + ".wav", "/", "RTP " + fiveTuple.ToString(), rtpPacket.ParentFrame.FrameNumber, rtpPacket.ParentFrame.Timestamp);
                            //-1 is set instead of null if Content-Length is not defined
                            //assembler.FileContentLength = -1;
                            //assembler.FileSegmentRemainingBytes = -1;
                            //this.MainPacketHandler.FileStreamAssemblerList.Add(assembler);

                            //audioStream = new AudioStream(sourceHost, destinationHost, wavAudioFormat.Value, MainPacketHandler.FileStreamAssemblerList, fiveTuple, rtpPacket.ParentFrame.FrameNumber);
                            audioStream = new AudioStream(sourceHost, destinationHost, payloadType, MainPacketHandler.FileStreamAssemblerList, fiveTuple, rtpPacket.ParentFrame.FrameNumber);
                            this.audioStreams.Add(key, audioStream);
                            base.MainPacketHandler.OnAudioDetected(audioStream);
                        }

                        audioStream.AddSamples(rtpPacket.ParentFrame.Data.Skip(rtpPacket.PacketStartIndex + Packets.RtpPacket.HEADER_LENGTH).ToArray(), rtpPacket.SampleTick, rtpPacket.ParentFrame.Timestamp, rtpPacket.SyncSourceID);
                    }
                }
            }
        }
        public void ExtractData(ref NetworkHost sourceHost, NetworkHost destinationHost, IEnumerable <PacketParser.Packets.AbstractPacket> packetList)
        {
            Packets.UdpPacket udpPacket = null;


            foreach (Packets.AbstractPacket p in packetList)
            {
                if (p.GetType() == typeof(Packets.UdpPacket))
                {
                    udpPacket = (Packets.UdpPacket)p;
                }
                else if (udpPacket != null && p is Packets.RtpPacket rtpPacket)
                {
                    //Packets.RtpPacket rtpPacket =(Packets.RtpPacket)p;
                    if (Enum.IsDefined(typeof(RtpPayloadType), rtpPacket.PayloadType))
                    {
                        RtpPayloadType payloadType = (RtpPayloadType)rtpPacket.PayloadType;
                        FiveTuple      fiveTuple   = new FiveTuple(sourceHost, udpPacket.SourcePort, destinationHost, udpPacket.DestinationPort, FiveTuple.TransportProtocol.UDP);

                        AudioStream audioStream;
                        Tuple <System.Net.IPAddress, ushort, System.Net.IPAddress, ushort, RtpPayloadType> key = new Tuple <System.Net.IPAddress, ushort, System.Net.IPAddress, ushort, RtpPayloadType>(sourceHost.IPAddress, udpPacket.SourcePort, destinationHost.IPAddress, udpPacket.DestinationPort, payloadType);
                        if (this.audioStreams.ContainsKey(key))
                        {
                            audioStream = this.audioStreams[key];
                        }
                        else
                        {
                            audioStream = new AudioStream(sourceHost, destinationHost, payloadType, MainPacketHandler.FileStreamAssemblerList, fiveTuple, rtpPacket.ParentFrame.FrameNumber);
                            this.audioStreams.Add(key, audioStream);
                            base.MainPacketHandler.OnAudioDetected(audioStream);
                        }

                        audioStream.AddSamples(rtpPacket.ParentFrame.Data.Skip(rtpPacket.PacketStartIndex + Packets.RtpPacket.HEADER_LENGTH).ToArray(), rtpPacket.SampleTick, rtpPacket.ParentFrame.Timestamp, rtpPacket.SyncSourceID);
                    }
                }
            }
        }
Example #7
0
 /// <summary>
 /// 将图片转换成消息
 /// </summary>
 /// <param name="playloadType">数据报文有效载荷类型</param>
 /// <param name="sequenceNumber">数据报文序列号值</param>
 /// <param name="timestamp">数据报文采样时刻</param>
 /// <param name="frame">图片帧</param>
 /// <returns>
 /// RTP消息
 /// </returns>
 public static RtpPacket FromImage(RtpPayloadType playloadType, int sequenceNumber, long timestamp, Image frame)
 {
   return new RtpPacket(playloadType, sequenceNumber, timestamp, frame);
 }
Example #8
0
    /// <summary>
    /// RTP(RFC3550)协议数据包
    /// </summary>
    /// <param name="playloadType">数据报文有效载荷类型</param>
    /// <param name="sequenceNumber">数据报文序列号值</param>
    /// <param name="timestamp">数据报文采样时刻</param>
    /// <param name="frame">图片</param>
    public RtpPacket(RtpPayloadType playloadType, int sequenceNumber, long timestamp, Image frame)
    {
      // fill changing header fields
      SequenceNumber = sequenceNumber;
      Timestamp = timestamp;
      PayloadType = playloadType;

      // build the header bistream
      _header = new byte[HeaderSize];

      // fill the header array of byte with RTP header fields
      _header[0] = (byte)((Version << 6) | (Padding << 5) | (Extension << 4) | CC);
      _header[1] = (byte)((Marker << 7) | (int)PayloadType);
      _header[2] = (byte)(SequenceNumber >> 8);
      _header[3] = (byte)(SequenceNumber);
      for (int i = 0; i < 4; i++)
      {
        _header[7 - i] = (byte)(Timestamp >> (8 * i));
      }
      for (int i = 0; i < 4; i++)
      {
        _header[11 - i] = (byte)(SSRC >> (8 * i));
      }

      // fill the payload bitstream
      using (MemoryStream ms = new MemoryStream())
      {
        frame.Save(ms, ImageFormat.Jpeg);
        _payload = ms.ToArray();
        _payloadSize = _payload.Length;
      }
    }
Example #9
0
    /// <summary>
    /// RTP(RFC3550)协议数据包
    /// </summary>
    /// <param name="playloadType">数据报文有效载荷类型</param>
    /// <param name="sequenceNumber">数据报文序列号值</param>
    /// <param name="timestamp">数据报文采样时刻</param>
    /// <param name="data">数据</param>
    /// <param name="dataSize">数据长度</param>
    public RtpPacket(RtpPayloadType playloadType, int sequenceNumber, long timestamp, byte[] data, int dataSize)
    {
      // fill changing header fields
      SequenceNumber = sequenceNumber;
      Timestamp = timestamp;
      PayloadType = playloadType;

      // build the header bistream
      _header = new byte[HeaderSize];

      // fill the header array of byte with RTP header fields
      _header[0] = (byte)((Version << 6) | (Padding << 5) | (Extension << 4) | CC);
      _header[1] = (byte)((Marker << 7) | (int)PayloadType);
      _header[2] = (byte)(SequenceNumber >> 8);
      _header[3] = (byte)(SequenceNumber);
      for (int i = 0; i < 4; i++)
      {
        _header[7 - i] = (byte)(Timestamp >> (8 * i));
      }
      for (int i = 0; i < 4; i++)
      {
        _header[11 - i] = (byte)(SSRC >> (8 * i));
      }

      // fill the payload bitstream
      _payload = new byte[dataSize];
      _payloadSize = dataSize;

      // fill payload array of byte from data (given in parameter of the constructor)
      Array.Copy(data, 0, _payload, 0, dataSize);
    }
        public void ExtractData(ref NetworkHost sourceHost, NetworkHost destinationHost, IEnumerable <PacketParser.Packets.AbstractPacket> packetList)
        {
            Packets.UdpPacket udpPacket = null;


            foreach (Packets.AbstractPacket p in packetList)
            {
                if (p.GetType() == typeof(Packets.UdpPacket))
                {
                    udpPacket = (Packets.UdpPacket)p;
                }
                else if (udpPacket != null && p.GetType() == typeof(Packets.RtpPacket))
                {
                    Packets.RtpPacket rtpPacket = (Packets.RtpPacket)p;
                    if (Enum.IsDefined(typeof(RtpPayloadType), rtpPacket.PayloadType))
                    {
                        RtpPayloadType payloadType = (RtpPayloadType)rtpPacket.PayloadType;
                        FiveTuple      fiveTuple   = new FiveTuple(sourceHost, udpPacket.SourcePort, destinationHost, udpPacket.DestinationPort, FiveTuple.TransportProtocol.UDP);
                        //if(rtpPacket.PayloadType == (byte)RtpPayloadTypes.G711_PCM_A) {

                        /*
                         * FileTransfer.AuFileAssembler auAssembler = null;
                         * if (this.MainPacketHandler.FileStreamAssemblerList.ContainsAssembler(fiveTuple, true, true)) {
                         *  var assembler = this.MainPacketHandler.FileStreamAssemblerList.GetAssembler(fiveTuple, true);
                         *  if (assembler is FileTransfer.AuFileAssembler) {
                         *      auAssembler = (FileTransfer.AuFileAssembler)assembler;
                         *      if (auAssembler.AuEncoding == FileTransfer.AuFileAssembler.Encoding.G711_ALAW && payloadType == RtpPayloadType.G711_PCM_A ||
                         *          auAssembler.AuEncoding == FileTransfer.AuFileAssembler.Encoding.G711_ULAW && payloadType == RtpPayloadType.G711_PCM_U ||
                         *          auAssembler.AuEncoding == FileTransfer.AuFileAssembler.Encoding.G722 && payloadType == RtpPayloadType.G722) {
                         *          //do nothing we have already assigned the auAssembler variable
                         *      }
                         *      else
                         *          auAssembler = null;
                         *  }
                         * }
                         * else if (payloadType == RtpPayloadType.G711_PCM_A) {
                         *  auAssembler = new FileTransfer.AuFileAssembler("RTP-stream-" + fiveTuple.GetHashCode().ToString() + "_" + payloadType.ToString() + ".au", this.MainPacketHandler.FileStreamAssemblerList, fiveTuple, FileTransfer.FileStreamTypes.RTP, rtpPacket.ParentFrame.FrameNumber, rtpPacket.ParentFrame.Timestamp, FileTransfer.AuFileAssembler.Encoding.G711_ALAW);
                         *  auAssembler.TryActivate();
                         * }
                         * else if (payloadType == RtpPayloadType.G711_PCM_U) {
                         *  auAssembler = new FileTransfer.AuFileAssembler("RTP-stream-" + fiveTuple.GetHashCode().ToString() + "_" + payloadType.ToString() + ".au", this.MainPacketHandler.FileStreamAssemblerList, fiveTuple, FileTransfer.FileStreamTypes.RTP, rtpPacket.ParentFrame.FrameNumber, rtpPacket.ParentFrame.Timestamp, FileTransfer.AuFileAssembler.Encoding.G711_ULAW);
                         *  auAssembler.TryActivate();
                         * }
                         * else if (payloadType == RtpPayloadType.G722) {
                         *  auAssembler = new FileTransfer.AuFileAssembler("RTP-stream-" + fiveTuple.GetHashCode().ToString() + "_" + payloadType.ToString() + ".au", this.MainPacketHandler.FileStreamAssemblerList, fiveTuple, FileTransfer.FileStreamTypes.RTP, rtpPacket.ParentFrame.FrameNumber, rtpPacket.ParentFrame.Timestamp, FileTransfer.AuFileAssembler.Encoding.G722);
                         *  auAssembler.TryActivate();
                         * }
                         *
                         * if(auAssembler != null) {
                         *  auAssembler.AddData(rtpPacket.ParentFrame.Data.Skip(rtpPacket.PacketStartIndex + Packets.RtpPacket.HEADER_LENGTH).ToArray(), rtpPacket.SequenceNumber);
                         * }
                         */

                        /*
                         * AudioStream.AudioFormat? wavAudioFormat = null;
                         * if (payloadType == RtpPayloadType.G711_PCM_A)
                         *  wavAudioFormat = AudioStream.AudioFormat.WAVE_FORMAT_ALAW;
                         * else if (payloadType == RtpPayloadType.G711_PCM_U)
                         *  wavAudioFormat = AudioStream.AudioFormat.WAVE_FORMAT_MULAW;
                         * else if (payloadType == RtpPayloadType.G729)
                         *  wavAudioFormat = AudioStream.AudioFormat.WAVE_FORMAT_G729;
                         *
                         * if (wavAudioFormat != null) {
                         */
                        AudioStream audioStream;
                        Tuple <System.Net.IPAddress, ushort, System.Net.IPAddress, ushort, RtpPayloadType> key = new Tuple <System.Net.IPAddress, ushort, System.Net.IPAddress, ushort, RtpPayloadType>(sourceHost.IPAddress, udpPacket.SourcePort, destinationHost.IPAddress, udpPacket.DestinationPort, payloadType);
                        if (this.audioStreams.ContainsKey(key))
                        {
                            audioStream = this.audioStreams[key];
                        }
                        else
                        {
                            //FileTransfer.FileStreamAssembler assembler = new FileTransfer.FileStreamAssembler(MainPacketHandler.FileStreamAssemblerList, fiveTuple, true, FileTransfer.FileStreamTypes.RTP, "AudioStream-" + fiveTuple.GetHashCode() + ".wav", "/", "RTP " + fiveTuple.ToString(), rtpPacket.ParentFrame.FrameNumber, rtpPacket.ParentFrame.Timestamp);
                            //-1 is set instead of null if Content-Length is not defined
                            //assembler.FileContentLength = -1;
                            //assembler.FileSegmentRemainingBytes = -1;
                            //this.MainPacketHandler.FileStreamAssemblerList.Add(assembler);

                            //audioStream = new AudioStream(sourceHost, destinationHost, wavAudioFormat.Value, MainPacketHandler.FileStreamAssemblerList, fiveTuple, rtpPacket.ParentFrame.FrameNumber);
                            audioStream = new AudioStream(sourceHost, destinationHost, payloadType, MainPacketHandler.FileStreamAssemblerList, fiveTuple, rtpPacket.ParentFrame.FrameNumber);
                            this.audioStreams.Add(key, audioStream);
                            base.MainPacketHandler.OnAudioDetected(audioStream);
                        }

                        audioStream.AddSamples(rtpPacket.ParentFrame.Data.Skip(rtpPacket.PacketStartIndex + Packets.RtpPacket.HEADER_LENGTH).ToArray(), rtpPacket.SampleTick, rtpPacket.ParentFrame.Timestamp, rtpPacket.SyncSourceID);
                        //}
                    }
                }
            }
        }
 public RtpPayloadTypeAttribute(RtpPayloadType messageType)
 {
     MessageType = messageType;
 }
 public static Type GetTypeForMessageType(RtpPayloadType messageType)
 {
     return(_typeMapping.GetTypeForKey(messageType));
 }
 public RtpPacket(RtpPayloadType payloadType)
 {
     Header             = new RtpHeader();
     Header.PayloadType = payloadType;
 }
Example #14
0
 public RtpPacket(RtpPayloadType payloadType, ISerializableLE payload)
 {
     Header             = new RtpHeader();
     Header.PayloadType = payloadType;
     Payload            = payload;
 }
Example #15
0
 /// <summary>
 /// 将图片转换成消息
 /// </summary>
 /// <param name="playloadType">数据报文有效载荷类型</param>
 /// <param name="sequenceNumber">数据报文序列号值</param>
 /// <param name="timestamp">数据报文采样时刻</param>
 /// <param name="frame">图片帧</param>
 /// <returns>
 /// RTP消息
 /// </returns>
 public static RtpPacket FromImage(RtpPayloadType playloadType, int sequenceNumber, long timestamp, Image frame)
 {
     return(new RtpPacket(playloadType, sequenceNumber, timestamp, frame));
 }