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(); }
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"); } }
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(); }
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)); }