示例#1
0
int CRTPRecv::InitRTP(int Port)
{
	RTPUDPv4TransmissionParams TransParams;
	RTPSessionParams SessionParams;

	//设置本地通讯端口.
	TransParams.SetPortbase(Port);
	//设置时间戳,每秒钟发送的包数量.
	SessionParams.SetOwnTimestampUnit(1.0/90000.0);
	SessionParams.SetAcceptOwnPackets(true);	//接收自己发送的数据包

	//创建RTP对象.
	int Result = Create(SessionParams, &TransParams);
	if (Result < 0)
	{
		LOG_ERROR("RTP: "<<RTPGetErrorString(Result));
		return -1;
	}
	

	//设置默认负载类型.
	this->SetMaximumPacketSize(65535);
	//this->SetDefaultMark(true); 
	//this->SetDefaultTimestampIncrement(TIMESTAMP);
	//this->SetDefaultPayloadType(H264);

	return 0;
}
示例#2
0
void ServerSession::CheckError( int status )
{
	if (status < 0)
	{
		MessageBox(g_hMainWnd, RTPGetErrorString(status).c_str(), "RTP会话创建失败", MB_ICONERROR);
		exit(-1);
	}
}
示例#3
0
/***********************************************************************************************************
**函数:Rtp_Lock
**功能:
**输入参数:
**返回值:
***********************************************************************************************************/
static int  checkerror(int rtperr)
{
    if(rtperr < 0)
    {
        std::cout << "ERROR: " << RTPGetErrorString(rtperr) << std::endl;
        return -1;
    }
    return 0;
}
示例#4
0
bool RTPHandler::error(int e)
{
   if(e < 0)
   {   
	  cerr << "ERROR: " << RTPGetErrorString(e) << endl;
     alive = false;
     return true;
   }
   return false;
}
bool whu_RtpRPicSAg::SendAngle(double *angle)
{
	char m_SendBuf[48];
	RTPTime delay(0.020); //??
	memcpy(m_SendBuf,angle,48);
	status = session.SendPacket(m_SendBuf,48);
	if (status < 0){
		std::cerr << RTPGetErrorString(status) << std::endl;
		exit(-1);
	}
	return true;
}
示例#6
0
void checkerror(int rtperr)
{
	if (rtperr < 0)
	{
		char *errstr;
		
		// This function gets the error string for a certain error code
		errstr = RTPGetErrorString(rtperr);
		
		printf("Error:\n");
		printf("%s\n",errstr);
		exit(-1);
	}
}
bool whu_RtpRPicSAg::Init()
{
	#ifdef WIN32
		WSADATA dat;
		WSAStartup(MAKEWORD(2,2),&dat);
	#endif // WIN32
	RTPSessionParams sessionparams;
	sessionparams.SetOwnTimestampUnit(1.0/8000.0);

	RTPUDPv4TransmissionParams transparams;
	transparams.SetPortbase(m_GLocalPort);

	int status = session.Create(sessionparams,&transparams);
	if (status < 0)
	{
		std::cerr << RTPGetErrorString(status) << std::endl;
		exit(-1);
	}
	//uint8_t localip[]={127,0,0,1};
	//uint8_t localip[]={192,168,16,3};//̨ʽ»úIP//
	//unsigned char sssss[4]={192,168,16,3};
	//uint8_t localip[4];
	//memcpy(localip,m_GRemoteIpAddRess,4);
	RTPIPv4Address addr(m_GRemoteIpAddRess,m_GRemotePort);
	status = session.AddDestination(addr);
	if (status < 0)
	{
		std::cerr << RTPGetErrorString(status) << std::endl;
		exit(-1);
	}

	session.SetDefaultPayloadType(96);
	session.SetDefaultMark(false);
	session.SetDefaultTimestampIncrement(160);
	return true;
}
示例#8
0
QJrtp::QJrtp(QObject *parent):
    QIODevice(parent)
{

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

    mSessionparams.SetOwnTimestampUnit(1.0/8000.0);
    mTransparams.SetPortbase(200);
    int status = mSession.Create(mSessionparams,&mTransparams);
    if (status < 0){
        qWarning()<< QString::fromStdString(RTPGetErrorString(status));
    }
}
}

