diff --git a/src/Rtp/RtpProcess.cpp b/src/Rtp/RtpProcess.cpp index e3767d7b..d224a3ee 100644 --- a/src/Rtp/RtpProcess.cpp +++ b/src/Rtp/RtpProcess.cpp @@ -281,5 +281,21 @@ toolkit::EventPoller::Ptr RtpProcess::getOwnerPoller(MediaSource &sender) { return _sock ? _sock->getPoller() : nullptr; } +void RtpProcess::setHelper(std::weak_ptr help) { + _help = std::move(help); +} + +int RtpProcess::getLossRate(MediaSource &sender, TrackType type) { + auto help = _help.lock(); + if (!help) { + return -1; + } + auto expected = help->getExpectedPacketsInterval(); + if (!expected) { + return 0; + } + return help->geLostInterval() * 100 / expected; +} + }//namespace mediakit #endif//defined(ENABLE_RTPPROXY) \ No newline at end of file diff --git a/src/Rtp/RtpProcess.h b/src/Rtp/RtpProcess.h index 93dd37fe..e6f9b6bd 100644 --- a/src/Rtp/RtpProcess.h +++ b/src/Rtp/RtpProcess.h @@ -13,6 +13,7 @@ #if defined(ENABLE_RTPPROXY) #include "ProcessInterface.h" +#include "Rtcp/RtcpContext.h" #include "Common/MultiMediaSourceMuxer.h" namespace mediakit { @@ -66,6 +67,8 @@ public: int getTotalReaderCount(); void setListener(const std::weak_ptr &listener); + void setHelper(const std::weak_ptr help); + int getLossRate(MediaSource &sender, TrackType type) override; protected: bool inputFrame(const Frame::Ptr &frame) override; bool addTrack(const Track::Ptr & track) override; @@ -99,6 +102,7 @@ private: toolkit::Ticker _last_check_alive; std::recursive_mutex _func_mtx; std::deque > _cached_func; + std::weak_ptr _help; }; }//namespace mediakit diff --git a/src/Rtp/RtpServer.cpp b/src/Rtp/RtpServer.cpp index 8cee24ff..0d47ff88 100644 --- a/src/Rtp/RtpServer.cpp +++ b/src/Rtp/RtpServer.cpp @@ -127,6 +127,7 @@ void RtpServer::start(uint16_t local_port, const string &stream_id, bool enable_ //指定了流id,那么一个端口一个流(不管是否包含多个ssrc的多个流,绑定rtp源后,会筛选掉ip端口不匹配的流) process = RtpSelector::Instance().getProcess(stream_id, true); RtcpHelper::Ptr helper = std::make_shared(std::move(rtcp_socket), 90000); + process->setHelper(helper); helper->startRtcp(); rtp_socket->setOnRead([rtp_socket, process, helper, ssrc](const Buffer::Ptr &buf, struct sockaddr *addr, int addr_len) { RtpHeader *header = (RtpHeader *)buf->data();