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;
}
Esempio n. 3
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;
}