完善获取丢包率pull request; 新增MediaSource::getOwnerPoller接口

This commit is contained in:
xiongziliang 2022-06-11 12:56:03 +08:00
parent be995f9cd2
commit b6d3ec5251
5 changed files with 50 additions and 20 deletions

View File

@ -1,4 +1,4 @@
/* /*
* Copyright (c) 2016 The ZLMediaKit project authors. All Rights Reserved. * Copyright (c) 2016 The ZLMediaKit project authors. All Rights Reserved.
* *
* This file is part of ZLMediaKit(https://github.com/xia-chu/ZLMediaKit). * This file is part of ZLMediaKit(https://github.com/xia-chu/ZLMediaKit).
@ -221,6 +221,14 @@ int MediaSource::getLossRate(mediakit::TrackType type) {
return listener->getLossRate(*this, type); return listener->getLossRate(*this, type);
} }
toolkit::EventPoller::Ptr MediaSource::getOwnerPoller() {
auto listener = _listener.lock();
if (!listener) {
return nullptr;
}
return listener->getOwnerPoller(*this);
}
void MediaSource::onReaderChanged(int size) { void MediaSource::onReaderChanged(int size) {
auto listener = _listener.lock(); auto listener = _listener.lock();
if (listener) { if (listener) {
@ -706,6 +714,15 @@ int MediaSourceEventInterceptor::getLossRate(MediaSource &sender, TrackType type
return -1; //异常返回-1 return -1; //异常返回-1
} }
toolkit::EventPoller::Ptr MediaSourceEventInterceptor::getOwnerPoller(MediaSource &sender) {
auto listener = _listener.lock();
if (listener) {
return listener->getOwnerPoller(sender);
}
return nullptr;
}
bool MediaSourceEventInterceptor::setupRecord(MediaSource &sender, Recorder::type type, bool start, const string &custom_path, size_t max_second) { bool MediaSourceEventInterceptor::setupRecord(MediaSource &sender, Recorder::type type, bool start, const string &custom_path, size_t max_second) {
auto listener = _listener.lock(); auto listener = _listener.lock();
if (!listener) { if (!listener) {

View File

@ -1,4 +1,4 @@
/* /*
* Copyright (c) 2016 The ZLMediaKit project authors. All Rights Reserved. * Copyright (c) 2016 The ZLMediaKit project authors. All Rights Reserved.
* *
* This file is part of ZLMediaKit(https://github.com/xia-chu/ZLMediaKit). * This file is part of ZLMediaKit(https://github.com/xia-chu/ZLMediaKit).
@ -77,8 +77,10 @@ public:
virtual void onReaderChanged(MediaSource &sender, int size); virtual void onReaderChanged(MediaSource &sender, int size);
//流注册或注销事件 //流注册或注销事件
virtual void onRegist(MediaSource &sender, bool regist) {}; virtual void onRegist(MediaSource &sender, bool regist) {};
// 获取丢包率
virtual int getLossRate(MediaSource &sender, TrackType type) {return -1;}; virtual int getLossRate(MediaSource &sender, TrackType type) { return -1; }
// 获取所在线程
virtual toolkit::EventPoller::Ptr getOwnerPoller(MediaSource &sender) { return nullptr; }
////////////////////////仅供MultiMediaSourceMuxer对象继承//////////////////////// ////////////////////////仅供MultiMediaSourceMuxer对象继承////////////////////////
// 开启或关闭录制 // 开启或关闭录制
@ -145,6 +147,8 @@ public:
void startSendRtp(MediaSource &sender, const SendRtpArgs &args, const std::function<void(uint16_t, const toolkit::SockException &)> cb) override; void startSendRtp(MediaSource &sender, const SendRtpArgs &args, const std::function<void(uint16_t, const toolkit::SockException &)> cb) override;
bool stopSendRtp(MediaSource &sender, const std::string &ssrc) override; bool stopSendRtp(MediaSource &sender, const std::string &ssrc) override;
int getLossRate(MediaSource &sender, TrackType type) override; int getLossRate(MediaSource &sender, TrackType type) override;
toolkit::EventPoller::Ptr getOwnerPoller(MediaSource &sender) override;
private: private:
std::weak_ptr<MediaSourceEvent> _listener; std::weak_ptr<MediaSourceEvent> _listener;
}; };
@ -297,6 +301,10 @@ public:
void startSendRtp(const MediaSourceEvent::SendRtpArgs &args, const std::function<void(uint16_t, const toolkit::SockException &)> cb); void startSendRtp(const MediaSourceEvent::SendRtpArgs &args, const std::function<void(uint16_t, const toolkit::SockException &)> cb);
// 停止发送ps-rtp // 停止发送ps-rtp
bool stopSendRtp(const std::string &ssrc); bool stopSendRtp(const std::string &ssrc);
// 获取丢包率
int getLossRate(mediakit::TrackType type);
// 获取所在线程
toolkit::EventPoller::Ptr getOwnerPoller();
////////////////static方法查找或生成MediaSource//////////////// ////////////////static方法查找或生成MediaSource////////////////

View File

@ -150,4 +150,8 @@ void WebRtcPusher::onRtcConfigure(RtcConfigure &configure) const {
int WebRtcPusher::getLossRate(MediaSource &sender,mediakit::TrackType type){ int WebRtcPusher::getLossRate(MediaSource &sender,mediakit::TrackType type){
return WebRtcTransportImp::getLossRate(type); return WebRtcTransportImp::getLossRate(type);
} }
toolkit::EventPoller::Ptr WebRtcPusher::getOwnerPoller(mediakit::MediaSource &sender) {
return getPoller();
}

View File

@ -39,8 +39,10 @@ protected:
std::string getOriginUrl(mediakit::MediaSource &sender) const override; std::string getOriginUrl(mediakit::MediaSource &sender) const override;
// 获取媒体源客户端相关信息 // 获取媒体源客户端相关信息
std::shared_ptr<SockInfo> getOriginSock(mediakit::MediaSource &sender) const override; std::shared_ptr<SockInfo> getOriginSock(mediakit::MediaSource &sender) const override;
// 获取丢包率
int getLossRate(mediakit::MediaSource &sender,mediakit::TrackType type) override; int getLossRate(mediakit::MediaSource &sender,mediakit::TrackType type) override;
// 获取MediaSource归属线程
toolkit::EventPoller::Ptr getOwnerPoller(mediakit::MediaSource &sender) override;
private: private:
WebRtcPusher(const EventPoller::Ptr &poller, const mediakit::RtspMediaSourceImp::Ptr &src, WebRtcPusher(const EventPoller::Ptr &poller, const mediakit::RtspMediaSourceImp::Ptr &src,

View File

@ -612,10 +612,10 @@ public:
} }
int getLossRate() { int getLossRate() {
if (!_rtcp_context.getExpectedPacketsInterval()) //_rtcp_context.getExpectedPacketsInterval()取值总为零? if (!_rtcp_context.getExpectedPacketsInterval()) {
{ //_rtcp_context.getExpectedPacketsInterval()取值总为零?
return 0; return 0;
} }
return _rtcp_context.geLostInterval() * 100 / _rtcp_context.getExpectedPacketsInterval(); return _rtcp_context.geLostInterval() * 100 / _rtcp_context.getExpectedPacketsInterval();
} }
@ -659,19 +659,18 @@ std::shared_ptr<RtpChannel> MediaTrack::getRtpChannel(uint32_t ssrc) const{
return it_chn->second; return it_chn->second;
} }
int WebRtcTransportImp::getLossRate(mediakit::TrackType type){ int WebRtcTransportImp::getLossRate(mediakit::TrackType type) {
for(auto it : _ssrc_to_track){ for (auto &pr : _ssrc_to_track) {
auto ssrc = it.first; auto ssrc = pr.first;
auto track = it.second; auto &track = pr.second;
auto rtp_chn = track->getRtpChannel(ssrc); auto rtp_chn = track->getRtpChannel(ssrc);
if(rtp_chn){ if (rtp_chn) {
InfoL << "-----------接收丢包率,ssrc------------- :" << ssrc << ",loss rate(%):" << rtp_chn->getLossRate() ; if (track->media && type == track->media->type) {
if (track->media && type==track->media->type){
return rtp_chn->getLossRate(); return rtp_chn->getLossRate();
} }
} }
} }
return -1; return -1;
} }
void WebRtcTransportImp::onRtcp(const char *buf, size_t len) { void WebRtcTransportImp::onRtcp(const char *buf, size_t len) {