Add base class NetworkPredictor and NetworkPredictorFactory and wire up.
Add base class NetworkPredictor and NetworkPredictorFactory in /api, make it possible to inject customized NetworkPredictor in PeerConnectionFactory level. The NetworkPredictor object will be pass down to GoogCCNetworkControl and DelayBasedBwe.
Bug: webrtc:10492
Change-Id: Iceeadbe1c9388b11ce4ac01ee56554cb0bf64d04
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/130201
Commit-Queue: Ying Wang <yinwa@webrtc.org>
Reviewed-by: Per Kjellander <perkj@webrtc.org>
Reviewed-by: Stefan Holmer <stefan@webrtc.org>
Reviewed-by: Sami Kalliomäki <sakal@webrtc.org>
Reviewed-by: Christoffer Rodbro <crodbro@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#27543}
diff --git a/api/BUILD.gn b/api/BUILD.gn
index 28ddff1..84b0c0e 100644
--- a/api/BUILD.gn
+++ b/api/BUILD.gn
@@ -45,6 +45,7 @@
":callfactory_api",
":fec_controller_api",
":libjingle_peerconnection_api",
+ ":network_state_predictor_api",
":scoped_refptr",
"../logging:rtc_event_log_api",
"../logging:rtc_event_log_impl_base",
@@ -140,6 +141,7 @@
":callfactory_api",
":fec_controller_api",
":libjingle_logging_api",
+ ":network_state_predictor_api",
":rtc_stats_api",
":scoped_refptr",
"audio:audio_mixer_api",
@@ -187,6 +189,7 @@
deps = [
":fec_controller_api",
":libjingle_peerconnection_api",
+ ":network_state_predictor_api",
":simulated_network_api",
"../call:fake_network",
"../call:rtp_interfaces",
@@ -259,6 +262,7 @@
":fec_controller_api",
":function_view",
":libjingle_peerconnection_api",
+ ":network_state_predictor_api",
":simulated_network_api",
":video_quality_analyzer_api",
"../logging:rtc_event_log_api",
@@ -296,6 +300,7 @@
]
deps = [
":fec_controller_api",
+ ":network_state_predictor_api",
":scoped_refptr",
":video_quality_test_fixture_api",
"../video:video_quality_test",
@@ -443,6 +448,13 @@
]
}
+rtc_source_set("network_state_predictor_api") {
+ visibility = [ "*" ]
+ sources = [
+ "network_state_predictor.h",
+ ]
+}
+
rtc_source_set("array_view") {
visibility = [ "*" ]
sources = [
diff --git a/api/network_state_predictor.h b/api/network_state_predictor.h
new file mode 100644
index 0000000..9cf5ab6
--- /dev/null
+++ b/api/network_state_predictor.h
@@ -0,0 +1,56 @@
+/*
+ * Copyright (c) 2019 The WebRTC project authors. All Rights Reserved.
+ *
+ * Use of this source code is governed by a BSD-style license
+ * that can be found in the LICENSE file in the root of the source
+ * tree. An additional intellectual property rights grant can be found
+ * in the file PATENTS. All contributing project authors may
+ * be found in the AUTHORS file in the root of the source tree.
+ */
+
+#ifndef API_NETWORK_STATE_PREDICTOR_H_
+#define API_NETWORK_STATE_PREDICTOR_H_
+
+#include <memory>
+#include <vector>
+
+namespace webrtc {
+
+enum class BandwidthUsage {
+ kBwNormal = 0,
+ kBwUnderusing = 1,
+ kBwOverusing = 2,
+ kLast
+};
+
+// TODO(yinwa): work in progress. API in class NetworkStatePredictor should not
+// be used by other users until this comment is removed.
+
+// NetworkStatePredictor predict network state based on current network metrics.
+// Usage:
+// Setup by calling Initialize.
+// For each update, call Update. Update returns network state
+// prediction.
+class NetworkStatePredictor {
+ public:
+ virtual ~NetworkStatePredictor() {}
+
+ // Returns current network state prediction.
+ // Inputs: send_time_ms - packet send time.
+ // arrival_time_ms - packet arrival time.
+ // network_state - computed network state.
+ virtual BandwidthUsage Update(int64_t send_time_ms,
+ int64_t arrival_time_ms,
+ BandwidthUsage network_state) = 0;
+};
+
+class NetworkStatePredictorFactoryInterface {
+ public:
+ virtual std::unique_ptr<NetworkStatePredictor>
+ CreateNetworkStatePredictor() = 0;
+ virtual ~NetworkStatePredictorFactoryInterface() = default;
+};
+
+} // namespace webrtc
+
+#endif // API_NETWORK_STATE_PREDICTOR_H_
diff --git a/api/peer_connection_interface.h b/api/peer_connection_interface.h
index 661c5aa..36f2bcd 100644
--- a/api/peer_connection_interface.h
+++ b/api/peer_connection_interface.h
@@ -83,6 +83,7 @@
#include "api/jsep.h"
#include "api/media_stream_interface.h"
#include "api/media_transport_interface.h"
+#include "api/network_state_predictor.h"
#include "api/rtc_error.h"
#include "api/rtc_event_log_output.h"
#include "api/rtp_receiver_interface.h"
@@ -1248,6 +1249,8 @@
std::unique_ptr<CallFactoryInterface> call_factory;
std::unique_ptr<RtcEventLogFactoryInterface> event_log_factory;
std::unique_ptr<FecControllerFactoryInterface> fec_controller_factory;
+ std::unique_ptr<NetworkStatePredictorFactoryInterface>
+ network_state_predictor_factory;
std::unique_ptr<NetworkControllerFactoryInterface> network_controller_factory;
std::unique_ptr<MediaTransportFactory> media_transport_factory;
};
@@ -1427,6 +1430,8 @@
std::unique_ptr<CallFactoryInterface> call_factory,
std::unique_ptr<RtcEventLogFactoryInterface> event_log_factory,
std::unique_ptr<FecControllerFactoryInterface> fec_controller_factory,
+ std::unique_ptr<NetworkStatePredictorFactoryInterface>
+ network_state_predictor_factory,
std::unique_ptr<NetworkControllerFactoryInterface>
network_controller_factory = nullptr);
diff --git a/api/transport/BUILD.gn b/api/transport/BUILD.gn
index 47146d8..5c40deb 100644
--- a/api/transport/BUILD.gn
+++ b/api/transport/BUILD.gn
@@ -78,6 +78,7 @@
deps = [
":network_control",
":webrtc_key_value_config",
+ "..:network_state_predictor_api",
"../../modules/congestion_controller/goog_cc",
"//third_party/abseil-cpp/absl/memory",
]
diff --git a/api/transport/goog_cc_factory.cc b/api/transport/goog_cc_factory.cc
index 92fd4d1..00f6a2e 100644
--- a/api/transport/goog_cc_factory.cc
+++ b/api/transport/goog_cc_factory.cc
@@ -18,11 +18,21 @@
namespace webrtc {
GoogCcNetworkControllerFactory::GoogCcNetworkControllerFactory(
RtcEventLog* event_log)
- : event_log_(event_log) {}
+ : event_log_(event_log), network_state_predictor_factory_(nullptr) {}
+
+GoogCcNetworkControllerFactory::GoogCcNetworkControllerFactory(
+ RtcEventLog* event_log,
+ NetworkStatePredictorFactoryInterface* network_state_predictor_factory)
+ : event_log_(event_log),
+ network_state_predictor_factory_(network_state_predictor_factory) {}
std::unique_ptr<NetworkControllerInterface>
GoogCcNetworkControllerFactory::Create(NetworkControllerConfig config) {
- return absl::make_unique<GoogCcNetworkController>(event_log_, config, false);
+ return absl::make_unique<GoogCcNetworkController>(
+ event_log_, config, false,
+ network_state_predictor_factory_
+ ? network_state_predictor_factory_->CreateNetworkStatePredictor()
+ : nullptr);
}
TimeDelta GoogCcNetworkControllerFactory::GetProcessInterval() const {
@@ -36,7 +46,8 @@
std::unique_ptr<NetworkControllerInterface>
GoogCcFeedbackNetworkControllerFactory::Create(NetworkControllerConfig config) {
- return absl::make_unique<GoogCcNetworkController>(event_log_, config, true);
+ return absl::make_unique<GoogCcNetworkController>(event_log_, config, true,
+ nullptr);
}
TimeDelta GoogCcFeedbackNetworkControllerFactory::GetProcessInterval() const {
diff --git a/api/transport/goog_cc_factory.h b/api/transport/goog_cc_factory.h
index 2e3b317..dbf4fe1 100644
--- a/api/transport/goog_cc_factory.h
+++ b/api/transport/goog_cc_factory.h
@@ -12,6 +12,7 @@
#define API_TRANSPORT_GOOG_CC_FACTORY_H_
#include <memory>
+#include "api/network_state_predictor.h"
#include "api/transport/network_control.h"
namespace webrtc {
@@ -20,13 +21,17 @@
class GoogCcNetworkControllerFactory
: public NetworkControllerFactoryInterface {
public:
- explicit GoogCcNetworkControllerFactory(RtcEventLog*);
+ explicit GoogCcNetworkControllerFactory(RtcEventLog* event_log);
+ explicit GoogCcNetworkControllerFactory(
+ RtcEventLog* event_log,
+ NetworkStatePredictorFactoryInterface* network_state_predictor_factory);
std::unique_ptr<NetworkControllerInterface> Create(
NetworkControllerConfig config) override;
TimeDelta GetProcessInterval() const override;
private:
RtcEventLog* const event_log_;
+ NetworkStatePredictorFactoryInterface* const network_state_predictor_factory_;
};
// Factory to create packet feedback only GoogCC, this can be used for
@@ -34,7 +39,7 @@
class GoogCcFeedbackNetworkControllerFactory
: public NetworkControllerFactoryInterface {
public:
- explicit GoogCcFeedbackNetworkControllerFactory(RtcEventLog*);
+ explicit GoogCcFeedbackNetworkControllerFactory(RtcEventLog* event_log);
std::unique_ptr<NetworkControllerInterface> Create(
NetworkControllerConfig config) override;
TimeDelta GetProcessInterval() const override;