mirror of
https://gitee.com/xia-chu/ZLMediaKit.git
synced 2026-05-19 00:07:49 +08:00
Compare commits
4 Commits
1bf00cc2a4
...
b9d513f9aa
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b9d513f9aa | ||
|
|
21d1ea9676 | ||
|
|
13f603328f | ||
|
|
016f6e0e59 |
@ -180,8 +180,8 @@ public:
|
||||
virtual void setOnResume(const std::function<void()> &cb) = 0;
|
||||
|
||||
virtual size_t getRecvSpeed() { return 0; }
|
||||
|
||||
virtual size_t getRecvTotalBytes() { return 0; }
|
||||
virtual std::shared_ptr<toolkit::SockInfo> getSockInfo() const { return nullptr; }
|
||||
|
||||
protected:
|
||||
virtual void onResume() = 0;
|
||||
@ -241,8 +241,11 @@ public:
|
||||
return _delegate ? _delegate->getTracks(ready) : Parent::getTracks(ready);
|
||||
}
|
||||
|
||||
std::shared_ptr<toolkit::SockInfo> getSockInfo() const {
|
||||
return std::dynamic_pointer_cast<toolkit::SockInfo>(_delegate);
|
||||
std::shared_ptr<toolkit::SockInfo> getSockInfo() const override {
|
||||
auto ret = std::dynamic_pointer_cast<toolkit::SockInfo>(_delegate);
|
||||
if (!ret)
|
||||
ret = _delegate ? _delegate->getSockInfo() : Parent::getSockInfo();
|
||||
return ret;
|
||||
}
|
||||
|
||||
void setMediaSource(const MediaSource::Ptr &src) override {
|
||||
|
||||
@ -107,6 +107,11 @@ uint32_t RtcpContextForSend::getRtt(uint32_t ssrc) const {
|
||||
}
|
||||
|
||||
Buffer::Ptr RtcpContextForSend::createRtcpSR(uint32_t rtcp_ssrc) {
|
||||
uint64_t now = getCurrentMillisecond();
|
||||
if (now - _last_sr_tsp < 5000) {
|
||||
return nullptr;
|
||||
}
|
||||
_last_sr_tsp = now;
|
||||
auto rtcp = RtcpSR::create(0);
|
||||
rtcp->setNtpStamp(_last_ntp_stamp_ms);
|
||||
rtcp->rtpts = htonl(_last_rtp_stamp);
|
||||
@ -117,7 +122,7 @@ Buffer::Ptr RtcpContextForSend::createRtcpSR(uint32_t rtcp_ssrc) {
|
||||
// 记录上次发送的sender report信息,用于后续统计rtt [AUTO-TRANSLATED:1d22d2c8]
|
||||
// Record the last sent sender report information for subsequent RTT statistics
|
||||
auto last_sr_lsr = ((ntohl(rtcp->ntpmsw) & 0xFFFF) << 16) | ((ntohl(rtcp->ntplsw) >> 16) & 0xFFFF);
|
||||
_sender_report_ntp[last_sr_lsr] = getCurrentMillisecond();
|
||||
_sender_report_ntp[last_sr_lsr] = now;
|
||||
if (_sender_report_ntp.size() >= 5) {
|
||||
// 删除最早的sr rtcp [AUTO-TRANSLATED:2457e08d]
|
||||
// Delete the earliest sr rtcp
|
||||
|
||||
@ -154,6 +154,7 @@ public:
|
||||
uint32_t getRtt(uint32_t ssrc) const;
|
||||
|
||||
private:
|
||||
uint64_t _last_sr_tsp = 0;
|
||||
std::map<uint32_t /*ssrc*/, uint32_t /*rtt*/> _rtt;
|
||||
std::map<uint32_t /*last_sr_lsr*/, uint64_t /*ntp stamp*/> _sender_report_ntp;
|
||||
|
||||
|
||||
@ -1060,7 +1060,7 @@ IceAgent::IceAgent(Listener* listener, Implementation implementation, Role role,
|
||||
}, getPoller());
|
||||
}
|
||||
|
||||
void IceAgent::gatheringCandidate(const CandidateTuple::Ptr& candidate_tuple, bool gathering_rflx, bool gathering_realy) {
|
||||
void IceAgent::gatheringCandidate(const CandidateTuple::Ptr& candidate_tuple, bool gathering_rflx, bool gathering_relay) {
|
||||
// TraceL;
|
||||
|
||||
auto interfaces = SockUtil::getInterfaceList();
|
||||
@ -1091,11 +1091,11 @@ void IceAgent::gatheringCandidate(const CandidateTuple::Ptr& candidate_tuple, bo
|
||||
gatheringSrflxCandidate(pair);
|
||||
}
|
||||
|
||||
if (gathering_realy) {
|
||||
if (gathering_relay) {
|
||||
//TODO: 代优化relay_socket 复用host socket当前SocketCandidateManager数据结构不支持
|
||||
auto relay_socket = createSocket(candidate_tuple->_transport, candidate_tuple->_addr._host, candidate_tuple->_addr._port, local_ip);
|
||||
_socket_candidate_manager.addRelaySocket(relay_socket);
|
||||
gatheringRealyCandidate(std::make_shared<Pair>(std::move(relay_socket)));
|
||||
gatheringRelayCandidate(std::make_shared<Pair>(std::move(relay_socket)));
|
||||
}
|
||||
} catch (std::exception &ex) {
|
||||
WarnL << ex.what();
|
||||
@ -1163,7 +1163,7 @@ void IceAgent::gatheringSrflxCandidate(const Pair::Ptr& pair) {
|
||||
sendBindRequest(pair, std::move(handle));
|
||||
}
|
||||
|
||||
void IceAgent::gatheringRealyCandidate(const Pair::Ptr &pair) {
|
||||
void IceAgent::gatheringRelayCandidate(const Pair::Ptr &pair) {
|
||||
// TraceL;
|
||||
sendAllocateRequest(pair);
|
||||
}
|
||||
@ -1850,12 +1850,12 @@ void IceAgent::sendSocketData(const Buffer::Ptr& buf, const Pair::Ptr& pair, boo
|
||||
}
|
||||
|
||||
if (use_pair->_relayed_addr) {
|
||||
return sendRealyPacket(buf, use_pair, flush);
|
||||
return sendRelayPacket(buf, use_pair, flush);
|
||||
}
|
||||
return sendSocketData_l(buf, use_pair, flush);
|
||||
}
|
||||
|
||||
void IceAgent::sendRealyPacket(const Buffer::Ptr& buffer, const Pair::Ptr& pair, bool flush) {
|
||||
void IceAgent::sendRelayPacket(const Buffer::Ptr &buffer, const Pair::Ptr &pair, bool flush) {
|
||||
// TraceL;
|
||||
auto forward_pair = std::make_shared<Pair>(*pair);
|
||||
auto peer_addr = std::move(forward_pair->_relayed_addr);
|
||||
@ -2023,4 +2023,24 @@ Json::Value IceAgent::getChecklistInfo() const {
|
||||
return result;
|
||||
}
|
||||
|
||||
size_t IceAgent::getRecvSpeed() {
|
||||
size_t ret = 0;
|
||||
for (auto s : _socket_candidate_manager.getAllSockets()) {
|
||||
if (s && s->getSock()) {
|
||||
ret += s->getSock()->getRecvSpeed();
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
size_t IceAgent::getRecvTotalBytes() {
|
||||
size_t ret = 0;
|
||||
for (auto s : _socket_candidate_manager.getAllSockets()) {
|
||||
if (s && s->getSock()) {
|
||||
ret += s->getSock()->getRecvTotalBytes();
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
} // namespace RTC
|
||||
|
||||
@ -509,7 +509,7 @@ public:
|
||||
_ice_server = std::move(ice_server);
|
||||
}
|
||||
|
||||
void gatheringCandidate(const CandidateTuple::Ptr& candidate_tuple, bool gathering_rflx, bool gathering_realy);
|
||||
void gatheringCandidate(const CandidateTuple::Ptr& candidate_tuple, bool gathering_rflx, bool gathering_relay);
|
||||
void connectivityCheck(CandidateInfo& candidate);
|
||||
void nominated(const Pair::Ptr& pair, CandidateTuple& candidate);
|
||||
|
||||
@ -553,10 +553,12 @@ public:
|
||||
|
||||
// 获取checklist信息,用于API查询
|
||||
Json::Value getChecklistInfo() const;
|
||||
size_t getRecvSpeed();
|
||||
size_t getRecvTotalBytes();
|
||||
|
||||
protected:
|
||||
void gatheringSrflxCandidate(const Pair::Ptr& pair);
|
||||
void gatheringRealyCandidate(const Pair::Ptr& pair);
|
||||
void gatheringRelayCandidate(const Pair::Ptr& pair);
|
||||
void localRelayedConnectivityCheck(CandidateInfo& candidate);
|
||||
void connectivityCheck(const Pair::Ptr& pair, CandidateTuple& candidate);
|
||||
void tryTriggerredCheck(const Pair::Ptr& pair);
|
||||
@ -587,7 +589,7 @@ protected:
|
||||
void refreshChannelBindings();
|
||||
|
||||
void sendSendIndication(const sockaddr_storage& peer_addr, const toolkit::Buffer::Ptr& buffer, const Pair::Ptr& pair);
|
||||
void sendRealyPacket(const toolkit::Buffer::Ptr& buffer, const Pair::Ptr& pair, bool flush);
|
||||
void sendRelayPacket(const toolkit::Buffer::Ptr& buffer, const Pair::Ptr& pair, bool flush);
|
||||
|
||||
private:
|
||||
|
||||
|
||||
@ -11,9 +11,6 @@
|
||||
#ifndef ZLMEDIAKIT_WEBRTC_CLIENT_H
|
||||
#define ZLMEDIAKIT_WEBRTC_CLIENT_H
|
||||
|
||||
#include "Network/Socket.h"
|
||||
#include "Poller/Timer.h"
|
||||
#include "Util/TimeTicker.h"
|
||||
#include "Http/HttpRequester.h"
|
||||
#include "Sdp.h"
|
||||
#include "WebRtcTransport.h"
|
||||
@ -46,14 +43,6 @@ public:
|
||||
private:
|
||||
};
|
||||
|
||||
namespace Rtc {
|
||||
typedef enum {
|
||||
Signaling_Invalid = -1,
|
||||
Signaling_WHEP_WHIP = 0,
|
||||
Signaling_WEBSOCKET = 1,
|
||||
} eSignalingProtocols;
|
||||
} // namespace Rtc
|
||||
|
||||
// 实现了webrtc代理功能
|
||||
class WebRtcClient : public std::enable_shared_from_this<WebRtcClient> {
|
||||
public:
|
||||
@ -97,8 +86,6 @@ protected:
|
||||
WebRtcTransport::Ptr _transport = nullptr;
|
||||
bool _is_negotiate_finished = false;
|
||||
|
||||
private:
|
||||
std::map<std::string /*candidate key*/, toolkit::SocketHelper::Ptr> _socket_map;
|
||||
};
|
||||
|
||||
} /*namespace mediakit */
|
||||
|
||||
@ -36,6 +36,16 @@ public:
|
||||
void pause(bool pause) override;
|
||||
void speed(float speed) override;
|
||||
|
||||
std::shared_ptr<toolkit::SockInfo> getSockInfo() const override {
|
||||
return getWebRtcTransport() ? getWebRtcTransport()->getSession() : nullptr;
|
||||
}
|
||||
size_t getRecvSpeed() override {
|
||||
return getWebRtcTransport() ? getWebRtcTransport()->getRecvSpeed() : 0;
|
||||
}
|
||||
size_t getRecvTotalBytes() override {
|
||||
return getWebRtcTransport() ? getWebRtcTransport()->getRecvTotalBytes() : 0;
|
||||
}
|
||||
|
||||
protected:
|
||||
|
||||
//// WebRtcClient override////
|
||||
|
||||
@ -1127,11 +1127,10 @@ public:
|
||||
}
|
||||
return rtp;
|
||||
}
|
||||
|
||||
Buffer::Ptr createRtcpRR(RtcpHeader *sr, uint32_t ssrc) {
|
||||
if (sr) {
|
||||
_rtcp_context.onRtcp(sr);
|
||||
}
|
||||
void onRtcp(RtcpHeader *sr) {
|
||||
_rtcp_context.onRtcp(sr);
|
||||
}
|
||||
Buffer::Ptr createRtcpRR(uint32_t ssrc) {
|
||||
return _rtcp_context.createRtcpRR(ssrc, getSSRC());
|
||||
}
|
||||
|
||||
@ -1217,9 +1216,7 @@ void WebRtcTransportImp::onRtcp(const char *buf, size_t len) {
|
||||
// 设置rtp时间戳与ntp时间戳的对应关系 [AUTO-TRANSLATED:e92f4749]
|
||||
// Set the correspondence between rtp timestamp and ntp timestamp
|
||||
rtp_chn->setNtpStamp(sr->rtpts, sr->getNtpUnixStampMS());
|
||||
auto rr = rtp_chn->createRtcpRR(sr, track->answer_ssrc_rtp);
|
||||
sendRtcpPacket(rr->data(), rr->size(), true);
|
||||
_rtcp_rr_send_ticker.resetTime();
|
||||
rtp_chn->onRtcp(sr);
|
||||
}
|
||||
} else {
|
||||
WarnL << "未识别的sr rtcp包:" << rtcp->dumpString();
|
||||
@ -1236,9 +1233,6 @@ void WebRtcTransportImp::onRtcp(const char *buf, size_t len) {
|
||||
if (it != _ssrc_to_track.end()) {
|
||||
auto &track = it->second;
|
||||
track->rtcp_context_send->onRtcp(rtcp);
|
||||
auto sr = track->rtcp_context_send->createRtcpSR(track->answer_ssrc_rtp);
|
||||
sendRtcpPacket(sr->data(), sr->size(), true);
|
||||
_rtcp_sr_send_ticker.resetTime();
|
||||
} else {
|
||||
WarnL << "未识别的rr rtcp包:" << rtcp->dumpString();
|
||||
}
|
||||
@ -1351,14 +1345,12 @@ void WebRtcTransportImp::onRtp(const char *buf, size_t len, uint64_t stamp_ms) {
|
||||
|
||||
if (_rtcp_rr_send_ticker.elapsedTime() > 5000) {
|
||||
_rtcp_rr_send_ticker.resetTime();
|
||||
|
||||
auto ssrc = ntohl(rtp->ssrc);
|
||||
auto track_it = _ssrc_to_track.find(ssrc);
|
||||
if (track_it != _ssrc_to_track.end()) {
|
||||
auto &track = track_it->second;
|
||||
for (auto& it : _ssrc_to_track) {
|
||||
auto ssrc = it.first;
|
||||
auto &track = it.second;
|
||||
auto rtp_chn = track->getRtpChannel(ssrc);
|
||||
if (rtp_chn) {
|
||||
auto rr = rtp_chn->createRtcpRR(nullptr, track->answer_ssrc_rtp);
|
||||
auto rr = rtp_chn->createRtcpRR(track->answer_ssrc_rtp);
|
||||
if (rr && rr->size() > 0) {
|
||||
sendRtcpPacket(rr->data(), rr->size(), true);
|
||||
}
|
||||
@ -1505,13 +1497,10 @@ void WebRtcTransportImp::onSendRtp(const RtpPacket::Ptr &rtp, bool flush, bool r
|
||||
sendRtpPacket(rtp->data() + RtpPacket::kRtpTcpHeaderSize, rtp->size() - RtpPacket::kRtpTcpHeaderSize, flush, &ctx);
|
||||
_bytes_usage += rtp->size() - RtpPacket::kRtpTcpHeaderSize;
|
||||
|
||||
if (_rtcp_sr_send_ticker.elapsedTime() > 5000) {
|
||||
_rtcp_sr_send_ticker.resetTime();
|
||||
if (track->rtcp_context_send) {
|
||||
auto sr = track->rtcp_context_send->createRtcpSR(track->answer_ssrc_rtp);
|
||||
if (sr && sr->size() > 0) {
|
||||
sendRtcpPacket(sr->data(), sr->size(), true);
|
||||
}
|
||||
if (track->rtcp_context_send) {
|
||||
auto sr = track->rtcp_context_send->createRtcpSR(track->answer_ssrc_rtp);
|
||||
if (sr && sr->size() > 0) {
|
||||
sendRtcpPacket(sr->data(), sr->size(), true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -163,6 +163,8 @@ public:
|
||||
float getTimeOutSec();
|
||||
|
||||
void getTransportInfo(const std::function<void(Json::Value)> &callback) const;
|
||||
size_t getRecvSpeed() const { return _ice_agent ? _ice_agent->getRecvSpeed() : 0; }
|
||||
size_t getRecvTotalBytes() const { return _ice_agent ? _ice_agent->getRecvTotalBytes() : 0; }
|
||||
|
||||
void setOnShutdown(std::function<void(const toolkit::SockException &ex)> cb);
|
||||
|
||||
@ -378,7 +380,6 @@ private:
|
||||
// pli rtcp timer
|
||||
toolkit::Ticker _pli_ticker;
|
||||
|
||||
toolkit::Ticker _rtcp_sr_send_ticker;
|
||||
toolkit::Ticker _rtcp_rr_send_ticker;
|
||||
|
||||
// twcc rtcp发送上下文对象 [AUTO-TRANSLATED:aef6476a]
|
||||
|
||||
Loading…
Reference in New Issue
Block a user