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; }
void ServerSession::CheckError( int status ) { if (status < 0) { MessageBox(g_hMainWnd, RTPGetErrorString(status).c_str(), "RTP会话创建失败", MB_ICONERROR); exit(-1); } }
/*********************************************************************************************************** **函数:Rtp_Lock **功能: **输入参数: **返回值: ***********************************************************************************************************/ static int checkerror(int rtperr) { if(rtperr < 0) { std::cout << "ERROR: " << RTPGetErrorString(rtperr) << std::endl; return -1; } return 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; }
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; }
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; } // }}}