From ed6c80cf077d5cdf07d7ba57f977351609f3104c Mon Sep 17 00:00:00 2001 From: dingcan Date: Tue, 26 Jul 2022 11:21:19 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9Ertp=20udp=E6=94=B6=E6=B5=81?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=B8=A2=E5=8C=85=E7=8E=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Rtp/RtpProcess.cpp | 14 +++++++++++++- src/Rtp/RtpProcess.h | 5 +++++ src/Rtp/RtpServer.cpp | 1 + 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/src/Rtp/RtpProcess.cpp b/src/Rtp/RtpProcess.cpp index e3767d7b..7ce5c507 100644 --- a/src/Rtp/RtpProcess.cpp +++ b/src/Rtp/RtpProcess.cpp @@ -280,6 +280,18 @@ std::shared_ptr RtpProcess::getOriginSock(MediaSource &sender) const { toolkit::EventPoller::Ptr RtpProcess::getOwnerPoller(MediaSource &sender) { return _sock ? _sock->getPoller() : nullptr; } - +void RtpProcess::setHelper(const std::weak_ptr &help) +{ + _help=help; +} +int RtpProcess::getLossRate(MediaSource &sender, TrackType type) +{ + auto help = _help.lock(); + 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..1241c21d 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,8 @@ 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();