int MP3MediaSubSession::InitRTPSession()
{
    //setup session parameters
    RTPSessionParams sessParams;
    sessParams.SetOwnTimestampUnit(1.0 / 8000.0); //30 video frames per second
    sessParams.SetUsePollThread(1); // background thread to call virtual callbacks - set by default, but just to be sure
    sessParams.SetMaximumPacketSize(MAX_PACKET_SIZE);
    //setup transmission parameters
    RTPUDPv4TransmissionParams transParams;
    transParams.SetPortbase(portNum_);
    //CREATE THE SESSION
    int errcode = theRTPSession_.Create(sessParams, &transParams);
    if ( errcode < 0 )
    {
        string stdErrStr = RTPGetErrorString(errcode);
        RTSPDEBUG("[Error] : %s", stdErrStr.c_str());
        return ERR_RTSP_CRAETE_RTP_SESSION; //unable to create the session
    }
//called on timer
//all data is processed here
void MediaStream::timerClick()
{
//d->mutex.lock();

#ifndef TEST_AUDIO    
    int status = d->session.Poll();
    if ( status<0 ) {
        qDebug("Poll: %s", RTPGetErrorString(status).c_str() );
    }
//    printf("JStat2 %d : %d\n", d->micBuffer->size(),d->dspBuffer->size());

    //checkRtpError( status );
    // check incoming packets
    d->session.BeginDataAccess();
    if ( d->session.GotoFirstSourceWithData() ) {

        qDebug("have rtp data");
        do {
            RTPSourceData *sourceData = d->session.GetCurrentSourceInfo();

            RTPPacket *pack;
            if ((pack = d->session.GetNextPacket()) != NULL) {
                qDebug("Get packet N %ld", pack->GetExtendedSequenceNumber());


                // debug("Got  packet with payload type %d, size %d", pack->GetPayloadType(), pack->GetPayloadLength() );

                // TODO initialise decoder here using pack payload type, maybe use QIntDict of decoders
                if ( d->decoder ) {
                    short* decodedData = 0;

                    int size = d->decoder->decode((char*)pack->GetPayloadData(), pack->GetPayloadLength(), &decodedData );

                    if ( size > 0 ) {

                        // adjust the volume
                        for ( int i=0; i<size; i++ ) {
                            double val = double(decodedData[i]) * call_dlg_dsp_level / 50.0;
                            if ( val > 32700.0 )
                                val = 32700.0;
                            if ( val < -32700.0 )
                                val = -32700.0;

                            decodedData[i] = short(val);
                        }
                        
                        // write to DSP buffer
                        d->dspBuffer->lock();
                        d->dspBuffer->put( (char*)decodedData, size*2 );
                        d->dspBuffer->unlock();
                        
                        processDspData(decodedData,size);

                        delete[] decodedData;
                    }
                    qDebug("decoded data (%d byes) with payload type %d",  size*2, pack->GetPayloadType() );


                } else {
                    qDebug("can't decode data with payload type %d", pack->GetPayloadType() );
                }

                // we don't longer need the packet, so
                // we'll delete it
                delete pack;
            }
        } while ( d->session.GotoNextSourceWithData());
    }
    d->session.EndDataAccess();

    // send the packet
    // check for in data


    short *data = 0;
    int micDataSize = 0; // size of readed mic data in samples

    d->micBuffer->lock();
    micDataSize = d->micBuffer->size()/2;
    if ( micDataSize ) {
        data = new short[micDataSize];
        memcpy( data, d->micBuffer->data(), micDataSize*2 );
        d->micBuffer->fetch( micDataSize*2 );
    }
    d->micBuffer->unlock();

    // adjust mic volume
    for ( int i=0; i<micDataSize; i++ ) {
        double val = double(data[i]) * call_dlg_mic_level / 50.0;
        if ( val > 32700.0 )
            val = 32700.0;
        if ( val < -32700.0 )
            val = -32700.0;

        data[i] = short(val);
    }

    if(micDataSize == 0) {
	micDataSize = 160;
	data = new short[160];
    }

    // examine the data here, to calculate levels
    processMicData(data, micDataSize);


    if ( data ) {
        char * encodedData = 0;
        int readed = micDataSize;
        int size = 0;

        qDebug("have mic data %d", micDataSize );
        
        
        do {
            int readed = 0;
            size = d->encoder->encode( data, micDataSize, &encodedData, &readed );

            int localPayload = d->codecPayload; // TODO get local payload here

            qDebug("readed %d  encoded %d", readed, size );

            delete[] data;
            data = 0;
            micDataSize = 0;

            // TODO: for pcmu packet (payload==0) send packets of certain size
            if ( size > 0 ) {
                memcpy( d->outBuffer+d->outBufferPos, encodedData, size );
                d->outBufferPos += size;
                d->outBufferTime += readed;
                if ( d->outBufferPos ) {
                    //checkRtpError( 

                    if ( d->session.IsActive() && d->sendPacketsFlag ) {
                        int status = d->session.SendPacket( (void *)d->outBuffer, (int)d->outBufferPos, (unsigned char)localPayload , false, (long)d->outBufferTime );
                        if ( status<0 ) {
                             qDebug("can't SendPacket, %s", RTPGetErrorString(status).c_str() );
                        }
                    }
                    qDebug("sent packet");
                }

                    

                d->outBufferPos = 0;
                d->outBufferTime = 0;
            }

            if ( encodedData ) {
                delete[] encodedData;
                encodedData = 0;
            }

        } while (size > 0);
    }
    
    status = d->session.Poll();
    if ( status<0 ) {
         qDebug("Poll: %s", RTPGetErrorString(status).c_str() );
    }
#else // TEST_AUDIO

    short *data = 0;
    int micDataSize = 0; // size of readed mic data in samples

    d->micBuffer->lock();
    micDataSize = d->micBuffer->size()/2;
    if ( micDataSize ) {
        data = new short[micDataSize];
        memcpy( data, d->micBuffer->data(), micDataSize*2 );
        d->micBuffer->fetch( micDataSize*2 );
    }
    d->micBuffer->unlock();

    if (data) {
        // write to DSP buffer
        d->dspBuffer->lock();
        d->dspBuffer->put( (char*)data,micDataSize*2 );
        d->dspBuffer->unlock();

    }

    static int totalSamples = 0;
    totalSamples += micDataSize;


    if ( micDataSize )
        printf("total audio samples: %d  %d   \r", micDataSize, totalSamples);
    

#endif // TEST_AUDIO
    
//    d->mutex->unlock();
}
bool MediaStream::start(QHostAddress ip, int port, int localPort, int codecPayload )
{
    if ( isRunning() )
        stop();

    printf("%s %d | %d | %d\n",ip.toString().toAscii().data(), port, localPort, codecPayload);

    if(d->processThread == NULL)
	d->processThread = new MediaThread(this);
    d->outBufferPos = 0;
    d->outBufferTime = 0;

//    int localPort = 3000;
printf("getFactory(%d)\n", codecPayload);
    VoiceCodecFactory *factory = CodecsManager::instance()->codecFactory(codecPayload);
    if ( !factory ) {
        printf("VoiceCodecFactory not found!\n");
        return true;
    }

    d->codecPayload = codecPayload;
    d->decoder =  factory->decoder();
    d->encoder =  factory->encoder();

printf("transparams\n");
    // Now, we'll create a RTP session and set the destination
//     d->transparams.mediaChannel = mediaChannel;
//     d->transparams.incomingPackets = incomingPackets;
    d->transparams.SetPortbase(localPort);
	
    RTPSessionParams sessparams;
    sessparams.SetReceiveMode(RTPTransmitter::AcceptAll);

    sessparams.SetOwnTimestampUnit(1.0/8000.0); // 8KHz
	sessparams.SetAcceptOwnPackets(true);

printf("session.Create()\n");
    int status = d->session.Create( sessparams, &d->transparams, RTPTransmitter::SynapseProto );

    if ( status<0 ) {
        qDebug("can't create RTP session, %s", RTPGetErrorString(status).c_str() );
        d->session.Destroy(); 
        return false;
    }

printf("session.AddDestination()\n");
    RTPIPv4Address addr(ip.toIPv4Address(),port);
	status = d->session.AddDestination(addr);

    if ( status<0 ) {
         qDebug("can't add rtp destination, %s", RTPGetErrorString(status).c_str() );
        d->session.Destroy(); 
        return false;
    }

    d->session.SetDefaultPayloadType(codecPayload);
    d->session.SetDefaultMark(false);
    d->session.SetDefaultTimestampIncrement(160);

    //initialise audio

    status = Pa_Initialize();
//////////////////// FOR TESTING
    if( status != paNoError ) {
        qDebug( "PortAudio error: %s", Pa_GetErrorText(status) );
//        stop();
 //       return true;
    }

if(status == paNoError) {

    status = Pa_OpenDefaultStream(
        &d->audioStream,/* passes back stream pointer */
        1,              /* 1 input channel */
        1,              /* mono output */
        paInt16,        /* 16 bit fixed point output */
        8000,           /* sample rate */
        240,            /* frames per buffer */
        16,             /* number of buffers, if zero then use default minimum */
        audioCallback,  /* specify our custom callback */
        d );            /* pass our data through to callback */

    status = Pa_StartStream( d->audioStream );
    if( status != paNoError ) {
         qDebug( "PortAudio error: %s", Pa_GetErrorText(status) );
//        stop();
//        return true;
    }
}
    

    // put something to dsp buffer
    /*
    char emptyData[160*8];
    memset(  emptyData, 1, sizeof(emptyData) );
    d->dspBuffer->lock();
    d->dspBuffer->put( emptyData, sizeof(emptyData) );
    d->dspBuffer->unlock();
    */



    //d->timer.start(1,false);
    d->isRunning = true;
    d->processThread->start();
    
//    qDebug("mediastream started");
    printf("mediastream started\n");
    return true;
} // }}}