diff --git a/src/Common/Parser.cpp b/src/Common/Parser.cpp index 1c866a64..abb749dd 100644 --- a/src/Common/Parser.cpp +++ b/src/Common/Parser.cpp @@ -137,9 +137,13 @@ StrCaseMap Parser::parseArgs(const string &str, const char *pair_delim, const ch StrCaseMap ret; auto arg_vec = split(str, pair_delim); for (string &key_val : arg_vec) { - auto key = FindField(key_val.data(), NULL, key_delim); - auto val = FindField(key_val.data(), key_delim, NULL); - ret.emplace_force(trim(key), trim(val)); + auto key = trim(FindField(key_val.data(), NULL, key_delim)); + if (!key.empty()) { + auto val = trim(FindField(key_val.data(), key_delim, NULL)); + ret.emplace_force(key, val); + } else { + ret.emplace_force(key_val, ""); + } } return ret; } diff --git a/src/Rtsp/RtpReceiver.cpp b/src/Rtsp/RtpReceiver.cpp index 6e3826f9..977a3d4a 100644 --- a/src/Rtsp/RtpReceiver.cpp +++ b/src/Rtsp/RtpReceiver.cpp @@ -152,13 +152,16 @@ void RtpReceiver::setPoolSize(int size) { _rtp_pool.setSize(size); } -int RtpReceiver::getJitterSize(int track_index){ +int RtpReceiver::getJitterSize(int track_index) const{ return _rtp_sortor[track_index].getJitterSize(); } -int RtpReceiver::getCycleCount(int track_index){ +int RtpReceiver::getCycleCount(int track_index) const{ return _rtp_sortor[track_index].getCycleCount(); } +uint32_t RtpReceiver::getSSRC(int track_index) const{ + return _ssrc[track_index]; +} }//namespace mediakit diff --git a/src/Rtsp/RtpReceiver.h b/src/Rtsp/RtpReceiver.h index 14d6d991..f9a972f0 100644 --- a/src/Rtsp/RtpReceiver.h +++ b/src/Rtsp/RtpReceiver.h @@ -44,14 +44,14 @@ public: /** * 获取排序缓存长度 */ - int getJitterSize() { + int getJitterSize() const{ return _rtp_sort_cache_map.size(); } /** * 获取seq回环次数 */ - int getCycleCount() { + int getCycleCount() const{ return _seq_cycle_count; } @@ -184,8 +184,9 @@ protected: void clear(); void setPoolSize(int size); - int getJitterSize(int track_index); - int getCycleCount(int track_index); + int getJitterSize(int track_index) const; + int getCycleCount(int track_index) const; + uint32_t getSSRC(int track_index) const; private: uint32_t _ssrc[2] = {0, 0}; diff --git a/src/Rtsp/RtspPlayer.cpp b/src/Rtsp/RtspPlayer.cpp index 3ebde80f..7a47375f 100644 --- a/src/Rtsp/RtspPlayer.cpp +++ b/src/Rtsp/RtspPlayer.cpp @@ -252,40 +252,43 @@ void RtspPlayer::sendSetup(unsigned int track_idx) { void RtspPlayer::handleResSETUP(const Parser &parser, unsigned int track_idx) { if (parser.Url() != "200") { - throw std::runtime_error( - StrPrinter << "SETUP:" << parser.Url() << " " << parser.Tail() << endl); + throw std::runtime_error(StrPrinter << "SETUP:" << parser.Url() << " " << parser.Tail() << endl); } if (track_idx == 0) { _session_id = parser["Session"]; - _session_id.append(";"); - _session_id = FindField(_session_id.data(), nullptr, ";"); } auto strTransport = parser["Transport"]; - if(strTransport.find("TCP") != string::npos || strTransport.find("interleaved") != string::npos){ + if (strTransport.find("TCP") != string::npos || strTransport.find("interleaved") != string::npos) { _rtp_type = Rtsp::RTP_TCP; - }else if(strTransport.find("multicast") != string::npos){ + } else if (strTransport.find("multicast") != string::npos) { _rtp_type = Rtsp::RTP_MULTICAST; - }else{ + } else { _rtp_type = Rtsp::RTP_UDP; } - + auto transport_map = Parser::parseArgs(strTransport, ";", "="); RtspSplitter::enableRecvRtp(_rtp_type == Rtsp::RTP_TCP); + string ssrc = transport_map["ssrc"]; + if(!ssrc.empty()){ + sscanf(ssrc.data(), "%x", &_sdp_track[track_idx]->_ssrc); + } else{ + _sdp_track[track_idx]->_ssrc = 0; + } - if(_rtp_type == Rtsp::RTP_TCP) { - string interleaved = FindField( FindField((strTransport + ";").data(), "interleaved=", ";").data(), NULL, "-"); - _sdp_track[track_idx]->_interleaved = atoi(interleaved.data()); - }else{ - const char *strPos = (_rtp_type == Rtsp::RTP_MULTICAST ? "port=" : "server_port=") ; - auto port_str = FindField((strTransport + ";").data(), strPos, ";"); - uint16_t rtp_port = atoi(FindField(port_str.data(), NULL, "-").data()); - uint16_t rtcp_port = atoi(FindField(port_str.data(), "-",NULL).data()); + if (_rtp_type == Rtsp::RTP_TCP) { + int interleaved_rtp, interleaved_rtcp; + sscanf(transport_map["interleaved"].data(), "%d-%d", &interleaved_rtp, &interleaved_rtcp); + _sdp_track[track_idx]->_interleaved = interleaved_rtp; + } else { + auto port_str = transport_map[(_rtp_type == Rtsp::RTP_MULTICAST ? "port" : "server_port")]; + int rtp_port, rtcp_port; + sscanf(port_str.data(), "%d-%d", &rtp_port, &rtcp_port); auto &pRtpSockRef = _rtp_sock[track_idx]; auto &pRtcpSockRef = _rtcp_sock[track_idx]; if (_rtp_type == Rtsp::RTP_MULTICAST) { //udp组播 - auto multiAddr = FindField((strTransport + ";").data(), "destination=", ";"); + auto multiAddr = transport_map["destination"]; pRtpSockRef = createSocket(); if (!pRtpSockRef->bindUdpSock(rtp_port, multiAddr.data())) { pRtpSockRef.reset(); @@ -383,7 +386,7 @@ void RtspPlayer::sendKeepAlive(){ _on_response = [this](const Parser& parser){}; if(_supported_cmd.find("GET_PARAMETER") != _supported_cmd.end()){ //支持GET_PARAMETER,用此命令保活 - sendRtspRequest("GET_PARAMETER", _play_url); + sendRtspRequest("GET_PARAMETER", _content_base); }else{ //不支持GET_PARAMETER,用OPTIONS命令保活 sendRtspRequest("OPTIONS", _play_url); @@ -549,7 +552,7 @@ void RtspPlayer::sendReceiverReport(bool over_tcp, int track_idx){ aui8Rtcp[0] = '$'; aui8Rtcp[1] = track->_interleaved + 1; - aui8Rtcp[2] = (sizeof(aui8Rtcp) - 4) >> 8; + aui8Rtcp[2] = (sizeof(aui8Rtcp) - 4) >> 8; aui8Rtcp[3] = (sizeof(aui8Rtcp) - 4) & 0xFF; pui8Rtcp_RR[0] = 0x81;/* 1 report block */ @@ -557,11 +560,13 @@ void RtspPlayer::sendReceiverReport(bool over_tcp, int track_idx){ pui8Rtcp_RR[2] = 0x00; pui8Rtcp_RR[3] = 0x07;/* length in words - 1 */ - uint32_t ssrc=htonl(track->_ssrc + 1); + auto track_ssrc = track->_ssrc ? track->_ssrc : getSSRC(track_idx); // our own SSRC: we use the server's SSRC + 1 to avoid conflicts + uint32_t ssrc = htonl(track_ssrc + 1); memcpy(&pui8Rtcp_RR[4], &ssrc, 4); - ssrc=htonl(track->_ssrc); + // server SSRC + ssrc = htonl(track_ssrc); memcpy(&pui8Rtcp_RR[8], &ssrc, 4); //FIXME: 8 bits of fraction, 24 bits of total packets lost @@ -577,9 +582,9 @@ void RtspPlayer::sendReceiverReport(bool over_tcp, int track_idx){ pui8Rtcp_RR[18] = counter.pktCnt >> 8; pui8Rtcp_RR[19] = counter.pktCnt & 0xFF; - uint32_t jitter = htonl(getJitterSize(track_idx)); + uint32_t jitter = htonl(getJitterSize(track_idx)); //FIXME: jitter - memcpy(pui8Rtcp_RR + 20, &jitter , 4); + memcpy(pui8Rtcp_RR + 20, &jitter, 4); /* last SR timestamp */ memcpy(pui8Rtcp_RR + 24, &counter.lastTimeStamp, 4); uint32_t msInc = htonl(ntohl(counter.timeStamp) - ntohl(counter.lastTimeStamp));