www.gusucode.com > 基于RTP语音压缩解压缩的发送与接收代码 > 基于RTP语音压缩解压缩的发送与接收代码/recv/rtp.cpp

    
#define _RTP_C

#include "rtp.h"

//
// This function checks if there was a RTP error. If so, it displays an error
// message and exists.
//
void rtpCheckError(int rtperr)
{
	if (rtperr < 0)
	{
		printf( "Error: %s\n", RTPGetErrorString(rtperr).c_str() );
//		std::cout << "ERROR: " << RTPGetErrorString(rtperr) << std::endl;
		exit(-1);
	}
}

int rtpInitEnv( void )
{
	int i, portbase;
	RTPUDPv4TransmissionParams transparams;
	RTPSessionParams sessparams;
	int status;

#ifdef WIN32
	WSADATA dat;
	WSAStartup(MAKEWORD(2,2),&dat);
#endif // WIN32

	std::cout << "Enter local portbase:" << std::endl;
	std::cin >> portbase;
	std::cout << std::endl;

	sessparams.SetOwnTimestampUnit(1.0/10.0);		
	
	sessparams.SetAcceptOwnPackets(true);
	transparams.SetPortbase(portbase);

	status = sess.Create(sessparams,&transparams);	
	rtpCheckError(status);

	for( i=0; i<MaxRtpChan; i++ )
	{
		rRtpData[i].rStatus = StsIdle;
		rRtpData[i].fp = NULL;
		rRtpData[i].nBuffLen = 0;
	}

	return 0;
}

int rtpClose( void )
{
	int i;

	sess.BYEDestroy(RTPTime(10,0),0,0);

	for( i=0; i<MaxRtpChan; i++ )
		fclose(rRtpData[i].fp);

#ifdef WIN32
	WSACleanup();
#endif // WIN32

	return 0;
}

int rtpRecvPacket( void )
{
	u_int8_t  *sData;
	int       nPort;
	RTPPacket      *pack;
	RTPIPv4Address *addr;
			
	sess.BeginDataAccess();
		
	// check incoming packets
	if (sess.GotoFirstSourceWithData())
	{
		do
		{
			while ((pack = sess.GetNextPacket()) != NULL)
			{
				// You can examine the data here
				addr = (RTPIPv4Address *)sess.GetCurrentSourceInfo()->GetRTPDataAddress();
				nPort = (addr->GetPort()) ;
				/*
				printf( "Got packet: length=%d, Seq=%d, PayloadType=%d, from: SSRC=%d, %d\n",
						pack->GetPayloadLength(),
						pack->GetExtendedSequenceNumber(),
						pack->GetPayloadType(),
						pack->GetSSRC(), nPort );
				*/


				sData = pack->GetPayloadData();

#ifdef SaveDataToFile
				if( rRtpData[nPort].fp == NULL )
				{
					char sFile[20];
					sprintf( sFile, "rtp%05d.pcm", nPort );
					rRtpData[nPort].fp = fopen( sFile, "w" );
				}
				printf("save data to file\n");

				fwrite( sData, pack->GetPayloadLength(), 1, rRtpData[nPort].fp );
#endif	// SaveDataToFile

				if( rRtpData[nPort].nBuffLen + pack->GetPayloadLength() < MaxRtpBuff )
				{
					memcpy( rRtpData[nPort].sDataBuff + rRtpData[nPort].nBuffLen,
							sData, pack->GetPayloadLength() );
					rRtpData[nPort].nBuffLen += pack->GetPayloadLength();

					if( rRtpData[nPort].rStatus == StsIdle )
						rRtpData[nPort].rStatus = StsNeedWork;
				}

				// we don't longer need the packet, so
				// we'll delete it
				delete pack;
			}
		} while (sess.GotoNextSourceWithData());
	}

	sess.EndDataAccess();

#ifndef RTP_SUPPORT_THREAD
	status = sess.Poll();
	rtpCheckError(status);
#endif // RTP_SUPPORT_THREAD

	return 0;
}