diff --git a/webrtc/base/networkroute.h b/webrtc/base/networkroute.h index 95c1c088ac..52fa6d612f 100644 --- a/webrtc/base/networkroute.h +++ b/webrtc/base/networkroute.h @@ -15,7 +15,7 @@ // the media code can rely on and the network code can implement, and both can // depend on that, but not depend on each other. Then, move this file to that // directory. -namespace cricket { +namespace rtc { struct NetworkRoute { bool connected; @@ -47,6 +47,6 @@ struct NetworkRoute { bool operator!=(const NetworkRoute& nr) const { return !(*this == nr); } }; -} // namespace cricket +} // namespace rtc #endif // WEBRTC_BASE_NETWORKROUTE_H_ diff --git a/webrtc/call.h b/webrtc/call.h index 3ba473fec0..80134fa27d 100644 --- a/webrtc/call.h +++ b/webrtc/call.h @@ -17,6 +17,7 @@ #include "webrtc/audio_receive_stream.h" #include "webrtc/audio_send_stream.h" #include "webrtc/audio_state.h" +#include "webrtc/base/networkroute.h" #include "webrtc/base/socket.h" #include "webrtc/video_receive_stream.h" #include "webrtc/video_send_stream.h" @@ -140,6 +141,10 @@ class Call { virtual void SignalChannelNetworkState(MediaType media, NetworkState state) = 0; + virtual void OnNetworkRouteChanged( + const std::string& transport_name, + const rtc::NetworkRoute& network_route) = 0; + virtual void OnSentPacket(const rtc::SentPacket& sent_packet) = 0; virtual ~Call() {} diff --git a/webrtc/call/call.cc b/webrtc/call/call.cc index 91c27c80ad..1572720248 100644 --- a/webrtc/call/call.cc +++ b/webrtc/call/call.cc @@ -89,6 +89,9 @@ class Call : public webrtc::Call, public PacketReceiver, void SignalChannelNetworkState(MediaType media, NetworkState state) override; + void OnNetworkRouteChanged(const std::string& transport_name, + const rtc::NetworkRoute& network_route) override; + void OnSentPacket(const rtc::SentPacket& sent_packet) override; // Implements BitrateObserver. @@ -102,7 +105,6 @@ class Call : public webrtc::Call, public PacketReceiver, const uint8_t* packet, size_t length, const PacketTime& packet_time); - void ConfigureSync(const std::string& sync_group) EXCLUSIVE_LOCKS_REQUIRED(receive_crit_); @@ -170,6 +172,8 @@ class Call : public webrtc::Call, public PacketReceiver, int64_t pacer_bitrate_sum_kbits_ GUARDED_BY(&bitrate_crit_); int64_t num_bitrate_updates_ GUARDED_BY(&bitrate_crit_); + std::map network_routes_; + VieRemb remb_; const std::unique_ptr congestion_controller_; @@ -591,6 +595,37 @@ void Call::SignalChannelNetworkState(MediaType media, NetworkState state) { } } +// TODO(honghaiz): Add tests for this method. +void Call::OnNetworkRouteChanged(const std::string& transport_name, + const rtc::NetworkRoute& network_route) { + RTC_DCHECK(configuration_thread_checker_.CalledOnValidThread()); + // Check if the network route is connected. + if (!network_route.connected) { + LOG(LS_INFO) << "Transport " << transport_name << " is disconnected"; + // TODO(honghaiz): Perhaps handle this in SignalChannelNetworkState and + // consider merging these two methods. + return; + } + + // Check whether the network route has changed on each transport. + auto result = + network_routes_.insert(std::make_pair(transport_name, network_route)); + auto kv = result.first; + bool inserted = result.second; + if (inserted) { + // No need to reset BWE if this is the first time the network connects. + return; + } + if (kv->second != network_route) { + kv->second = network_route; + LOG(LS_INFO) << "Network route changed on transport " << transport_name + << ": new local network id " << network_route.local_network_id + << " new remote network id " + << network_route.remote_network_id; + // TODO(holmer): Update the BWE bitrates. + } +} + void Call::UpdateAggregateNetworkState() { RTC_DCHECK(configuration_thread_checker_.CalledOnValidThread()); diff --git a/webrtc/media/base/fakemediaengine.h b/webrtc/media/base/fakemediaengine.h index fbd8f4c275..24c4106afd 100644 --- a/webrtc/media/base/fakemediaengine.h +++ b/webrtc/media/base/fakemediaengine.h @@ -179,7 +179,7 @@ template class RtpHelper : public Base { return ready_to_send_; } - NetworkRoute last_network_route() const { return last_network_route_; } + rtc::NetworkRoute last_network_route() const { return last_network_route_; } int num_network_route_changes() const { return num_network_route_changes_; } void set_num_network_route_changes(int changes) { num_network_route_changes_ = changes; @@ -224,7 +224,7 @@ template class RtpHelper : public Base { ready_to_send_ = ready; } virtual void OnNetworkRouteChanged(const std::string& transport_name, - const NetworkRoute& network_route) { + const rtc::NetworkRoute& network_route) { last_network_route_ = network_route; ++num_network_route_changes_; } @@ -247,7 +247,7 @@ template class RtpHelper : public Base { uint32_t send_ssrc_; std::string rtcp_cname_; bool ready_to_send_; - NetworkRoute last_network_route_; + rtc::NetworkRoute last_network_route_; int num_network_route_changes_ = 0; }; diff --git a/webrtc/media/base/mediachannel.h b/webrtc/media/base/mediachannel.h index 68dc8f494f..bd1185f722 100644 --- a/webrtc/media/base/mediachannel.h +++ b/webrtc/media/base/mediachannel.h @@ -392,8 +392,9 @@ class MediaChannel : public sigslot::has_slots<> { // Called when the socket's ability to send has changed. virtual void OnReadyToSend(bool ready) = 0; // Called when the network route used for sending packets changed. - virtual void OnNetworkRouteChanged(const std::string& transport_name, - const NetworkRoute& network_route) = 0; + virtual void OnNetworkRouteChanged( + const std::string& transport_name, + const rtc::NetworkRoute& network_route) = 0; // Creates a new outgoing media stream with SSRCs and CNAME as described // by sp. virtual bool AddSendStream(const StreamParams& sp) = 0; @@ -1112,7 +1113,7 @@ class DataMediaChannel : public MediaChannel { virtual bool SetReceive(bool receive) = 0; virtual void OnNetworkRouteChanged(const std::string& transport_name, - const NetworkRoute& network_route) {} + const rtc::NetworkRoute& network_route) {} virtual bool SendData( const SendDataParams& params, diff --git a/webrtc/media/engine/fakewebrtccall.h b/webrtc/media/engine/fakewebrtccall.h index 9caa02a9b7..ee3e449b19 100644 --- a/webrtc/media/engine/fakewebrtccall.h +++ b/webrtc/media/engine/fakewebrtccall.h @@ -239,6 +239,8 @@ class FakeCall final : public webrtc::Call, public webrtc::PacketReceiver { void SetBitrateConfig( const webrtc::Call::Config::BitrateConfig& bitrate_config) override; + void OnNetworkRouteChanged(const std::string& transport_name, + const rtc::NetworkRoute& network_route) override {} void SignalChannelNetworkState(webrtc::MediaType media, webrtc::NetworkState state) override; void OnSentPacket(const rtc::SentPacket& sent_packet) override; diff --git a/webrtc/media/engine/webrtcvideoengine2.cc b/webrtc/media/engine/webrtcvideoengine2.cc index 4914d9f51d..799596afb8 100644 --- a/webrtc/media/engine/webrtcvideoengine2.cc +++ b/webrtc/media/engine/webrtcvideoengine2.cc @@ -1410,9 +1410,8 @@ void WebRtcVideoChannel2::OnReadyToSend(bool ready) { void WebRtcVideoChannel2::OnNetworkRouteChanged( const std::string& transport_name, - const NetworkRoute& network_route) { - // TODO(honghaiz): uncomment this once the function in call is implemented. - // call_->OnNetworkRouteChanged(transport_name, network_route); + const rtc::NetworkRoute& network_route) { + call_->OnNetworkRouteChanged(transport_name, network_route); } // TODO(pbos): Remove SetOptions in favor of SetSendParameters. diff --git a/webrtc/media/engine/webrtcvideoengine2.h b/webrtc/media/engine/webrtcvideoengine2.h index 438953b9af..014bd4d207 100644 --- a/webrtc/media/engine/webrtcvideoengine2.h +++ b/webrtc/media/engine/webrtcvideoengine2.h @@ -171,7 +171,7 @@ class WebRtcVideoChannel2 : public VideoMediaChannel, public webrtc::Transport { const rtc::PacketTime& packet_time) override; void OnReadyToSend(bool ready) override; void OnNetworkRouteChanged(const std::string& transport_name, - const NetworkRoute& network_route) override; + const rtc::NetworkRoute& network_route) override; void SetInterface(NetworkInterface* iface) override; // Implemented for VideoMediaChannelTest. diff --git a/webrtc/media/engine/webrtcvoiceengine.cc b/webrtc/media/engine/webrtcvoiceengine.cc index d7d71e635d..c6cda5ed85 100644 --- a/webrtc/media/engine/webrtcvoiceengine.cc +++ b/webrtc/media/engine/webrtcvoiceengine.cc @@ -2335,9 +2335,8 @@ void WebRtcVoiceMediaChannel::OnRtcpReceived( void WebRtcVoiceMediaChannel::OnNetworkRouteChanged( const std::string& transport_name, - const NetworkRoute& network_route) { - // TODO(honghaiz): uncomment this once the function in call is implemented. - // call_->OnNetworkRouteChanged(transport_name, network_route); + const rtc::NetworkRoute& network_route) { + call_->OnNetworkRouteChanged(transport_name, network_route); } bool WebRtcVoiceMediaChannel::MuteStream(uint32_t ssrc, bool muted) { diff --git a/webrtc/media/engine/webrtcvoiceengine.h b/webrtc/media/engine/webrtcvoiceengine.h index 0c2d8ba2c9..c59fcaa05a 100644 --- a/webrtc/media/engine/webrtcvoiceengine.h +++ b/webrtc/media/engine/webrtcvoiceengine.h @@ -181,7 +181,7 @@ class WebRtcVoiceMediaChannel final : public VoiceMediaChannel, void OnRtcpReceived(rtc::CopyOnWriteBuffer* packet, const rtc::PacketTime& packet_time) override; void OnNetworkRouteChanged(const std::string& transport_name, - const NetworkRoute& network_route) override; + const rtc::NetworkRoute& network_route) override; void OnReadyToSend(bool ready) override; bool GetStats(VoiceMediaInfo* info) override; diff --git a/webrtc/pc/channel.cc b/webrtc/pc/channel.cc index 497610da78..4d47e878b8 100644 --- a/webrtc/pc/channel.cc +++ b/webrtc/pc/channel.cc @@ -512,12 +512,12 @@ void BaseChannel::OnSelectedCandidatePairChanged( CandidatePairInterface* selected_candidate_pair, int last_sent_packet_id) { ASSERT(channel == transport_channel_ || channel == rtcp_transport_channel_); - NetworkRoute network_route; + rtc::NetworkRoute network_route; if (selected_candidate_pair) { - network_route = - NetworkRoute(selected_candidate_pair->local_candidate().network_id(), - selected_candidate_pair->remote_candidate().network_id(), - last_sent_packet_id); + network_route = rtc::NetworkRoute( + selected_candidate_pair->local_candidate().network_id(), + selected_candidate_pair->remote_candidate().network_id(), + last_sent_packet_id); } media_channel()->OnNetworkRouteChanged(channel->transport_name(), network_route); diff --git a/webrtc/pc/channel_unittest.cc b/webrtc/pc/channel_unittest.cc index 5993a69f78..867b5b3e36 100644 --- a/webrtc/pc/channel_unittest.cc +++ b/webrtc/pc/channel_unittest.cc @@ -987,8 +987,8 @@ class ChannelTest : public testing::Test, public sigslot::has_slots<> { transport_channel1->SignalSelectedCandidatePairChanged( transport_channel1, candidate_pair.get(), last_packet_id); EXPECT_EQ(1, media_channel1_->num_network_route_changes()); - cricket::NetworkRoute expected_network_route(local_net_id, remote_net_id, - last_packet_id); + rtc::NetworkRoute expected_network_route(local_net_id, remote_net_id, + last_packet_id); EXPECT_EQ(expected_network_route, media_channel1->last_network_route()); EXPECT_EQ(last_packet_id, media_channel1->last_network_route().last_sent_packet_id);