40 #include <api/peer_connection_interface.h> 41 #include <rtc_base/strings/json.h> 48 #include <unordered_map> 55 namespace visualization {
56 namespace webrtc_server {
93 class VideoSink :
public rtc::VideoSinkInterface<webrtc::VideoFrame> {
95 VideoSink(webrtc::VideoTrackInterface* track) : track_(track) {
96 track_->AddOrUpdateSink(
this, rtc::VideoSinkWants());
98 virtual ~VideoSink() { track_->RemoveSink(
this); }
101 virtual void OnFrame(
const webrtc::VideoFrame& video_frame) {
102 rtc::scoped_refptr<webrtc::I420BufferInterface> buffer(
103 video_frame.video_frame_buffer()->ToI420());
105 buffer->height(), buffer->width());
109 rtc::scoped_refptr<webrtc::VideoTrackInterface> track_;
112 class SetSessionDescriptionObserver
113 :
public webrtc::SetSessionDescriptionObserver {
115 static SetSessionDescriptionObserver* Create(
116 webrtc::PeerConnectionInterface* pc,
117 std::promise<const webrtc::SessionDescriptionInterface*>&
119 return new rtc::RefCountedObject<SetSessionDescriptionObserver>(
122 virtual void OnSuccess() {
124 if (pc_->local_description()) {
125 promise_.set_value(pc_->local_description());
126 pc_->local_description()->ToString(&sdp);
127 }
else if (pc_->remote_description()) {
128 promise_.set_value(pc_->remote_description());
129 pc_->remote_description()->ToString(&sdp);
132 virtual void OnFailure(webrtc::RTCError error) {
134 promise_.set_value(
nullptr);
138 SetSessionDescriptionObserver(
139 webrtc::PeerConnectionInterface* pc,
140 std::promise<const webrtc::SessionDescriptionInterface*>&
142 : pc_(pc), promise_(promise){};
145 webrtc::PeerConnectionInterface* pc_;
146 std::promise<const webrtc::SessionDescriptionInterface*>& promise_;
149 class CreateSessionDescriptionObserver
150 :
public webrtc::CreateSessionDescriptionObserver {
152 static CreateSessionDescriptionObserver* Create(
153 webrtc::PeerConnectionInterface* pc,
154 std::promise<const webrtc::SessionDescriptionInterface*>&
156 return new rtc::RefCountedObject<CreateSessionDescriptionObserver>(
159 virtual void OnSuccess(webrtc::SessionDescriptionInterface* desc) {
161 desc->ToString(&sdp);
162 pc_->SetLocalDescription(
163 SetSessionDescriptionObserver::Create(pc_, promise_), desc);
165 virtual void OnFailure(webrtc::RTCError error) {
167 promise_.set_value(
nullptr);
171 CreateSessionDescriptionObserver(
172 webrtc::PeerConnectionInterface* pc,
173 std::promise<const webrtc::SessionDescriptionInterface*>&
175 : pc_(pc), promise_(promise){};
178 webrtc::PeerConnectionInterface* pc_;
179 std::promise<const webrtc::SessionDescriptionInterface*>& promise_;
182 class PeerConnectionStatsCollectorCallback
183 :
public webrtc::RTCStatsCollectorCallback {
185 PeerConnectionStatsCollectorCallback() {}
186 void clearReport() { report_.clear(); }
187 Json::Value getReport() {
return report_; }
190 virtual void OnStatsDelivered(
191 const rtc::scoped_refptr<const webrtc::RTCStatsReport>&
193 for (
const webrtc::RTCStats& stats : *report) {
194 Json::Value stats_members;
195 for (
const webrtc::RTCStatsMemberInterface* member :
197 stats_members[member->name()] = member->ValueToString();
199 report_[stats.id()] = stats_members;
206 class DataChannelObserver :
public webrtc::DataChannelObserver {
210 rtc::scoped_refptr<webrtc::DataChannelInterface> data_channel,
211 const std::string& peerid)
212 : peer_connection_manager_(peer_connection_manager),
213 data_channel_(data_channel),
215 data_channel_->RegisterObserver(
this);
217 virtual ~DataChannelObserver() { data_channel_->UnregisterObserver(); }
220 virtual void OnStateChange() {
222 const std::string label = data_channel_->label();
223 const std::string state =
224 webrtc::DataChannelInterface::DataStateString(
225 data_channel_->state());
227 "DataChannelObserver::OnStateChange label: {}, state: {}, " 229 label, state, peerid_);
230 std::string msg(label +
" " + state);
231 webrtc::DataBuffer buffer(msg);
232 data_channel_->Send(buffer);
237 if (label ==
"ClientDataChannel" && state ==
"open") {
239 std::lock_guard<std::mutex> mutex_lock(
240 peer_connection_manager_
242 peer_connection_manager_->peerid_data_channel_ready_.insert(
245 peer_connection_manager_->SendInitFramesToPeer(peerid_);
247 if (label ==
"ClientDataChannel" &&
248 (state ==
"closed" || state ==
"closing")) {
249 std::lock_guard<std::mutex> mutex_lock(
250 peer_connection_manager_->peerid_data_channel_mutex_);
251 peer_connection_manager_->peerid_data_channel_ready_.erase(
255 virtual void OnMessage(
const webrtc::DataBuffer& buffer) {
256 std::string msg((
const char*)buffer.data.data(),
259 data_channel_->label(), msg);
263 if (!reply.empty()) {
264 webrtc::DataBuffer buffer(reply);
265 data_channel_->Send(buffer);
271 rtc::scoped_refptr<webrtc::DataChannelInterface> data_channel_;
272 const std::string peerid_;
275 class PeerConnectionObserver :
public webrtc::PeerConnectionObserver {
277 PeerConnectionObserver(
279 const std::string& peerid,
280 const webrtc::PeerConnectionInterface::RTCConfiguration& config,
281 std::unique_ptr<cricket::PortAllocator> port_allocator)
282 : peer_connection_manager_(peer_connection_manager),
284 local_channel_(
nullptr),
285 remote_channel_(
nullptr),
286 ice_candidate_list_(Json::arrayValue),
288 pc_ = peer_connection_manager_->peer_connection_factory_
289 ->CreatePeerConnection(config,
290 std::move(port_allocator),
294 rtc::scoped_refptr<webrtc::DataChannelInterface> channel =
295 pc_->CreateDataChannel(
"ServerDataChannel",
nullptr);
296 local_channel_ =
new DataChannelObserver(
297 peer_connection_manager_, channel, peerid_);
300 stats_callback_ =
new rtc::RefCountedObject<
301 PeerConnectionStatsCollectorCallback>();
304 virtual ~PeerConnectionObserver() {
305 delete local_channel_;
306 delete remote_channel_;
316 Json::Value GetStats() {
317 stats_callback_->clearReport();
318 pc_->GetStats(stats_callback_);
320 while ((stats_callback_->getReport().empty()) && (--count > 0)) {
321 std::this_thread::sleep_for(std::chrono::milliseconds(1000));
323 return Json::Value(stats_callback_->getReport());
326 rtc::scoped_refptr<webrtc::PeerConnectionInterface>
332 virtual void OnAddStream(
333 rtc::scoped_refptr<webrtc::MediaStreamInterface> stream) {
336 webrtc::VideoTrackVector videoTracks = stream->GetVideoTracks();
337 if (videoTracks.size() > 0) {
338 video_sink_.reset(
new VideoSink(videoTracks.at(0)));
341 virtual void OnRemoveStream(
342 rtc::scoped_refptr<webrtc::MediaStreamInterface> stream) {
345 virtual void OnDataChannel(
346 rtc::scoped_refptr<webrtc::DataChannelInterface> channel) {
348 "PeerConnectionObserver::OnDataChannel peerid: {}",
350 remote_channel_ =
new DataChannelObserver(peer_connection_manager_,
353 virtual void OnRenegotiationNeeded() {
354 std::lock_guard<std::mutex> mutex_lock(
355 peer_connection_manager_->peerid_data_channel_mutex_);
356 peer_connection_manager_->peerid_data_channel_ready_.erase(peerid_);
358 "PeerConnectionObserver::OnRenegotiationNeeded peerid: {}",
361 virtual void OnIceCandidate(
362 const webrtc::IceCandidateInterface* candidate);
364 virtual void OnSignalingChange(
365 webrtc::PeerConnectionInterface::SignalingState state) {
368 virtual void OnIceConnectionChange(
369 webrtc::PeerConnectionInterface::IceConnectionState state) {
371 webrtc::PeerConnectionInterface::kIceConnectionFailed) ||
373 webrtc::PeerConnectionInterface::kIceConnectionClosed)) {
374 ice_candidate_list_.clear();
376 std::thread([
this]() {
377 peer_connection_manager_->HangUp(peerid_);
383 virtual void OnIceGatheringChange(
384 webrtc::PeerConnectionInterface::IceGatheringState) {}
388 const std::string peerid_;
389 rtc::scoped_refptr<webrtc::PeerConnectionInterface> pc_;
390 DataChannelObserver* local_channel_;
391 DataChannelObserver* remote_channel_;
392 Json::Value ice_candidate_list_;
393 rtc::scoped_refptr<PeerConnectionStatsCollectorCallback>
395 std::unique_ptr<VideoSink> video_sink_;
401 const Json::Value& config,
402 const std::string& publish_filter,
403 const std::string& webrtc_udp_port_range);
407 const std::map<std::string, HttpServerRequestHandler::HttpFunction>
412 const Json::Value& json_message);
414 const Json::Value
HangUp(
const std::string& peerid);
415 const Json::Value
Call(
const std::string& peerid,
416 const std::string& window_uid,
417 const std::string& options,
418 const Json::Value& json_message);
425 void OnFrame(
const std::string& window_uid,
426 const std::shared_ptr<core::Tensor>& im);
430 const std::string& window_uid);
432 bool AddStreams(webrtc::PeerConnectionInterface* peer_connection,
433 const std::string& window_uid,
434 const std::string& options);
436 const std::string& window_uid,
437 const std::map<std::string, std::string>& opts);
440 const std::string& peerid);
444 rtc::scoped_refptr<webrtc::PeerConnectionFactoryInterface>
448 std::unordered_map<std::string, PeerConnectionObserver*>
456 std::unordered_map<std::string,
457 rtc::scoped_refptr<BitmapTrackSourceInterface>>
462 std::unordered_map<std::string, std::set<std::string>>
471 std::map<std::string, HttpServerRequestHandler::HttpFunction>
func_;
std::mutex peerid_data_channel_mutex_
Definition: PeerConnectionManager.h:453
rtc::scoped_refptr< webrtc::PeerConnectionFactoryInterface > peer_connection_factory_
Definition: PeerConnectionManager.h:445
std::map< std::string, HttpServerRequestHandler::HttpFunction > func_
Definition: PeerConnectionManager.h:471
virtual ~PeerConnectionManager()
Definition: PeerConnectionManager.cpp:219
const std::regex publish_filter_
Definition: PeerConnectionManager.h:470
rtc::scoped_refptr< BitmapTrackSourceInterface > GetVideoTrackSource(const std::string &window_uid)
Definition: PeerConnectionManager.cpp:715
const Json::Value GetIceServers()
Definition: PeerConnectionManager.cpp:236
std::mutex peerid_to_connection_mutex_
Definition: PeerConnectionManager.h:450
PeerConnectionObserver * CreatePeerConnection(const std::string &peerid)
Definition: PeerConnectionManager.cpp:541
rtc::scoped_refptr< webrtc::PeerConnectionInterface > GetPeerConnection(const std::string &peerid)
Definition: PeerConnectionManager.cpp:260
rtc::scoped_refptr< BitmapTrackSourceInterface > CreateVideoSource(const std::string &window_uid, const std::map< std::string, std::string > &opts)
Definition: PeerConnectionManager.cpp:582
std::unordered_map< std::string, rtc::scoped_refptr< BitmapTrackSourceInterface > > window_uid_to_track_source_
Definition: PeerConnectionManager.h:458
static std::shared_ptr< WebRTCWindowSystem > GetInstance()
Definition: WebRTCWindowSystem.cpp:130
std::unordered_set< std::string > peerid_data_channel_ready_
Definition: PeerConnectionManager.h:452
const Json::Value AddIceCandidate(const std::string &peerid, const Json::Value &json_message)
Definition: PeerConnectionManager.cpp:270
const Json::Value config_
Definition: PeerConnectionManager.h:469
std::unordered_map< std::string, std::string > peerid_to_window_uid_
Definition: PeerConnectionManager.h:464
Definition: PeerConnectionManager.h:92
const Json::Value HangUp(const std::string &peerid)
Definition: PeerConnectionManager.cpp:454
bool WindowStillUsed(const std::string &window_uid)
Definition: PeerConnectionManager.cpp:436
bool AddStreams(webrtc::PeerConnectionInterface *peer_connection, const std::string &window_uid, const std::string &options)
Definition: PeerConnectionManager.cpp:594
const Json::Value GetMediaList()
Definition: PeerConnectionManager.cpp:222
std::mutex window_uid_to_track_source_mutex_
Definition: PeerConnectionManager.h:459
std::mutex window_uid_to_peerids_mutex_
Definition: PeerConnectionManager.h:466
const Json::Value Call(const std::string &peerid, const std::string &window_uid, const std::string &options, const Json::Value &json_message)
Definition: PeerConnectionManager.cpp:324
#define LogWarning(...)
Definition: Logging.h:84
#define LogDebug(...)
Definition: Logging.h:103
std::unique_ptr< webrtc::TaskQueueFactory > task_queue_factory_
Definition: PeerConnectionManager.h:443
const Json::Value GetIceCandidateList(const std::string &peerid)
Definition: PeerConnectionManager.cpp:518
bool InitializePeerConnection()
Definition: PeerConnectionManager.cpp:535
std::unordered_map< std::string, std::set< std::string > > window_uid_to_peerids_
Definition: PeerConnectionManager.h:463
std::string webrtc_port_range_
Definition: PeerConnectionManager.h:472
Definition: PinholeCameraIntrinsic.cpp:35
#define OPEN3D_FUNCTION
Definition: Macro.h:59
PeerConnectionManager(const std::list< std::string > &ice_server_list, const Json::Value &config, const std::string &publish_filter, const std::string &webrtc_udp_port_range)
Definition: PeerConnectionManager.cpp:145
void OnFrame(const std::string &window_uid, const std::shared_ptr< core::Tensor > &im)
Definition: PeerConnectionManager.cpp:751
void SendInitFramesToPeer(const std::string &peerid)
Definition: PeerConnectionManager.cpp:727
const std::map< std::string, HttpServerRequestHandler::HttpFunction > GetHttpApi()
Definition: PeerConnectionManager.cpp:513
std::unordered_map< std::string, PeerConnectionObserver * > peerid_to_connection_
Definition: PeerConnectionManager.h:449
void CloseWindowConnections(const std::string &window_uid)
Definition: PeerConnectionManager.cpp:733
std::list< std::string > ice_server_list_
Definition: PeerConnectionManager.h:468
#define LogInfo(...)
Definition: Logging.h:94