mirror of
https://github.com/kunkundi/crossdesk.git
synced 2025-10-26 20:25:34 +08:00
[feat] use an adapter layer to convert SystemClock into webrtc Clock
This commit is contained in:
@@ -10,47 +10,47 @@
|
|||||||
#define NV12_BUFFER_SIZE (1280 * 720 * 3 / 2)
|
#define NV12_BUFFER_SIZE (1280 * 720 * 3 / 2)
|
||||||
#define RTCP_RR_INTERVAL 1000
|
#define RTCP_RR_INTERVAL 1000
|
||||||
|
|
||||||
RtpVideoReceiver::RtpVideoReceiver(std::shared_ptr<Clock> clock)
|
RtpVideoReceiver::RtpVideoReceiver(std::shared_ptr<SystemClock> clock)
|
||||||
: feedback_ssrc_(GenerateUniqueSsrc()),
|
: feedback_ssrc_(GenerateUniqueSsrc()),
|
||||||
active_remb_module_(nullptr),
|
active_remb_module_(nullptr),
|
||||||
receive_side_congestion_controller_(
|
receive_side_congestion_controller_(
|
||||||
clock,
|
clock_,
|
||||||
[this](std::vector<std::unique_ptr<RtcpPacket>> packets) {
|
[this](std::vector<std::unique_ptr<RtcpPacket>> packets) {
|
||||||
SendCombinedRtcpPacket(std::move(packets));
|
SendCombinedRtcpPacket(std::move(packets));
|
||||||
},
|
},
|
||||||
[this](int64_t bitrate_bps, std::vector<uint32_t> ssrcs) {
|
[this](int64_t bitrate_bps, std::vector<uint32_t> ssrcs) {
|
||||||
SendRemb(bitrate_bps, ssrcs);
|
SendRemb(bitrate_bps, ssrcs);
|
||||||
}),
|
}),
|
||||||
clock_(clock),
|
|
||||||
rtcp_sender_(std::make_unique<RtcpSender>(
|
rtcp_sender_(std::make_unique<RtcpSender>(
|
||||||
[this](const uint8_t* buffer, size_t size) -> int {
|
[this](const uint8_t* buffer, size_t size) -> int {
|
||||||
return data_send_func_((const char*)buffer, size);
|
return data_send_func_((const char*)buffer, size);
|
||||||
},
|
},
|
||||||
1200)),
|
1200)),
|
||||||
nack_(std::make_unique<NackRequester>(clock, this, this)) {
|
nack_(std::make_unique<NackRequester>(clock_, this, this)),
|
||||||
|
clock_(webrtc::Clock::GetWebrtcClockShared(clock)) {
|
||||||
SetPeriod(std::chrono::milliseconds(5));
|
SetPeriod(std::chrono::milliseconds(5));
|
||||||
// rtcp_thread_ = std::thread(&RtpVideoReceiver::RtcpThread, this);
|
// rtcp_thread_ = std::thread(&RtpVideoReceiver::RtcpThread, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
RtpVideoReceiver::RtpVideoReceiver(std::shared_ptr<Clock> clock,
|
RtpVideoReceiver::RtpVideoReceiver(std::shared_ptr<SystemClock> clock,
|
||||||
std::shared_ptr<IOStatistics> io_statistics)
|
std::shared_ptr<IOStatistics> io_statistics)
|
||||||
: io_statistics_(io_statistics),
|
: io_statistics_(io_statistics),
|
||||||
feedback_ssrc_(GenerateUniqueSsrc()),
|
feedback_ssrc_(GenerateUniqueSsrc()),
|
||||||
receive_side_congestion_controller_(
|
receive_side_congestion_controller_(
|
||||||
clock,
|
clock_,
|
||||||
[this](std::vector<std::unique_ptr<RtcpPacket>> packets) {
|
[this](std::vector<std::unique_ptr<RtcpPacket>> packets) {
|
||||||
SendCombinedRtcpPacket(std::move(packets));
|
SendCombinedRtcpPacket(std::move(packets));
|
||||||
},
|
},
|
||||||
[this](int64_t bitrate_bps, std::vector<uint32_t> ssrcs) {
|
[this](int64_t bitrate_bps, std::vector<uint32_t> ssrcs) {
|
||||||
SendRemb(bitrate_bps, ssrcs);
|
SendRemb(bitrate_bps, ssrcs);
|
||||||
}),
|
}),
|
||||||
clock_(clock),
|
|
||||||
rtcp_sender_(std::make_unique<RtcpSender>(
|
rtcp_sender_(std::make_unique<RtcpSender>(
|
||||||
[this](const uint8_t* buffer, size_t size) -> int {
|
[this](const uint8_t* buffer, size_t size) -> int {
|
||||||
return data_send_func_((const char*)buffer, size);
|
return data_send_func_((const char*)buffer, size);
|
||||||
},
|
},
|
||||||
1200)),
|
1200)),
|
||||||
nack_(std::make_unique<NackRequester>(clock, this, this)) {
|
nack_(std::make_unique<NackRequester>(clock_, this, this)),
|
||||||
|
clock_(webrtc::Clock::GetWebrtcClockShared(clock)) {
|
||||||
SetPeriod(std::chrono::milliseconds(5));
|
SetPeriod(std::chrono::milliseconds(5));
|
||||||
// rtcp_thread_ = std::thread(&RtpVideoReceiver::RtcpThread, this);
|
// rtcp_thread_ = std::thread(&RtpVideoReceiver::RtcpThread, this);
|
||||||
|
|
||||||
|
|||||||
@@ -7,6 +7,7 @@
|
|||||||
#include <set>
|
#include <set>
|
||||||
|
|
||||||
#include "api/clock/clock.h"
|
#include "api/clock/clock.h"
|
||||||
|
#include "clock/system_clock.h"
|
||||||
#include "fec_decoder.h"
|
#include "fec_decoder.h"
|
||||||
#include "io_statistics.h"
|
#include "io_statistics.h"
|
||||||
#include "nack_requester.h"
|
#include "nack_requester.h"
|
||||||
@@ -28,8 +29,8 @@ class RtpVideoReceiver : public ThreadBase,
|
|||||||
public KeyFrameRequestSender,
|
public KeyFrameRequestSender,
|
||||||
public NackSender {
|
public NackSender {
|
||||||
public:
|
public:
|
||||||
RtpVideoReceiver(std::shared_ptr<Clock> clock);
|
RtpVideoReceiver(std::shared_ptr<SystemClock> clock);
|
||||||
RtpVideoReceiver(std::shared_ptr<Clock> clock,
|
RtpVideoReceiver(std::shared_ptr<SystemClock> clock,
|
||||||
std::shared_ptr<IOStatistics> io_statistics);
|
std::shared_ptr<IOStatistics> io_statistics);
|
||||||
virtual ~RtpVideoReceiver();
|
virtual ~RtpVideoReceiver();
|
||||||
|
|
||||||
@@ -113,7 +114,7 @@ class RtpVideoReceiver : public ThreadBase,
|
|||||||
int rtcp_tcc_interval_ms_ = 200;
|
int rtcp_tcc_interval_ms_ = 200;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::shared_ptr<Clock> clock_;
|
std::shared_ptr<webrtc::Clock> clock_;
|
||||||
ReceiveSideCongestionController receive_side_congestion_controller_;
|
ReceiveSideCongestionController receive_side_congestion_controller_;
|
||||||
RtcpFeedbackSenderInterface* active_remb_module_;
|
RtcpFeedbackSenderInterface* active_remb_module_;
|
||||||
uint32_t feedback_ssrc_ = 0;
|
uint32_t feedback_ssrc_ = 0;
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
#include <chrono>
|
#include <chrono>
|
||||||
|
|
||||||
|
#include "api/clock/clock.h"
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
#include "log.h"
|
#include "log.h"
|
||||||
|
|
||||||
@@ -11,12 +12,12 @@
|
|||||||
|
|
||||||
RtpVideoSender::RtpVideoSender() {}
|
RtpVideoSender::RtpVideoSender() {}
|
||||||
|
|
||||||
RtpVideoSender::RtpVideoSender(std::shared_ptr<webrtc::Clock> clock,
|
RtpVideoSender::RtpVideoSender(std::shared_ptr<SystemClock> clock,
|
||||||
std::shared_ptr<IOStatistics> io_statistics)
|
std::shared_ptr<IOStatistics> io_statistics)
|
||||||
: ssrc_(GenerateUniqueSsrc()),
|
: ssrc_(GenerateUniqueSsrc()),
|
||||||
clock_(clock),
|
|
||||||
io_statistics_(io_statistics),
|
io_statistics_(io_statistics),
|
||||||
rtp_packet_history_(std::make_unique<RtpPacketHistory>(clock)) {
|
rtp_packet_history_(std::make_unique<RtpPacketHistory>(clock_)),
|
||||||
|
clock_(webrtc::Clock::GetWebrtcClockShared(clock)) {
|
||||||
SetPeriod(std::chrono::milliseconds(5));
|
SetPeriod(std::chrono::milliseconds(5));
|
||||||
#ifdef SAVE_RTP_SENT_STREAM
|
#ifdef SAVE_RTP_SENT_STREAM
|
||||||
file_rtp_sent_ = fopen("rtp_sent_stream.h264", "w+b");
|
file_rtp_sent_ = fopen("rtp_sent_stream.h264", "w+b");
|
||||||
|
|||||||
@@ -3,6 +3,8 @@
|
|||||||
|
|
||||||
#include <functional>
|
#include <functional>
|
||||||
|
|
||||||
|
#include "api/clock/clock.h"
|
||||||
|
#include "clock/system_clock.h"
|
||||||
#include "io_statistics.h"
|
#include "io_statistics.h"
|
||||||
#include "ringbuffer.h"
|
#include "ringbuffer.h"
|
||||||
#include "rtp_packet.h"
|
#include "rtp_packet.h"
|
||||||
@@ -15,7 +17,7 @@
|
|||||||
class RtpVideoSender : public ThreadBase {
|
class RtpVideoSender : public ThreadBase {
|
||||||
public:
|
public:
|
||||||
RtpVideoSender();
|
RtpVideoSender();
|
||||||
RtpVideoSender(std::shared_ptr<webrtc::Clock> clock,
|
RtpVideoSender(std::shared_ptr<SystemClock> clock,
|
||||||
std::shared_ptr<IOStatistics> io_statistics);
|
std::shared_ptr<IOStatistics> io_statistics);
|
||||||
virtual ~RtpVideoSender();
|
virtual ~RtpVideoSender();
|
||||||
|
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
VideoChannelReceive::VideoChannelReceive() {}
|
VideoChannelReceive::VideoChannelReceive() {}
|
||||||
|
|
||||||
VideoChannelReceive::VideoChannelReceive(
|
VideoChannelReceive::VideoChannelReceive(
|
||||||
std::shared_ptr<webrtc::Clock> clock, std::shared_ptr<IceAgent> ice_agent,
|
std::shared_ptr<SystemClock> clock, std::shared_ptr<IceAgent> ice_agent,
|
||||||
std::shared_ptr<IOStatistics> ice_io_statistics,
|
std::shared_ptr<IOStatistics> ice_io_statistics,
|
||||||
std::function<void(VideoFrame &)> on_receive_complete_frame)
|
std::function<void(VideoFrame &)> on_receive_complete_frame)
|
||||||
: ice_agent_(ice_agent),
|
: ice_agent_(ice_agent),
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
#ifndef _VIDEO_CHANNEL_RECEIVE_H_
|
#ifndef _VIDEO_CHANNEL_RECEIVE_H_
|
||||||
#define _VIDEO_CHANNEL_RECEIVE_H_
|
#define _VIDEO_CHANNEL_RECEIVE_H_
|
||||||
|
|
||||||
#include "api/clock/clock.h"
|
#include "clock/system_clock.h"
|
||||||
#include "ice_agent.h"
|
#include "ice_agent.h"
|
||||||
#include "rtp_video_receiver.h"
|
#include "rtp_video_receiver.h"
|
||||||
|
|
||||||
@@ -15,7 +15,7 @@ class VideoChannelReceive {
|
|||||||
public:
|
public:
|
||||||
VideoChannelReceive();
|
VideoChannelReceive();
|
||||||
VideoChannelReceive(
|
VideoChannelReceive(
|
||||||
std::shared_ptr<webrtc::Clock> clock, std::shared_ptr<IceAgent> ice_agent,
|
std::shared_ptr<SystemClock> clock, std::shared_ptr<IceAgent> ice_agent,
|
||||||
std::shared_ptr<IOStatistics> ice_io_statistics,
|
std::shared_ptr<IOStatistics> ice_io_statistics,
|
||||||
std::function<void(VideoFrame &)> on_receive_complete_frame);
|
std::function<void(VideoFrame &)> on_receive_complete_frame);
|
||||||
|
|
||||||
@@ -34,7 +34,7 @@ class VideoChannelReceive {
|
|||||||
std::function<void(VideoFrame &)> on_receive_complete_frame_ = nullptr;
|
std::function<void(VideoFrame &)> on_receive_complete_frame_ = nullptr;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::shared_ptr<Clock> clock_;
|
std::shared_ptr<SystemClock> clock_;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
@@ -8,7 +8,7 @@ VideoChannelSend::VideoChannelSend() {}
|
|||||||
VideoChannelSend::~VideoChannelSend() {}
|
VideoChannelSend::~VideoChannelSend() {}
|
||||||
|
|
||||||
VideoChannelSend::VideoChannelSend(
|
VideoChannelSend::VideoChannelSend(
|
||||||
std::shared_ptr<webrtc::Clock> clock, std::shared_ptr<IceAgent> ice_agent,
|
std::shared_ptr<SystemClock> clock, std::shared_ptr<IceAgent> ice_agent,
|
||||||
std::shared_ptr<IOStatistics> ice_io_statistics,
|
std::shared_ptr<IOStatistics> ice_io_statistics,
|
||||||
std::function<void(const webrtc::RtpPacketToSend& packet)>
|
std::function<void(const webrtc::RtpPacketToSend& packet)>
|
||||||
on_sent_packet_func)
|
on_sent_packet_func)
|
||||||
|
|||||||
@@ -7,9 +7,9 @@
|
|||||||
#ifndef _VIDEO_CHANNEL_SEND_H_
|
#ifndef _VIDEO_CHANNEL_SEND_H_
|
||||||
#define _VIDEO_CHANNEL_SEND_H_
|
#define _VIDEO_CHANNEL_SEND_H_
|
||||||
|
|
||||||
#include "api/clock/clock.h"
|
|
||||||
#include "api/transport/network_types.h"
|
#include "api/transport/network_types.h"
|
||||||
#include "api/units/timestamp.h"
|
#include "api/units/timestamp.h"
|
||||||
|
#include "clock/system_clock.h"
|
||||||
#include "congestion_control.h"
|
#include "congestion_control.h"
|
||||||
#include "congestion_control_feedback.h"
|
#include "congestion_control_feedback.h"
|
||||||
#include "ice_agent.h"
|
#include "ice_agent.h"
|
||||||
@@ -20,7 +20,7 @@
|
|||||||
class VideoChannelSend {
|
class VideoChannelSend {
|
||||||
public:
|
public:
|
||||||
VideoChannelSend();
|
VideoChannelSend();
|
||||||
VideoChannelSend(std::shared_ptr<webrtc::Clock> clock,
|
VideoChannelSend(std::shared_ptr<SystemClock> clock,
|
||||||
std::shared_ptr<IceAgent> ice_agent,
|
std::shared_ptr<IceAgent> ice_agent,
|
||||||
std::shared_ptr<IOStatistics> ice_io_statistics,
|
std::shared_ptr<IOStatistics> ice_io_statistics,
|
||||||
std::function<void(const webrtc::RtpPacketToSend& packet)>
|
std::function<void(const webrtc::RtpPacketToSend& packet)>
|
||||||
@@ -52,7 +52,7 @@ class VideoChannelSend {
|
|||||||
on_sent_packet_func_ = nullptr;
|
on_sent_packet_func_ = nullptr;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::shared_ptr<Clock> clock_;
|
std::shared_ptr<SystemClock> clock_;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
@@ -43,25 +43,51 @@ NtpTime TimeMicrosToNtp(int64_t time_us) {
|
|||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
class RealTimeClock : public Clock {
|
class WebrtcClock : public Clock {
|
||||||
public:
|
public:
|
||||||
RealTimeClock() = default;
|
WebrtcClock(std::shared_ptr<SystemClock> system_clock)
|
||||||
|
: system_clock_(system_clock) {}
|
||||||
|
WebrtcClock() = delete;
|
||||||
|
|
||||||
Timestamp CurrentTime() override {
|
Timestamp CurrentTime() override {
|
||||||
return Timestamp::Micros(rtc::TimeMicros());
|
return Timestamp::Micros(system_clock_->CurrentTimeUs());
|
||||||
}
|
}
|
||||||
|
|
||||||
NtpTime ConvertTimestampToNtpTime(Timestamp timestamp) override {
|
NtpTime ConvertTimestampToNtpTime(Timestamp timestamp) override {
|
||||||
return TimeMicrosToNtp(timestamp.us());
|
int64_t time_us = timestamp.us();
|
||||||
|
constexpr int64_t kNtpJan1970Sec = 2208988800;
|
||||||
|
int64_t clock_time = system_clock_->CurrentTimeUs();
|
||||||
|
int64_t utc_time = system_clock_->CurrentUtcTimeUs();
|
||||||
|
static int64_t ntp_offset_us =
|
||||||
|
utc_time - clock_time + kNtpJan1970Sec * rtc::kNumMicrosecsPerSec;
|
||||||
|
|
||||||
|
int64_t time_ntp_us = time_us + ntp_offset_us;
|
||||||
|
|
||||||
|
// Convert seconds to uint32 through uint64 for a well-defined cast.
|
||||||
|
// A wrap around, which will happen in 2036, is expected for NTP time.
|
||||||
|
uint32_t ntp_seconds =
|
||||||
|
static_cast<uint64_t>(time_ntp_us / rtc::kNumMicrosecsPerSec);
|
||||||
|
|
||||||
|
// Scale fractions of the second to NTP resolution.
|
||||||
|
constexpr int64_t kNtpFractionsInSecond = 1LL << 32;
|
||||||
|
int64_t us_fractions = time_ntp_us % rtc::kNumMicrosecsPerSec;
|
||||||
|
uint32_t ntp_fractions =
|
||||||
|
us_fractions * kNtpFractionsInSecond / rtc::kNumMicrosecsPerSec;
|
||||||
|
|
||||||
|
return NtpTime(ntp_seconds, ntp_fractions);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::shared_ptr<SystemClock> system_clock_;
|
||||||
};
|
};
|
||||||
|
|
||||||
Clock* Clock::GetRealTimeClock() {
|
Clock* Clock::GetWebrtcClock(std::shared_ptr<SystemClock> system_clock) {
|
||||||
static Clock* const clock = new RealTimeClock();
|
static Clock* const clock = new WebrtcClock(system_clock);
|
||||||
return clock;
|
return clock;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::shared_ptr<Clock> Clock::GetRealTimeClockShared() {
|
std::shared_ptr<Clock> Clock::GetWebrtcClockShared(
|
||||||
return std::make_shared<RealTimeClock>();
|
std::shared_ptr<SystemClock> system_clock) {
|
||||||
|
return std::make_shared<WebrtcClock>(system_clock);
|
||||||
}
|
}
|
||||||
} // namespace webrtc
|
} // namespace webrtc
|
||||||
@@ -18,6 +18,7 @@
|
|||||||
|
|
||||||
#include "api/ntp/ntp_time.h"
|
#include "api/ntp/ntp_time.h"
|
||||||
#include "api/units/timestamp.h"
|
#include "api/units/timestamp.h"
|
||||||
|
#include "clock/system_clock.h"
|
||||||
|
|
||||||
namespace webrtc {
|
namespace webrtc {
|
||||||
|
|
||||||
@@ -65,8 +66,9 @@ class Clock {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Returns an instance of the real-time system clock implementation.
|
// Returns an instance of the real-time system clock implementation.
|
||||||
static Clock* GetRealTimeClock();
|
static Clock* GetWebrtcClock(std::shared_ptr<SystemClock> system_clock);
|
||||||
static std::shared_ptr<Clock> GetRealTimeClockShared();
|
static std::shared_ptr<Clock> GetWebrtcClockShared(
|
||||||
|
std::shared_ptr<SystemClock> system_clock);
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace webrtc
|
} // namespace webrtc
|
||||||
|
|||||||
@@ -69,15 +69,15 @@ int64_t SystemClock::CurrentNtpTime() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
int64_t SystemClock::CurrentNtpTimeMs() {
|
int64_t SystemClock::CurrentNtpTimeMs() {
|
||||||
return CurrentTimeMs() + kNtpEpochOffset * 1000LL;
|
return CurrentUtcTimeMs() + kNtpEpochOffset * 1000LL;
|
||||||
}
|
}
|
||||||
|
|
||||||
int64_t SystemClock::CurrentNtpTimeUs() {
|
int64_t SystemClock::CurrentNtpTimeUs() {
|
||||||
return CurrentTimeUs() + kNtpEpochOffset * 1000000LL;
|
return CurrentUtcTimeUs() + kNtpEpochOffset * 1000000LL;
|
||||||
}
|
}
|
||||||
|
|
||||||
int64_t SystemClock::CurrentNtpTimeNs() {
|
int64_t SystemClock::CurrentNtpTimeNs() {
|
||||||
return CurrentTimeNs() + kNtpEpochOffset * 1000000000LL;
|
return CurrentUtcTimeNs() + kNtpEpochOffset * 1000000000LL;
|
||||||
}
|
}
|
||||||
|
|
||||||
int64_t SystemClock::CurrentUtcTimeNs() {
|
int64_t SystemClock::CurrentUtcTimeNs() {
|
||||||
@@ -111,12 +111,3 @@ int64_t SystemClock::CurrentUtcTimeMs() {
|
|||||||
int64_t SystemClock::CurrentUtcTime() {
|
int64_t SystemClock::CurrentUtcTime() {
|
||||||
return CurrentUtcTimeNs() / 1000000000LL;
|
return CurrentUtcTimeNs() / 1000000000LL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static SystemClock* GetSystemClock() {
|
|
||||||
static SystemClock* const clock = new SystemClock();
|
|
||||||
return clock;
|
|
||||||
}
|
|
||||||
|
|
||||||
static std::shared_ptr<SystemClock> GetSystemClockShared() {
|
|
||||||
return std::make_shared<SystemClock>();
|
|
||||||
}
|
|
||||||
@@ -33,7 +33,4 @@ class SystemClock {
|
|||||||
int64_t CurrentUtcTimeNs();
|
int64_t CurrentUtcTimeNs();
|
||||||
};
|
};
|
||||||
|
|
||||||
static SystemClock* GetSystemClock();
|
|
||||||
static std::shared_ptr<SystemClock> GetSystemClockShared();
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
@@ -184,6 +184,7 @@ int PeerConnection::Init(PeerConnectionParams params,
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
clock_ = std::make_shared<SystemClock>();
|
||||||
ws_transport_ = std::make_shared<WsClient>(on_receive_ws_msg_, on_ws_status_);
|
ws_transport_ = std::make_shared<WsClient>(on_receive_ws_msg_, on_ws_status_);
|
||||||
uri_ = "ws://" + cfg_signal_server_ip_ + ":" + cfg_signal_server_port_;
|
uri_ = "ws://" + cfg_signal_server_ip_ + ":" + cfg_signal_server_port_;
|
||||||
if (ws_transport_) {
|
if (ws_transport_) {
|
||||||
@@ -595,8 +596,8 @@ void PeerConnection::ProcessIceWorkMsg(const IceWorkMsg &msg) {
|
|||||||
|
|
||||||
for (auto &remote_user_id : user_id_list) {
|
for (auto &remote_user_id : user_id_list) {
|
||||||
ice_transport_list_[remote_user_id] = std::make_shared<IceTransport>(
|
ice_transport_list_[remote_user_id] = std::make_shared<IceTransport>(
|
||||||
true, transmission_id, user_id_, remote_user_id, ws_transport_,
|
clock_, true, transmission_id, user_id_, remote_user_id,
|
||||||
on_ice_status_change_, user_data_);
|
ws_transport_, on_ice_status_change_, user_data_);
|
||||||
|
|
||||||
ice_transport_list_[remote_user_id]->SetLocalCapabilities(
|
ice_transport_list_[remote_user_id]->SetLocalCapabilities(
|
||||||
hardware_acceleration_, trickle_ice_, reliable_ice_, enable_turn_,
|
hardware_acceleration_, trickle_ice_, reliable_ice_, enable_turn_,
|
||||||
@@ -639,8 +640,8 @@ void PeerConnection::ProcessIceWorkMsg(const IceWorkMsg &msg) {
|
|||||||
ice_transport_list_.find(remote_user_id)) {
|
ice_transport_list_.find(remote_user_id)) {
|
||||||
// Enable TURN for answer peer by default
|
// Enable TURN for answer peer by default
|
||||||
ice_transport_list_[remote_user_id] = std::make_shared<IceTransport>(
|
ice_transport_list_[remote_user_id] = std::make_shared<IceTransport>(
|
||||||
false, transmission_id, user_id_, remote_user_id, ws_transport_,
|
clock_, false, transmission_id, user_id_, remote_user_id,
|
||||||
on_ice_status_change_, user_data_);
|
ws_transport_, on_ice_status_change_, user_data_);
|
||||||
|
|
||||||
ice_transport_list_[remote_user_id]->SetLocalCapabilities(
|
ice_transport_list_[remote_user_id]->SetLocalCapabilities(
|
||||||
hardware_acceleration_, trickle_ice_, reliable_ice_, enable_turn_,
|
hardware_acceleration_, trickle_ice_, reliable_ice_, enable_turn_,
|
||||||
|
|||||||
@@ -13,6 +13,7 @@
|
|||||||
|
|
||||||
#include "audio_decoder.h"
|
#include "audio_decoder.h"
|
||||||
#include "audio_encoder.h"
|
#include "audio_encoder.h"
|
||||||
|
#include "clock/system_clock.h"
|
||||||
#include "ice_transport.h"
|
#include "ice_transport.h"
|
||||||
#include "video_decoder_factory.h"
|
#include "video_decoder_factory.h"
|
||||||
#include "video_encoder_factory.h"
|
#include "video_encoder_factory.h"
|
||||||
@@ -152,6 +153,7 @@ class PeerConnection {
|
|||||||
std::vector<int> audio_payload_types_ = {rtp::PAYLOAD_TYPE::OPUS};
|
std::vector<int> audio_payload_types_ = {rtp::PAYLOAD_TYPE::OPUS};
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
std::shared_ptr<SystemClock> clock_ = nullptr;
|
||||||
std::shared_ptr<WsClient> ws_transport_ = nullptr;
|
std::shared_ptr<WsClient> ws_transport_ = nullptr;
|
||||||
std::function<void(const std::string &)> on_receive_ws_msg_ = nullptr;
|
std::function<void(const std::string &)> on_receive_ws_msg_ = nullptr;
|
||||||
std::function<void(WsStatus)> on_ws_status_ = nullptr;
|
std::function<void(WsStatus)> on_ws_status_ = nullptr;
|
||||||
|
|||||||
@@ -11,11 +11,13 @@
|
|||||||
using nlohmann::json;
|
using nlohmann::json;
|
||||||
|
|
||||||
IceTransport::IceTransport(
|
IceTransport::IceTransport(
|
||||||
bool offer_peer, std::string &transmission_id, std::string &user_id,
|
std::shared_ptr<SystemClock> clock, bool offer_peer,
|
||||||
|
std::string &transmission_id, std::string &user_id,
|
||||||
std::string &remote_user_id, std::shared_ptr<WsClient> ice_ws_transmission,
|
std::string &remote_user_id, std::shared_ptr<WsClient> ice_ws_transmission,
|
||||||
std::function<void(std::string, const std::string &)> on_ice_status_change,
|
std::function<void(std::string, const std::string &)> on_ice_status_change,
|
||||||
void *user_data)
|
void *user_data)
|
||||||
: offer_peer_(offer_peer),
|
: clock_(clock),
|
||||||
|
offer_peer_(offer_peer),
|
||||||
transmission_id_(transmission_id),
|
transmission_id_(transmission_id),
|
||||||
user_id_(user_id),
|
user_id_(user_id),
|
||||||
remote_user_id_(remote_user_id),
|
remote_user_id_(remote_user_id),
|
||||||
@@ -46,7 +48,7 @@ int IceTransport::InitIceTransmission(
|
|||||||
std::string &stun_ip, int stun_port, std::string &turn_ip, int turn_port,
|
std::string &stun_ip, int stun_port, std::string &turn_ip, int turn_port,
|
||||||
std::string &turn_username, std::string &turn_password,
|
std::string &turn_username, std::string &turn_password,
|
||||||
rtp::PAYLOAD_TYPE video_codec_payload_type) {
|
rtp::PAYLOAD_TYPE video_codec_payload_type) {
|
||||||
ice_transport_controller_ = std::make_shared<IceTransportController>();
|
ice_transport_controller_ = std::make_shared<IceTransportController>(clock_);
|
||||||
ice_agent_ = std::make_unique<IceAgent>(
|
ice_agent_ = std::make_unique<IceAgent>(
|
||||||
offer_peer_, use_trickle_ice_, use_reliable_ice_, enable_turn_,
|
offer_peer_, use_trickle_ice_, use_reliable_ice_, enable_turn_,
|
||||||
force_turn_, stun_ip, stun_port, turn_ip, turn_port, turn_username,
|
force_turn_, stun_ip, stun_port, turn_ip, turn_port, turn_username,
|
||||||
|
|||||||
@@ -9,6 +9,7 @@
|
|||||||
|
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
|
||||||
|
#include "clock/system_clock.h"
|
||||||
#include "ice_agent.h"
|
#include "ice_agent.h"
|
||||||
#include "ice_transport_controller.h"
|
#include "ice_transport_controller.h"
|
||||||
#include "io_statistics.h"
|
#include "io_statistics.h"
|
||||||
@@ -30,8 +31,9 @@ class IceTransport {
|
|||||||
enum TraversalType { TP2P = 0, TRelay = 1, TUnknown = 2 };
|
enum TraversalType { TP2P = 0, TRelay = 1, TUnknown = 2 };
|
||||||
|
|
||||||
public:
|
public:
|
||||||
IceTransport(bool offer_peer, std::string &transmission_id,
|
IceTransport(std::shared_ptr<SystemClock> clock, bool offer_peer,
|
||||||
std::string &user_id, std::string &remote_user_id,
|
std::string &transmission_id, std::string &user_id,
|
||||||
|
std::string &remote_user_id,
|
||||||
std::shared_ptr<WsClient> ice_ws_transmission,
|
std::shared_ptr<WsClient> ice_ws_transmission,
|
||||||
std::function<void(std::string, const std::string &)>
|
std::function<void(std::string, const std::string &)>
|
||||||
on_ice_status_change,
|
on_ice_status_change,
|
||||||
@@ -160,6 +162,7 @@ class IceTransport {
|
|||||||
void *user_data_ = nullptr;
|
void *user_data_ = nullptr;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
std::shared_ptr<SystemClock> clock_;
|
||||||
std::shared_ptr<IceAgent> ice_agent_ = nullptr;
|
std::shared_ptr<IceAgent> ice_agent_ = nullptr;
|
||||||
bool is_closed_ = false;
|
bool is_closed_ = false;
|
||||||
std::shared_ptr<WsClient> ice_ws_transport_ = nullptr;
|
std::shared_ptr<WsClient> ice_ws_transport_ = nullptr;
|
||||||
|
|||||||
@@ -4,13 +4,14 @@
|
|||||||
#include "nvcodec_api.h"
|
#include "nvcodec_api.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
IceTransportController::IceTransportController()
|
IceTransportController::IceTransportController(
|
||||||
: b_force_i_frame_(true),
|
std::shared_ptr<SystemClock> clock)
|
||||||
|
: clock_(clock),
|
||||||
|
b_force_i_frame_(true),
|
||||||
video_codec_inited_(false),
|
video_codec_inited_(false),
|
||||||
audio_codec_inited_(false),
|
audio_codec_inited_(false),
|
||||||
load_nvcodec_dll_success_(false),
|
load_nvcodec_dll_success_(false),
|
||||||
hardware_acceleration_(false),
|
hardware_acceleration_(false) {}
|
||||||
clock_(webrtc::Clock::GetRealTimeClockShared()) {}
|
|
||||||
|
|
||||||
IceTransportController::~IceTransportController() {
|
IceTransportController::~IceTransportController() {
|
||||||
user_data_ = nullptr;
|
user_data_ = nullptr;
|
||||||
@@ -334,7 +335,7 @@ void IceTransportController::OnCongestionControlFeedback(
|
|||||||
const webrtc::rtcp::CongestionControlFeedback& feedback) {
|
const webrtc::rtcp::CongestionControlFeedback& feedback) {
|
||||||
std::optional<webrtc::TransportPacketsFeedback> feedback_msg =
|
std::optional<webrtc::TransportPacketsFeedback> feedback_msg =
|
||||||
transport_feedback_adapter_.ProcessCongestionControlFeedback(
|
transport_feedback_adapter_.ProcessCongestionControlFeedback(
|
||||||
feedback, clock_->CurrentTime());
|
feedback, Timestamp::Micros(clock_->CurrentTimeUs()));
|
||||||
if (feedback_msg) {
|
if (feedback_msg) {
|
||||||
HandleTransportPacketsFeedback(*feedback_msg);
|
HandleTransportPacketsFeedback(*feedback_msg);
|
||||||
}
|
}
|
||||||
@@ -353,13 +354,13 @@ void IceTransportController::OnSentRtpPacket(
|
|||||||
webrtc::PacedPacketInfo pacing_info;
|
webrtc::PacedPacketInfo pacing_info;
|
||||||
size_t transport_overhead_bytes_per_packet_ = 0;
|
size_t transport_overhead_bytes_per_packet_ = 0;
|
||||||
webrtc::Timestamp creation_time =
|
webrtc::Timestamp creation_time =
|
||||||
webrtc::Timestamp::Millis(clock_->TimeInMilliseconds());
|
webrtc::Timestamp::Millis(clock_->CurrentTimeMs());
|
||||||
transport_feedback_adapter_.AddPacket(
|
transport_feedback_adapter_.AddPacket(
|
||||||
packet, pacing_info, transport_overhead_bytes_per_packet_, creation_time);
|
packet, pacing_info, transport_overhead_bytes_per_packet_, creation_time);
|
||||||
|
|
||||||
rtc::SentPacket sent_packet;
|
rtc::SentPacket sent_packet;
|
||||||
sent_packet.packet_id = packet.transport_sequence_number().value();
|
sent_packet.packet_id = packet.transport_sequence_number().value();
|
||||||
sent_packet.send_time_ms = clock_->TimeInMilliseconds();
|
sent_packet.send_time_ms = clock_->CurrentTimeMs();
|
||||||
sent_packet.info.included_in_feedback = true;
|
sent_packet.info.included_in_feedback = true;
|
||||||
sent_packet.info.included_in_allocation = true;
|
sent_packet.info.included_in_allocation = true;
|
||||||
sent_packet.info.packet_size_bytes = packet.size();
|
sent_packet.info.packet_size_bytes = packet.size();
|
||||||
|
|||||||
@@ -14,6 +14,7 @@
|
|||||||
#include "audio_channel_send.h"
|
#include "audio_channel_send.h"
|
||||||
#include "audio_decoder.h"
|
#include "audio_decoder.h"
|
||||||
#include "audio_encoder.h"
|
#include "audio_encoder.h"
|
||||||
|
#include "clock/system_clock.h"
|
||||||
#include "congestion_control.h"
|
#include "congestion_control.h"
|
||||||
#include "congestion_control_feedback.h"
|
#include "congestion_control_feedback.h"
|
||||||
#include "data_channel_receive.h"
|
#include "data_channel_receive.h"
|
||||||
@@ -35,7 +36,7 @@ typedef void (*OnReceiveData)(const char *, size_t, const char *, const size_t,
|
|||||||
class IceTransportController
|
class IceTransportController
|
||||||
: public std::enable_shared_from_this<IceTransportController> {
|
: public std::enable_shared_from_this<IceTransportController> {
|
||||||
public:
|
public:
|
||||||
IceTransportController();
|
IceTransportController(std::shared_ptr<SystemClock> clock);
|
||||||
~IceTransportController();
|
~IceTransportController();
|
||||||
|
|
||||||
public:
|
public:
|
||||||
@@ -97,7 +98,7 @@ class IceTransportController
|
|||||||
void *user_data_ = nullptr;
|
void *user_data_ = nullptr;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::shared_ptr<Clock> clock_;
|
std::shared_ptr<SystemClock> clock_;
|
||||||
webrtc::TransportFeedbackAdapter transport_feedback_adapter_;
|
webrtc::TransportFeedbackAdapter transport_feedback_adapter_;
|
||||||
std::unique_ptr<CongestionControl> controller_;
|
std::unique_ptr<CongestionControl> controller_;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user