Example #1
0
        protected void ExtractAndNotifyPacket(byte[] bData)
        {
            /// See if we have enough data to examine the rest of our header, if not, wait until the
            /// next time around
            ///
            ByteBuffer.AppendData(bData);

            while (true)
            {
                if (nCurrentLength == 0)
                {
                    if (ByteBuffer.Size < 2)
                    {
                        return;
                    }

                    byte [] bLength = ByteBuffer.GetNSamples(2);
                    /// Little Endian for RTP, right?
                    nCurrentLength = (ushort)(bLength[0] | (bLength[1] << 8));
                }

                if (ByteBuffer.Size < nCurrentLength)
                {
                    return;
                }
                else
                {
                    byte []   bRTPPacket = ByteBuffer.GetNSamples(nCurrentLength);
                    RTPPacket packet     = RTPPacket.BuildPacket(bRTPPacket);
                    ProcessRTPPacket(packet);
                    nCurrentLength = 0;
                }
            }
        }
Example #2
0
        void OnRecvSocket(IAsyncResult result)
        {
            byte [] bBuffer = (byte [] )result.AsyncState;
            try
            {
                EndPoint ep    = (EndPoint)MulticastAddress;
                int      nRecv = MultiCastRecvSocket.EndReceiveFrom(result, ref ep);

                // Notify the man of the incoming data

                if (OnNewFrame != null)
                {
                    byte[] bPacketCopy = new byte[nRecv];
                    Array.Copy(bBuffer, 0, bPacketCopy, 0, nRecv);

                    RTPPacket packet = RTPPacket.BuildPacket(bPacketCopy);
                    VideoFrameFragmentor.NewFragmentReceived(packet);
                }
            }
            catch (Exception)
            {
            }
            finally
            {
                BufferPool.Checkin(bBuffer);
            }

            DoReceive();
        }
Example #3
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);
                }
            }
        }