示例#1
0
        public override byte[] DecodeToBytes(RTPPacket packet)
        {
            short[] sOutput = new short[packet.PayloadData.Length * 2];
            Codec.Decode(DecodeState, sOutput, packet.PayloadData, packet.PayloadData.Length);

            return Utils.ConvertShortArrayToByteArray(sOutput);
        }
示例#2
0
        public void NewFragmentReceived(RTPPacket packet)
        {
            byte[] bPayload = packet.PayloadData;
            if (packet.Marker == true) /// This should be a header fragment, extract the width, height, and total frame size
            {
                AssembleLastPackets();
                LastPacketFrames.Add(bPayload);
                m_nSequence = packet.SequenceNumber;
                CurrentFrameTimeStamp = packet.TimeStamp;
                if (bPayload.Length < 60000)
                    AssembleLastPackets();

            }
            else
            {

                if ( (packet.TimeStamp == CurrentFrameTimeStamp) && (packet.SequenceNumber == (m_nSequence+1)) )
                {
                    m_nSequence = packet.SequenceNumber;

                    LastPacketFrames.Add(bPayload);

                    if (bPayload.Length < 60000)
                        AssembleLastPackets();

                }
            }
        }
示例#3
0
 public override RTPPacket[] Encode(short[] sData)
 {
     byte [] bCompressed = new byte[this.ReceivePTime*8];
     Codec.Encode(EncodeState, bCompressed, sData, sData.Length);
     RTPPacket packet = new RTPPacket();
     packet.PayloadData = bCompressed;
     return new RTPPacket[] { packet };
 }
示例#4
0
        public override short[] DecodeToShorts(RTPPacket packet)
        {
            int nDecoded = 0;
            try
            {
                nDecoded = Decoder.Decode(packet.PayloadData, 0, packet.PayloadData.Length, bDecodeBuffer, 0, false);
            }
            catch (ArgumentNullException)
            { }
            catch (ArgumentOutOfRangeException)
            {
            }

            short[] sRet = new short[nDecoded];
            Array.Copy(bDecodeBuffer, 0, sRet, 0, nDecoded);
            return sRet;
        }
示例#5
0
 public override short[] DecodeToShorts(RTPPacket packet)
 {
     return MuLawDecode(packet.PayloadData);
 }
示例#6
0
 public override byte[] DecodeToBytes(RTPPacket packet)
 {
     return MuLawDecodeBytes(packet.PayloadData);
 }
示例#7
0
        public static RTPPacket BuildPacket(byte[] bRecvData, int nOffset, int nLength)
        {
            RTPPacket packet = new RTPPacket();
            if (nLength < 12)
                return null;

            byte[] bRTPData = new byte[nLength];
            Array.Copy(bRecvData, nOffset, bRTPData, 0, nLength);

            packet.VersionPaddingHeaderCRSCCountByte = bRTPData[0];
            packet.MarkerPayloadByte = bRTPData[1];
            packet.SequenceNumber = (ushort)((bRTPData[2] << 8) | bRTPData[3]);
            packet.TimeStamp = (uint)((bRTPData[4] << 24) | (bRTPData[5] << 16) | (bRTPData[6] << 8) | (bRTPData[7]));
            packet.SSRC = (uint)((bRTPData[8] << 24) | (bRTPData[9] << 16) | (bRTPData[10] << 8) | (bRTPData[11]));

            int nByteAt = 12;
            for (int i=0; i<packet.CRSCCount; i++)
            {
                if (bRTPData.Length < (nByteAt + 4))
                    return null;

                packet.CSRCList.Add((uint)((bRTPData[nByteAt++] << 24) | (bRTPData[nByteAt++] << 16) | (bRTPData[nByteAt++] << 8) | (bRTPData[nByteAt++])));
            }

            int nExtensionLen = 0;
            /// Read in extension data, if there
            if (packet.Extension == true)
            {
                /// ignore this for now, just copy to the data
                //nExtensionLen = pRTPHeader.
            }

            int nDataStartAt = 12 + 4*packet.CRSCCount + nExtensionLen;
            int nBytesLeft = bRTPData.Length - nDataStartAt;

            /// Finally, let's find out what is next and add that as data
            if (nBytesLeft > 0)
            {
                packet.PayloadData = new byte[nBytesLeft];
                Array.Copy(bRTPData, nDataStartAt, packet.PayloadData, 0, nBytesLeft);
            }

            return packet;
        }
示例#8
0
 public override short[] DecodeToShorts(RTPPacket packet)
 {
     short[] sOutput = new short[packet.PayloadData.Length*2];
     Codec.Decode(DecodeState, sOutput, packet.PayloadData, packet.PayloadData.Length);
     return sOutput;
 }
示例#9
0
 public override byte[] DecodeToBytes(RTPPacket packet)
 {
     return(MuLawDecodeBytes(packet.PayloadData));
 }
示例#10
0
文件: Codec.cs 项目: Hitchhikrr/Voip
 public virtual short[] DecodeToShorts(RTPPacket packet)
 {
     return null;
 }
示例#11
0
 public virtual short[] DecodeToShorts(RTPPacket packet)
 {
     return(null);
 }
