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;