Adding basic implementation of AudioNetworkAdaptor.

The basic implementation of AudioNetworkAdaptor include the introduction of
  1. Controller
  2. ControllerManager

ControllerManager is to hold all needed controllers. It also orders them according to their significance in dealing with current network condition.

Controller provides an interface MakeDecision, which has to be implemented by specific controllers. AudioNetworkAdaptorImpl calls MakeDecision of the controllers in the order decided by ControllerManager to collect EncoderRuntimeConfig.

BUG=webrtc:6303

Review-Url: https://codereview.webrtc.org/2306083002
Cr-Commit-Position: refs/heads/master@{#14201}
diff --git a/webrtc/modules/audio_coding/audio_network_adaptor/audio_network_adaptor_impl.cc b/webrtc/modules/audio_coding/audio_network_adaptor/audio_network_adaptor_impl.cc
new file mode 100644
index 0000000..0303c84
--- /dev/null
+++ b/webrtc/modules/audio_coding/audio_network_adaptor/audio_network_adaptor_impl.cc
@@ -0,0 +1,73 @@
+/*
+ *  Copyright (c) 2016 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.
+ */
+
+#include <utility>
+
+#include "webrtc/modules/audio_coding/audio_network_adaptor/audio_network_adaptor_impl.h"
+
+namespace webrtc {
+
+AudioNetworkAdaptorImpl::Config::Config() = default;
+
+AudioNetworkAdaptorImpl::Config::~Config() = default;
+
+AudioNetworkAdaptorImpl::AudioNetworkAdaptorImpl(
+    const Config& config,
+    std::unique_ptr<ControllerManager> controller_manager)
+    : config_(config), controller_manager_(std::move(controller_manager)) {
+  RTC_DCHECK(controller_manager_);
+}
+
+AudioNetworkAdaptorImpl::~AudioNetworkAdaptorImpl() = default;
+
+void AudioNetworkAdaptorImpl::SetUplinkBandwidth(int uplink_bandwidth_bps) {
+  last_metrics_.uplink_bandwidth_bps = rtc::Optional<int>(uplink_bandwidth_bps);
+
+  // TODO(minyue): Add debug dumping.
+}
+
+void AudioNetworkAdaptorImpl::SetUplinkPacketLossFraction(
+    float uplink_packet_loss_fraction) {
+  last_metrics_.uplink_packet_loss_fraction =
+      rtc::Optional<float>(uplink_packet_loss_fraction);
+
+  // TODO(minyue): Add debug dumping.
+}
+
+AudioNetworkAdaptor::EncoderRuntimeConfig
+AudioNetworkAdaptorImpl::GetEncoderRuntimeConfig() {
+  EncoderRuntimeConfig config;
+  for (auto& controller :
+       controller_manager_->GetSortedControllers(last_metrics_))
+    controller->MakeDecision(last_metrics_, &config);
+
+  // TODO(minyue): Add debug dumping.
+
+  return config;
+}
+
+void AudioNetworkAdaptorImpl::SetReceiverFrameLengthRange(
+    int min_frame_length_ms,
+    int max_frame_length_ms) {
+  Controller::Constraints constraints;
+  constraints.receiver_frame_length_range =
+      rtc::Optional<Controller::Constraints::FrameLengthRange>(
+          Controller::Constraints::FrameLengthRange(min_frame_length_ms,
+                                                    max_frame_length_ms));
+  auto controllers = controller_manager_->GetControllers();
+  for (auto& controller : controllers)
+    controller->SetConstraints(constraints);
+}
+
+void AudioNetworkAdaptorImpl::StartDebugDump(FILE* file_handle) {
+  // TODO(minyue): Implement this method.
+}
+
+}  // namespace webrtc