示例#12
0
        protected void SendAudio(byte[] bUncompressedAudio)
        {
            short[] sUncompressedAudio = AudioClasses.Utils.ConvertByteArrayToShortArrayLittleEndian(bUncompressedAudio);

            RTPPacket[] packets = new RTPPacket[] { };
            lock (SendLock)
            {
                packets = AudioCodec.Encode(sUncompressedAudio);
            }

            lock (SocketLock)
            {
                foreach (RTPPacket packet in packets)
                {
                    FormatNextPacket(packet);
                    byte[] bDataPacket = packet.GetBytes();
                    if (RTPUDPClient != null)
                        RTPUDPClient.SendUDP(bDataPacket, bDataPacket.Length, DestinationEndpoint);
                }
            }
        }
示例#13
0
        public override RTPPacket[] Encode(short[] sData)
        {
            if (sData.Length != Encoder.FrameSize)
                throw new Exception("Must provide input data equal to 1 frame size"); // for now, later it can be multiples

            int nRet = 0;

            //try
            //{
                watch.Start();
                nRet = Encoder.Encode(sData, 0, sData.Length, bEncodeBuffer, 0, bEncodeBuffer.Length);
                watch.Stop();
                m_nPacketsEncoded++;
            //}
            //catch (ArgumentNullException)
            //{ }
            //catch (ArgumentOutOfRangeException)
            //{
            //}

            byte[] bRet = new byte[nRet];
            Array.Copy(bEncodeBuffer, 0, bRet, 0, nRet);

            RTPPacket packet = new RTPPacket();
            packet.PayloadData = bRet;

            return new RTPPacket[] {packet};
        }
示例#14
0
 public override byte[] DecodeToBytes(RTPPacket packet)
 {
     short[] sBytes = DecodeToShorts(packet);
     return AudioClasses.Utils.ConvertShortArrayToByteArray(sBytes);
 }
示例#15
0
        void  RTPUDPClient_OnReceiveMessage(byte[] bData, int nLength, IPEndPoint epfrom, IPEndPoint epthis, DateTime dtReceived)
        {
            /// if we are an performing ICE, see if this is an ICE packet instead of an RTP one
            if (nLength >= 8)
            {
                //0x2112A442
                if ((bData[4] == 0x21) && (bData[5] == 0x12) && (bData[6] == 0xA4) && (bData[7] == 0x42))
                {
                    /// STUN message
                    STUNMessage smsg  = new STUN2Message();
                    byte[]      bStun = new byte[nLength];
                    Array.Copy(bData, 0, bStun, 0, nLength);
                    try
                    {
                        smsg.Bytes = bStun;
                    }
                    catch (Exception ex)
                    {
                        smsg       = new STUNMessage();
                        smsg.Bytes = bStun;
                    }

                    STUNRequestResponse foundreq = null;
                    lock (StunLock)
                    {
                        foreach (STUNRequestResponse queuedreq in StunRequestResponses)
                        {
                            if (queuedreq.IsThisYourResponseSetIfItIs(smsg) == true)
                            {
                                foundreq = queuedreq;
                                break;
                            }
                        }

                        if (foundreq != null)
                        {
                            StunRequestResponses.Remove(foundreq);
                            return;
                        }
                    }

                    if (OnUnhandleSTUNMessage != null)
                    {
                        OnUnhandleSTUNMessage(smsg, epfrom);
                    }
                    return;
                }
            }

            RTPPacket packet = RTPPacket.BuildPacket(bData, 0, nLength);

            if (packet != null) /// Seems we get some TURN channel data messages from google talk
            {
                if (ReceiveSSRC == 0)
                {
                    ReceiveSSRC = packet.SSRC;
                }
                if ((packet.PayloadType == this.Payload) && (packet.SSRC == this.ReceiveSSRC))
                {
                    IncomingRTPPacketBuffer.AddPacket(packet);
                }
            }
        }
示例#16
0
        public override RTPPacket[] Encode(short[] sData)
        {
            RTPPacket packet = new RTPPacket();
            packet.PayloadData = MuLawEncode(sData);
            packet.PayloadType = this.PayloadType;

            return new RTPPacket[] {packet};
        }
示例#17
0
        public RTPPacket FormatNextPacket(byte[] VideoPayload)
        {
            RTPPacket packet = new RTPPacket();
            packet.PayloadData = VideoPayload;
            packet.PayloadType = Payload;
            if (m_nSequence == 0)
                packet.Marker = true;
            else
                packet.Marker = false;
            packet.SequenceNumber = m_nSequence++;
            packet.TimeStamp = (uint) ( m_nSequence * 1000 / FrameRate);

            return packet;
        }
示例#18
0
 public virtual byte[] DecodeToBytes(RTPPacket packet)
 {
     return(null);
 }
示例#19
0
文件: Codec.cs 项目: Hitchhikrr/Voip
 public virtual byte[] DecodeToBytes(RTPPacket packet)
 {
     return null;
 }
示例#20
0
 public override short[] DecodeToShorts(RTPPacket packet)
 {
     return(MuLawDecode(packet.PayloadData));
 }