Пример #1
0
string RTSPStream::Setup(RTSPMessage *msg)
{
    ostringstream response;

    // find the client port in the transport params
    string transport = msg->ValueForOption("transport");
    vector<string> components = divideBy(transport, ";");
    vector<string> ports;
    for (vector<string>::iterator it = components.begin(); it != components.end(); it++)
    {
        string label = it->substr(0, 12);
        if (caselesscompare(label, "client_port="))
        {
            ports = divideBy(it->substr(12), "-");
            break;
        }
    }
    if (ports.size() == 2)
    {
        int portRTP = stoi(ports[0]);
        int portRTCP = stoi(ports[1]);
        if (MakeSession(portRTP, portRTCP))
        {
            response << msg->CreateResponse(200, "OK") << "Session: " << m_session  << "\r\n";
            response << "Transport: RTP/AVP;unicast;client_port=" << portRTP << "-" << portRTCP;
            response << ";server_port=" << m_portBase << "-" << m_portBase + 1 << "\r\n\r\n";
        }
    }
    if (response.str().length() == 0)
    {
        response << msg->CreateResponse(451, "transport setup failed");
    }
    return response.str();
}
Пример #2
0
CBufferOutputVideoEngine::CBufferOutputVideoEngine(UInt32 iRoomId,UInt32 iFromUin)
:m_iRoomId(iRoomId),
m_iFromUin(iFromUin),
m_pInPlace(NULL),
m_pRate(NULL),
m_lastRecvTime(GetTickCount()),
m_iMinFrameId(0),
m_iMaxFrameId(0),
m_iPlayFrameId(0),
m_iMinSequenceId(0),
m_iMaxSequenceId(0),
m_iCheckSeqId(0),
m_iCheckFrameId(0),
m_iTotalPacketNum(0),
m_iLostPacketNum(0),
m_fLostRate(0.0f),
m_dwLastLostTime(GetTickCount()),
m_dwFirstStartTime(0),
m_dwSecondStartTime(0),
m_dwLostStartTime(0),
m_iFirstStartNum(0),
m_dwLastRecvRateTime(0),
m_iLastRecvRateInter(BUFFER_OUTPUT_RATECALC_MIN_INTERVAL),
m_iBufferSize(BUFFER_OUTPUT_ONMIC_VIDEO_MAX_LIMIT),
m_iFirstStartFrameSeq(0),
m_iFirstCurFrameSeq(0),
m_iSecondStartFrameSeq(0),
m_iSecondCurFrameSeq(0),
m_iFirstStartFrameNum(0),
m_iSecondStartFrameNum(0),
m_iAudioBufferSize(BUFFER_OUTPUT_ONMIC_AUDIO_MAX_LIMIT),
m_bStartPlay(true),
m_dwLastCalcBufSizeTime(0),
m_dwLastRecvAudioTime(0),
m_fRecvRate(0.0f),
m_fRecvFrameRate(0.0f),
m_dwLastPlayRateTime(0),
m_dwSendRate(1000/BUFFER_PERSEC_VIDEO_FRAMES),
m_dwLastPlayTime(0),
m_dwStartPlayTime(0),
m_iStartPlayCount(0),
m_iWillPlayFrameId(0),
m_iSecondStartNum(0),
m_dwStartCalcAudioParam(0),
m_bFilled(false)
{
	try
	{
		BufferTrace("CBufferOutputVideoEngine::CBufferOutputVideoEngine() begin\n");
		MutexLocker m_locker(&m_static_mutex);//网络线程 播放线程 m_mapVideoOutput
		m_mapVideoOutput.insert(make_pair(MakeSession(m_iRoomId,m_iFromUin),this));
	}
	catch (...)
	{
		ErrTrace("CBufferOutputVideoEngine::CBufferOutputVideoEngine() begin Error..........\n");
	}
}
Пример #3
0
void CBufferOutputVideoEngine::UnInitialize()
{
		BufferTrace("CBufferOutputVideoEngine::UnInitialize() \n");
		MutexLocker m_locker(&m_static_mutex);//网络线程 播放线程 m_mapVideoOutput
		map<UInt64,CBufferOutputVideoEngine*>::iterator iter = m_mapVideoOutput.find(MakeSession(m_iRoomId,m_iFromUin));
		if (iter!=m_mapVideoOutput.end()){
			m_mapVideoOutput.erase(iter);
		}
		m_pInPlace = NULL;
		m_pRate = NULL;
		ClearPackets();
}
Пример #4
0
CBufferOutputAudioEngine::CBufferOutputAudioEngine(UInt32 iRoomId,UInt32 iFromUin)
:m_pInPlace(NULL),
m_pRate(NULL),
m_iFromUin(iFromUin),
m_iRoomId(iRoomId),
m_lastRecvTime(GetTickCount()),
m_iMinFrameId(0),
m_iMaxFrameId(0),
m_iMinSequenceId(0),
m_iMaxSequenceId(0),
m_iCheckSeqId(0),
m_dwLastLostTime(GetTickCount()),
m_iTotalPacketNum(0),
m_iLostPacketNum(0),
m_fLostRate(0.0f),
m_iLastRecvRateInter(BUFFER_OUTPUT_RATECALC_MIN_INTERVAL),
m_iBufferSize(BUFFER_OUTPUT_ONMIC_AUDIO_MAX_LIMIT),
m_dwLastRecvRateTime(0),
m_dwFirstStartTime(0),
m_dwSecondStartTime(0),
m_iFirstStartNum(0),
m_iSecondStartNum(0),
m_bFilled(false),
m_fRecvRate(BUFFER_PERSEC_AUDIO_NUMBER),
m_dwLastCalcRecvRate(GetTickCount()),
m_fSendRate(BUFFER_PERSEC_AUDIO_SEND_INTER),
m_fLastPlayTime(GetTickCount()),
m_iStartPlayCount(0),
m_bAjustSendRate(false),
m_dwShakeCheckStart(GetTickCount()),
m_bShakeKeepRate(false)
{
		BufferTrace("CBufferOutputAudioEngine::CBufferOutputAudioEngine() \n");
		MutexLocker m_locker(&m_static_mutex);//网络线程 播放线程 m_mapAudioOutput
		m_mapAudioOutput.insert(make_pair(MakeSession(m_iRoomId,m_iFromUin),this));
}