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; } } }
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(); }
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); } } }