int RTPSession::Create(int localportbase,unsigned long localip) { int status; if (initialized) return ERR_RTP_SESSIONALREADYINITIALIZED; if ((status = rtpconn.Create(localportbase,localip)) < 0) return status; if ((status = contribsources.CreateLocalCNAME()) < 0) { rtpconn.Destroy(); return status; } CreateNewSSRC(); localinf.CreateSessionParameters(); rtcpmodule.Initialize(); initialized = true; return 0; }
int RTPPacketBuilder::Init(size_t max) { if (init) return ERR_RTP_PACKBUILD_ALREADYINIT; if (max <= 0) return ERR_RTP_PACKBUILD_INVALIDMAXPACKETSIZE; maxpacksize = max; buffer = new uint8_t [max]; if (buffer == 0) return ERR_RTP_OUTOFMEM; packetlength = 0; CreateNewSSRC(); deftsset = false; defptset = false; defmarkset = false; numcsrcs = 0; init = true; return 0; }
int RTPPacketBuilder::Init(size_t max) { if (init) return ERR_RTP_PACKBUILD_ALREADYINIT; if (max <= 0) return ERR_RTP_PACKBUILD_INVALIDMAXPACKETSIZE; maxpacksize = max; buffer = RTPNew(GetMemoryManager(),RTPMEM_TYPE_BUFFER_RTPPACKETBUILDERBUFFER) uint8_t [max]; if (buffer == 0) return ERR_RTP_OUTOFMEM; packetlength = 0; CreateNewSSRC(); deftsset = false; defptset = false; defmarkset = false; numcsrcs = 0; init = true; return 0; }
int RTPSession::PollData() { int status,len,port,prevnumsources; unsigned char *data; unsigned long ip,curtime; bool collis; if (!initialized) return ERR_RTP_SESSIONNOTCREATED; /* Save the number of sources for comparison */ prevnumsources = sources.GetNumberOfParticipants(); /* Process data on RTP port */ if ((status = rtpconn.PollRTP()) < 0) return status; while (rtpconn.RTPDataAvailable()) { if ((status = rtpconn.ReceiveRTPData(&data,&len,&ip,&port)) < 0) return status; // the packet processor deletes 'data' in case of an error if ((status = packetprocessor.ProcessRTPBlock(data,len,ip,port,&collis,acceptownpackets,localinf.tsunit)) < 0) return status; if (collis) // collision with local ssrc { if ((status = rtcpmodule.SendBYE()) < 0) return status; CreateNewSSRC(); localinf.octetcount = 0; localinf.packetcount = 0; } } /* Process data on RTCP port */ if ((status = rtpconn.PollRTCP()) < 0) return status; while (rtpconn.RTCPDataAvailable()) { if ((status = rtpconn.ReceiveRTCPData(&data,&len,&ip,&port)) < 0) return status; // the packet processor deletes 'data' in case of an error if ((status = packetprocessor.ProcessRTCPBlock(data,len,ip,port,&collis,localinf.tsunit)) < 0) return status; if (collis) // collision with local ssrc { if ((status = rtcpmodule.SendBYE()) < 0) return status; CreateNewSSRC(); localinf.octetcount = 0; localinf.packetcount = 0; } } /* Check if any sources have joined or left */ if (sources.GetNumberOfParticipants() != prevnumsources) rtcpmodule.CalcNextRTCPTime(); /* Check if we have to send RTCP packets */ curtime = time(NULL); if (rtcpmodule.RTCPCheck(curtime)) { status = rtcpmodule.RTCPRoutine(curtime); if (status < 0) return status; } return 0; }