Update the call when the network route changes
so that BWE can be updated promptly.
BUG=webrtc:5726
R=mflodman@webrtc.org, pbos@webrtc.org, pthatcher@google.com, pthatcher@webrtc.org, stefan@webrtc.org
Review URL: https://codereview.webrtc.org/1844773002 .
Cr-Original-Commit-Position: refs/heads/master@{#12432}
Cr-Mirrored-From: https://chromium.googlesource.com/external/webrtc
Cr-Mirrored-Commit: 0e533ef487f4851d4c6e730bd2d93c9449578c3a
diff --git a/base/networkroute.h b/base/networkroute.h
index 95c1c08..52fa6d6 100644
--- a/base/networkroute.h
+++ b/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 @@
bool operator!=(const NetworkRoute& nr) const { return !(*this == nr); }
};
-} // namespace cricket
+} // namespace rtc
#endif // WEBRTC_BASE_NETWORKROUTE_H_
diff --git a/call.h b/call.h
index 3ba473f..80134fa 100644
--- a/call.h
+++ b/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 @@
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/call/call.cc b/call/call.cc
index 91c27c8..1572720 100644
--- a/call/call.cc
+++ b/call/call.cc
@@ -89,6 +89,9 @@
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 @@
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 @@
int64_t pacer_bitrate_sum_kbits_ GUARDED_BY(&bitrate_crit_);
int64_t num_bitrate_updates_ GUARDED_BY(&bitrate_crit_);
+ std::map<std::string, rtc::NetworkRoute> network_routes_;
+
VieRemb remb_;
const std::unique_ptr<CongestionController> congestion_controller_;
@@ -591,6 +595,37 @@
}
}
+// 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/media/base/fakemediaengine.h b/media/base/fakemediaengine.h
index fbd8f4c..24c4106 100644
--- a/media/base/fakemediaengine.h
+++ b/media/base/fakemediaengine.h
@@ -179,7 +179,7 @@
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 @@
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 @@
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/media/base/mediachannel.h b/media/base/mediachannel.h
index 68dc8f4..bd1185f 100644
--- a/media/base/mediachannel.h
+++ b/media/base/mediachannel.h
@@ -392,8 +392,9 @@
// 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 @@
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/media/engine/fakewebrtccall.h b/media/engine/fakewebrtccall.h
index 9caa02a..ee3e449 100644
--- a/media/engine/fakewebrtccall.h
+++ b/media/engine/fakewebrtccall.h
@@ -239,6 +239,8 @@
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/media/engine/webrtcvideoengine2.cc b/media/engine/webrtcvideoengine2.cc
index 4914d9f..799596a 100644
--- a/media/engine/webrtcvideoengine2.cc
+++ b/media/engine/webrtcvideoengine2.cc
@@ -1410,9 +1410,8 @@
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/media/engine/webrtcvideoengine2.h b/media/engine/webrtcvideoengine2.h
index 438953b..014bd4d 100644
--- a/media/engine/webrtcvideoengine2.h
+++ b/media/engine/webrtcvideoengine2.h
@@ -171,7 +171,7 @@
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/media/engine/webrtcvoiceengine.cc b/media/engine/webrtcvoiceengine.cc
index d7d71e6..c6cda5e 100644
--- a/media/engine/webrtcvoiceengine.cc
+++ b/media/engine/webrtcvoiceengine.cc
@@ -2335,9 +2335,8 @@
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/media/engine/webrtcvoiceengine.h b/media/engine/webrtcvoiceengine.h
index 0c2d8ba..c59fcaa 100644
--- a/media/engine/webrtcvoiceengine.h
+++ b/media/engine/webrtcvoiceengine.h
@@ -181,7 +181,7 @@
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/pc/channel.cc b/pc/channel.cc
index 497610d..4d47e87 100644
--- a/pc/channel.cc
+++ b/pc/channel.cc
@@ -512,12 +512,12 @@
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/pc/channel_unittest.cc b/pc/channel_unittest.cc
index 5993a69..867b5b3 100644
--- a/pc/channel_unittest.cc
+++ b/pc/channel_unittest.cc
@@ -987,8 +987,8 @@
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);