Relanding of "Adding debug dump to audio network adaptor."

The original CL was https://codereview.webrtc.org/2356763002

but got reverted https://codereview.webrtc.org/2362003002/.

The error was that ana_debug_dump_proto as a proto_library was placed under rtc_include_tests.

BUG=webrtc:6303

Review-Url: https://codereview.webrtc.org/2365723002
Cr-Commit-Position: refs/heads/master@{#14363}
diff --git a/webrtc/modules/audio_coding/BUILD.gn b/webrtc/modules/audio_coding/BUILD.gn
index eaf2e74..a69206e 100644
--- a/webrtc/modules/audio_coding/BUILD.gn
+++ b/webrtc/modules/audio_coding/BUILD.gn
@@ -696,6 +696,15 @@
   }
 }
 
+if (rtc_enable_protobuf) {
+  proto_library("ana_debug_dump_proto") {
+    sources = [
+      "audio_network_adaptor/debug_dump.proto",
+    ]
+    proto_out_dir = "webrtc/modules/audio_coding/audio_network_adaptor"
+  }
+}
+
 source_set("audio_network_adaptor") {
   sources = [
     "audio_network_adaptor/audio_network_adaptor.cc",
@@ -709,6 +718,8 @@
     "audio_network_adaptor/controller.h",
     "audio_network_adaptor/controller_manager.cc",
     "audio_network_adaptor/controller_manager.h",
+    "audio_network_adaptor/debug_dump_writer.cc",
+    "audio_network_adaptor/debug_dump_writer.h",
     "audio_network_adaptor/dtx_controller.cc",
     "audio_network_adaptor/dtx_controller.h",
     "audio_network_adaptor/fec_controller.cc",
@@ -721,6 +732,13 @@
   ]
   configs += [ "../..:common_config" ]
   public_configs = [ "../..:common_inherited_config" ]
+
+  if (rtc_enable_protobuf) {
+    deps = [
+      ":ana_debug_dump_proto",
+    ]
+    defines = [ "WEBRTC_AUDIO_NETWORK_ADAPTOR_DEBUG_DUMP" ]
+  }
 }
 
 config("neteq_config") {
diff --git a/webrtc/modules/audio_coding/audio_network_adaptor/audio_network_adaptor.gypi b/webrtc/modules/audio_coding/audio_network_adaptor/audio_network_adaptor.gypi
index af6ba55..508b62b 100644
--- a/webrtc/modules/audio_coding/audio_network_adaptor/audio_network_adaptor.gypi
+++ b/webrtc/modules/audio_coding/audio_network_adaptor/audio_network_adaptor.gypi
@@ -22,6 +22,8 @@
         'controller.cc',
         'controller_manager.cc',
         'controller_manager.h',
+        'debug_dump_writer.cc',
+        'debug_dump_writer.h',
         'dtx_controller.h',
         'dtx_controller.cc',
         'fec_controller.h',
@@ -31,7 +33,32 @@
         'include/audio_network_adaptor.h',
         'smoothing_filter.h',
         'smoothing_filter.cc',
-      ], # source
+      ], # sources
+      'conditions': [
+        ['enable_protobuf==1', {
+          'dependencies': ['debug_dump_proto'],
+          'defines': ['WEBRTC_AUDIO_NETWORK_ADAPTOR_DEBUG_DUMP'],
+        }],
+      ], # conditions
     },
   ], # targets
+
+  'conditions': [
+    ['enable_protobuf==1', {
+      'targets': [
+        { 'target_name': 'debug_dump_proto',
+          'type': 'static_library',
+          'sources': ['debug_dump.proto',],
+          'variables': {
+            'proto_in_dir': '.',
+            # Workaround to protect against gyp's pathname relativization when
+            # this file is included by modules.gyp.
+            'proto_out_protected': 'webrtc/modules/audio_coding/audio_network_adaptor',
+            'proto_out_dir': '<(proto_out_protected)',
+          },
+          'includes': ['../../../build/protoc.gypi',],
+        },
+      ], # targets
+    }],
+  ], # conditions
 }
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
index 0303c84..3d8b2be 100644
--- 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
@@ -8,10 +8,10 @@
  *  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"
 
+#include <utility>
+
 namespace webrtc {
 
 AudioNetworkAdaptorImpl::Config::Config() = default;
@@ -21,7 +21,15 @@
 AudioNetworkAdaptorImpl::AudioNetworkAdaptorImpl(
     const Config& config,
     std::unique_ptr<ControllerManager> controller_manager)
-    : config_(config), controller_manager_(std::move(controller_manager)) {
+    : AudioNetworkAdaptorImpl(config, std::move(controller_manager), nullptr) {}
+
+AudioNetworkAdaptorImpl::AudioNetworkAdaptorImpl(
+    const Config& config,
+    std::unique_ptr<ControllerManager> controller_manager,
+    std::unique_ptr<DebugDumpWriter> debug_dump_writer)
+    : config_(config),
+      controller_manager_(std::move(controller_manager)),
+      debug_dump_writer_(std::move(debug_dump_writer)) {
   RTC_DCHECK(controller_manager_);
 }
 
@@ -29,16 +37,19 @@
 
 void AudioNetworkAdaptorImpl::SetUplinkBandwidth(int uplink_bandwidth_bps) {
   last_metrics_.uplink_bandwidth_bps = rtc::Optional<int>(uplink_bandwidth_bps);
-
-  // TODO(minyue): Add debug dumping.
+  DumpNetworkMetrics();
 }
 
 void AudioNetworkAdaptorImpl::SetUplinkPacketLossFraction(
     float uplink_packet_loss_fraction) {
   last_metrics_.uplink_packet_loss_fraction =
       rtc::Optional<float>(uplink_packet_loss_fraction);
+  DumpNetworkMetrics();
+}
 
-  // TODO(minyue): Add debug dumping.
+void AudioNetworkAdaptorImpl::SetRtt(int rtt_ms) {
+  last_metrics_.rtt_ms = rtc::Optional<int>(rtt_ms);
+  DumpNetworkMetrics();
 }
 
 AudioNetworkAdaptor::EncoderRuntimeConfig
@@ -49,6 +60,9 @@
     controller->MakeDecision(last_metrics_, &config);
 
   // TODO(minyue): Add debug dumping.
+  if (debug_dump_writer_)
+    debug_dump_writer_->DumpEncoderRuntimeConfig(
+        config, config_.clock->TimeInMilliseconds());
 
   return config;
 }
@@ -67,7 +81,17 @@
 }
 
 void AudioNetworkAdaptorImpl::StartDebugDump(FILE* file_handle) {
-  // TODO(minyue): Implement this method.
+  debug_dump_writer_ = DebugDumpWriter::Create(file_handle);
+}
+
+void AudioNetworkAdaptorImpl::StopDebugDump() {
+  debug_dump_writer_.reset(nullptr);
+}
+
+void AudioNetworkAdaptorImpl::DumpNetworkMetrics() {
+  if (debug_dump_writer_)
+    debug_dump_writer_->DumpNetworkMetrics(last_metrics_,
+                                           config_.clock->TimeInMilliseconds());
 }
 
 }  // namespace webrtc
diff --git a/webrtc/modules/audio_coding/audio_network_adaptor/audio_network_adaptor_impl.h b/webrtc/modules/audio_coding/audio_network_adaptor/audio_network_adaptor_impl.h
index 6f8d348..289b677 100644
--- a/webrtc/modules/audio_coding/audio_network_adaptor/audio_network_adaptor_impl.h
+++ b/webrtc/modules/audio_coding/audio_network_adaptor/audio_network_adaptor_impl.h
@@ -16,7 +16,9 @@
 #include "webrtc/base/constructormagic.h"
 #include "webrtc/modules/audio_coding/audio_network_adaptor/controller.h"
 #include "webrtc/modules/audio_coding/audio_network_adaptor/controller_manager.h"
+#include "webrtc/modules/audio_coding/audio_network_adaptor/debug_dump_writer.h"
 #include "webrtc/modules/audio_coding/audio_network_adaptor/include/audio_network_adaptor.h"
+#include "webrtc/system_wrappers/include/clock.h"
 
 namespace webrtc {
 
@@ -25,18 +27,27 @@
   struct Config {
     Config();
     ~Config();
+    const Clock* clock;
   };
 
   AudioNetworkAdaptorImpl(
       const Config& config,
       std::unique_ptr<ControllerManager> controller_manager);
 
+  // Dependency injection for testing.
+  AudioNetworkAdaptorImpl(
+      const Config& config,
+      std::unique_ptr<ControllerManager> controller_manager,
+      std::unique_ptr<DebugDumpWriter> debug_dump_writer = nullptr);
+
   ~AudioNetworkAdaptorImpl() override;
 
   void SetUplinkBandwidth(int uplink_bandwidth_bps) override;
 
   void SetUplinkPacketLossFraction(float uplink_packet_loss_fraction) override;
 
+  void SetRtt(int rtt_ms) override;
+
   void SetReceiverFrameLengthRange(int min_frame_length_ms,
                                    int max_frame_length_ms) override;
 
@@ -44,11 +55,17 @@
 
   void StartDebugDump(FILE* file_handle) override;
 
+  void StopDebugDump() override;
+
  private:
+  void DumpNetworkMetrics();
+
   const Config config_;
 
   std::unique_ptr<ControllerManager> controller_manager_;
 
+  std::unique_ptr<DebugDumpWriter> debug_dump_writer_;
+
   Controller::NetworkMetrics last_metrics_;
 
   RTC_DISALLOW_COPY_AND_ASSIGN(AudioNetworkAdaptorImpl);
diff --git a/webrtc/modules/audio_coding/audio_network_adaptor/audio_network_adaptor_impl_unittest.cc b/webrtc/modules/audio_coding/audio_network_adaptor/audio_network_adaptor_impl_unittest.cc
index 6562674..aee41da 100644
--- a/webrtc/modules/audio_coding/audio_network_adaptor/audio_network_adaptor_impl_unittest.cc
+++ b/webrtc/modules/audio_coding/audio_network_adaptor/audio_network_adaptor_impl_unittest.cc
@@ -15,20 +15,25 @@
 #include "webrtc/modules/audio_coding/audio_network_adaptor/audio_network_adaptor_impl.h"
 #include "webrtc/modules/audio_coding/audio_network_adaptor/mock/mock_controller.h"
 #include "webrtc/modules/audio_coding/audio_network_adaptor/mock/mock_controller_manager.h"
+#include "webrtc/modules/audio_coding/audio_network_adaptor/mock/mock_debug_dump_writer.h"
 
 namespace webrtc {
 
 using ::testing::_;
 using ::testing::NiceMock;
 using ::testing::Return;
+using ::testing::SetArgPointee;
 
 namespace {
 
 constexpr size_t kNumControllers = 2;
 
+constexpr int64_t kClockInitialTimeMs = 12345678;
+
 MATCHER_P(NetworkMetricsIs, metric, "") {
   return arg.uplink_bandwidth_bps == metric.uplink_bandwidth_bps &&
          arg.target_audio_bitrate_bps == metric.target_audio_bitrate_bps &&
+         arg.rtt_ms == metric.rtt_ms &&
          arg.uplink_packet_loss_fraction == metric.uplink_packet_loss_fraction;
 }
 
@@ -39,9 +44,21 @@
              frame_length_range.max_frame_length_ms;
 }
 
+MATCHER_P(EncoderRuntimeConfigIs, config, "") {
+  return arg.bitrate_bps == config.bitrate_bps &&
+         arg.frame_length_ms == config.frame_length_ms &&
+         arg.uplink_packet_loss_fraction ==
+             config.uplink_packet_loss_fraction &&
+         arg.enable_fec == config.enable_fec &&
+         arg.enable_dtx == config.enable_dtx &&
+         arg.num_channels == config.num_channels;
+}
+
 struct AudioNetworkAdaptorStates {
   std::unique_ptr<AudioNetworkAdaptorImpl> audio_network_adaptor;
   std::vector<std::unique_ptr<MockController>> mock_controllers;
+  std::unique_ptr<SimulatedClock> simulated_clock;
+  MockDebugDumpWriter* mock_debug_dump_writer;
 };
 
 AudioNetworkAdaptorStates CreateAudioNetworkAdaptor() {
@@ -64,9 +81,19 @@
   EXPECT_CALL(*controller_manager, GetSortedControllers(_))
       .WillRepeatedly(Return(controllers));
 
+  states.simulated_clock.reset(new SimulatedClock(kClockInitialTimeMs * 1000));
+
+  auto debug_dump_writer =
+      std::unique_ptr<MockDebugDumpWriter>(new NiceMock<MockDebugDumpWriter>());
+  EXPECT_CALL(*debug_dump_writer, Die());
+  states.mock_debug_dump_writer = debug_dump_writer.get();
+
+  AudioNetworkAdaptorImpl::Config config;
+  config.clock = states.simulated_clock.get();
   // AudioNetworkAdaptorImpl governs the lifetime of controller manager.
   states.audio_network_adaptor.reset(new AudioNetworkAdaptorImpl(
-      AudioNetworkAdaptorImpl::Config(), std::move(controller_manager)));
+      config,
+      std::move(controller_manager), std::move(debug_dump_writer)));
 
   return states;
 }
@@ -108,4 +135,52 @@
   states.audio_network_adaptor->SetReceiverFrameLengthRange(20, 120);
 }
 
+TEST(AudioNetworkAdaptorImplTest,
+     DumpEncoderRuntimeConfigIsCalledOnGetEncoderRuntimeConfig) {
+  auto states = CreateAudioNetworkAdaptor();
+
+  AudioNetworkAdaptor::EncoderRuntimeConfig config;
+  config.bitrate_bps = rtc::Optional<int>(32000);
+  config.enable_fec = rtc::Optional<bool>(true);
+
+  EXPECT_CALL(*states.mock_controllers[0], MakeDecision(_, _))
+      .WillOnce(SetArgPointee<1>(config));
+
+  EXPECT_CALL(*states.mock_debug_dump_writer,
+              DumpEncoderRuntimeConfig(EncoderRuntimeConfigIs(config),
+                                       kClockInitialTimeMs));
+  states.audio_network_adaptor->GetEncoderRuntimeConfig();
+}
+
+TEST(AudioNetworkAdaptorImplTest,
+     DumpNetworkMetricsIsCalledOnSetNetworkMetrics) {
+  auto states = CreateAudioNetworkAdaptor();
+
+  constexpr int kBandwidth = 16000;
+  constexpr float kPacketLoss = 0.7f;
+  constexpr int kRtt = 100;
+
+  Controller::NetworkMetrics check;
+  check.uplink_bandwidth_bps = rtc::Optional<int>(kBandwidth);
+  int64_t timestamp_check = kClockInitialTimeMs;
+
+  EXPECT_CALL(*states.mock_debug_dump_writer,
+              DumpNetworkMetrics(NetworkMetricsIs(check), timestamp_check));
+  states.audio_network_adaptor->SetUplinkBandwidth(kBandwidth);
+
+  states.simulated_clock->AdvanceTimeMilliseconds(100);
+  timestamp_check += 100;
+  check.uplink_packet_loss_fraction = rtc::Optional<float>(kPacketLoss);
+  EXPECT_CALL(*states.mock_debug_dump_writer,
+              DumpNetworkMetrics(NetworkMetricsIs(check), timestamp_check));
+  states.audio_network_adaptor->SetUplinkPacketLossFraction(kPacketLoss);
+
+  states.simulated_clock->AdvanceTimeMilliseconds(200);
+  timestamp_check += 200;
+  check.rtt_ms = rtc::Optional<int>(kRtt);
+  EXPECT_CALL(*states.mock_debug_dump_writer,
+              DumpNetworkMetrics(NetworkMetricsIs(check), timestamp_check));
+  states.audio_network_adaptor->SetRtt(kRtt);
+}
+
 }  // namespace webrtc
diff --git a/webrtc/modules/audio_coding/audio_network_adaptor/controller.h b/webrtc/modules/audio_coding/audio_network_adaptor/controller.h
index c1b16c7..f27a391 100644
--- a/webrtc/modules/audio_coding/audio_network_adaptor/controller.h
+++ b/webrtc/modules/audio_coding/audio_network_adaptor/controller.h
@@ -24,6 +24,7 @@
     rtc::Optional<int> uplink_bandwidth_bps;
     rtc::Optional<float> uplink_packet_loss_fraction;
     rtc::Optional<int> target_audio_bitrate_bps;
+    rtc::Optional<int> rtt_ms;
   };
 
   struct Constraints {
diff --git a/webrtc/modules/audio_coding/audio_network_adaptor/debug_dump.proto b/webrtc/modules/audio_coding/audio_network_adaptor/debug_dump.proto
new file mode 100644
index 0000000..f425244
--- /dev/null
+++ b/webrtc/modules/audio_coding/audio_network_adaptor/debug_dump.proto
@@ -0,0 +1,30 @@
+syntax = "proto2";
+option optimize_for = LITE_RUNTIME;
+package webrtc.audio_network_adaptor.debug_dump;
+
+message NetworkMetrics {
+  optional int32 uplink_bandwidth_bps = 1;
+  optional float uplink_packet_loss_fraction = 2;
+  optional int32 target_audio_bitrate_bps = 3;
+  optional int32 rtt_ms = 4;
+}
+
+message EncoderRuntimeConfig {
+  optional int32 bitrate_bps = 1;
+  optional int32 frame_length_ms = 2;
+  optional float uplink_packet_loss_fraction = 3;
+  optional bool enable_fec = 4;
+  optional bool enable_dtx = 5;
+  optional uint32 num_channels = 6;
+}
+
+message Event {
+  enum Type {
+    NETWORK_METRICS = 0;
+    ENCODER_RUNTIME_CONFIG = 1;
+  }
+  required Type type = 1;
+  required uint32 timestamp = 2;
+  optional NetworkMetrics network_metrics = 3;
+  optional EncoderRuntimeConfig encoder_runtime_config = 4;
+}
diff --git a/webrtc/modules/audio_coding/audio_network_adaptor/debug_dump_writer.cc b/webrtc/modules/audio_coding/audio_network_adaptor/debug_dump_writer.cc
new file mode 100644
index 0000000..9992e2d
--- /dev/null
+++ b/webrtc/modules/audio_coding/audio_network_adaptor/debug_dump_writer.cc
@@ -0,0 +1,135 @@
+/*
+ *  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 "webrtc/modules/audio_coding/audio_network_adaptor/debug_dump_writer.h"
+
+#include "webrtc/base/checks.h"
+
+#ifdef WEBRTC_AUDIO_NETWORK_ADAPTOR_DEBUG_DUMP
+#ifdef WEBRTC_ANDROID_PLATFORM_BUILD
+#include "external/webrtc/webrtc/modules/audio_coding/audio_network_adaptor/debug_dump.pb.h"
+#else
+#include "webrtc/modules/audio_coding/audio_network_adaptor/debug_dump.pb.h"
+#endif
+#endif
+
+namespace webrtc {
+
+#ifdef WEBRTC_AUDIO_NETWORK_ADAPTOR_DEBUG_DUMP
+namespace {
+
+using audio_network_adaptor::debug_dump::Event;
+using audio_network_adaptor::debug_dump::NetworkMetrics;
+using audio_network_adaptor::debug_dump::EncoderRuntimeConfig;
+
+void DumpEventToFile(const Event& event, FileWrapper* dump_file) {
+  RTC_CHECK(dump_file->is_open());
+  std::string dump_data;
+  event.SerializeToString(&dump_data);
+  int32_t size = event.ByteSize();
+  dump_file->Write(&size, sizeof(size));
+  dump_file->Write(dump_data.data(), dump_data.length());
+}
+
+}  // namespace
+#endif  // WEBRTC_AUDIO_NETWORK_ADAPTOR_DEBUG_DUMP
+
+class DebugDumpWriterImpl final : public DebugDumpWriter {
+ public:
+  explicit DebugDumpWriterImpl(FILE* file_handle);
+  ~DebugDumpWriterImpl() override = default;
+
+  void DumpEncoderRuntimeConfig(
+      const AudioNetworkAdaptor::EncoderRuntimeConfig& config,
+      int64_t timestamp) override;
+
+  void DumpNetworkMetrics(const Controller::NetworkMetrics& metrics,
+                          int64_t timestamp) override;
+
+ private:
+  std::unique_ptr<FileWrapper> dump_file_;
+};
+
+DebugDumpWriterImpl::DebugDumpWriterImpl(FILE* file_handle)
+    : dump_file_(FileWrapper::Create()) {
+#ifndef WEBRTC_AUDIO_NETWORK_ADAPTOR_DEBUG_DUMP
+  RTC_DCHECK(false);
+#endif
+  dump_file_->OpenFromFileHandle(file_handle);
+  RTC_CHECK(dump_file_->is_open());
+}
+
+void DebugDumpWriterImpl::DumpNetworkMetrics(
+    const Controller::NetworkMetrics& metrics,
+    int64_t timestamp) {
+#ifdef WEBRTC_AUDIO_NETWORK_ADAPTOR_DEBUG_DUMP
+  Event event;
+  event.set_timestamp(timestamp);
+  event.set_type(Event::NETWORK_METRICS);
+  auto dump_metrics = event.mutable_network_metrics();
+
+  if (metrics.uplink_bandwidth_bps)
+    dump_metrics->set_uplink_bandwidth_bps(*metrics.uplink_bandwidth_bps);
+
+  if (metrics.uplink_packet_loss_fraction) {
+    dump_metrics->set_uplink_packet_loss_fraction(
+        *metrics.uplink_packet_loss_fraction);
+  }
+
+  if (metrics.target_audio_bitrate_bps) {
+    dump_metrics->set_target_audio_bitrate_bps(
+        *metrics.target_audio_bitrate_bps);
+  }
+
+  if (metrics.rtt_ms)
+    dump_metrics->set_rtt_ms(*metrics.rtt_ms);
+
+  DumpEventToFile(event, dump_file_.get());
+#endif  // WEBRTC_AUDIO_NETWORK_ADAPTOR_DEBUG_DUMP
+}
+
+void DebugDumpWriterImpl::DumpEncoderRuntimeConfig(
+    const AudioNetworkAdaptor::EncoderRuntimeConfig& config,
+    int64_t timestamp) {
+#ifdef WEBRTC_AUDIO_NETWORK_ADAPTOR_DEBUG_DUMP
+  Event event;
+  event.set_timestamp(timestamp);
+  event.set_type(Event::ENCODER_RUNTIME_CONFIG);
+  auto dump_config = event.mutable_encoder_runtime_config();
+
+  if (config.bitrate_bps)
+    dump_config->set_bitrate_bps(*config.bitrate_bps);
+
+  if (config.frame_length_ms)
+    dump_config->set_frame_length_ms(*config.frame_length_ms);
+
+  if (config.uplink_packet_loss_fraction) {
+    dump_config->set_uplink_packet_loss_fraction(
+        *config.uplink_packet_loss_fraction);
+  }
+
+  if (config.enable_fec)
+    dump_config->set_enable_fec(*config.enable_fec);
+
+  if (config.enable_dtx)
+    dump_config->set_enable_dtx(*config.enable_dtx);
+
+  if (config.num_channels)
+    dump_config->set_num_channels(*config.num_channels);
+
+  DumpEventToFile(event, dump_file_.get());
+#endif  // WEBRTC_AUDIO_NETWORK_ADAPTOR_DEBUG_DUMP
+}
+
+std::unique_ptr<DebugDumpWriter> DebugDumpWriter::Create(FILE* file_handle) {
+  return std::unique_ptr<DebugDumpWriter>(new DebugDumpWriterImpl(file_handle));
+}
+
+}  // namespace webrtc
diff --git a/webrtc/modules/audio_coding/audio_network_adaptor/debug_dump_writer.h b/webrtc/modules/audio_coding/audio_network_adaptor/debug_dump_writer.h
new file mode 100644
index 0000000..da4b031
--- /dev/null
+++ b/webrtc/modules/audio_coding/audio_network_adaptor/debug_dump_writer.h
@@ -0,0 +1,40 @@
+/*
+ *  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.
+ */
+
+#ifndef WEBRTC_MODULES_AUDIO_CODING_AUDIO_NETWORK_ADAPTOR_DEBUG_DUMP_WRITER_H_
+#define WEBRTC_MODULES_AUDIO_CODING_AUDIO_NETWORK_ADAPTOR_DEBUG_DUMP_WRITER_H_
+
+#include <memory>
+#include <string>
+
+#include "webrtc/base/constructormagic.h"
+#include "webrtc/modules/audio_coding/audio_network_adaptor/controller.h"
+#include "webrtc/modules/audio_coding/audio_network_adaptor/include/audio_network_adaptor.h"
+#include "webrtc/system_wrappers/include/file_wrapper.h"
+
+namespace webrtc {
+
+class DebugDumpWriter {
+ public:
+  static std::unique_ptr<DebugDumpWriter> Create(FILE* file_handle);
+
+  virtual ~DebugDumpWriter() = default;
+
+  virtual void DumpEncoderRuntimeConfig(
+      const AudioNetworkAdaptor::EncoderRuntimeConfig& config,
+      int64_t timestamp) = 0;
+
+  virtual void DumpNetworkMetrics(const Controller::NetworkMetrics& metrics,
+                                  int64_t timestamp) = 0;
+};
+
+}  // namespace webrtc
+
+#endif  // WEBRTC_MODULES_AUDIO_CODING_AUDIO_NETWORK_ADAPTOR_DEBUG_DUMP_WRITER_H_
diff --git a/webrtc/modules/audio_coding/audio_network_adaptor/include/audio_network_adaptor.h b/webrtc/modules/audio_coding/audio_network_adaptor/include/audio_network_adaptor.h
index 4b43276..e3c4db0 100644
--- a/webrtc/modules/audio_coding/audio_network_adaptor/include/audio_network_adaptor.h
+++ b/webrtc/modules/audio_coding/audio_network_adaptor/include/audio_network_adaptor.h
@@ -43,12 +43,16 @@
   virtual void SetUplinkPacketLossFraction(
       float uplink_packet_loss_fraction) = 0;
 
+  virtual void SetRtt(int rtt_ms) = 0;
+
   virtual void SetReceiverFrameLengthRange(int min_frame_length_ms,
                                            int max_frame_length_ms) = 0;
 
   virtual EncoderRuntimeConfig GetEncoderRuntimeConfig() = 0;
 
   virtual void StartDebugDump(FILE* file_handle) = 0;
+
+  virtual void StopDebugDump() = 0;
 };
 
 }  // namespace webrtc
diff --git a/webrtc/modules/audio_coding/audio_network_adaptor/mock/mock_debug_dump_writer.h b/webrtc/modules/audio_coding/audio_network_adaptor/mock/mock_debug_dump_writer.h
new file mode 100644
index 0000000..f7e226e
--- /dev/null
+++ b/webrtc/modules/audio_coding/audio_network_adaptor/mock/mock_debug_dump_writer.h
@@ -0,0 +1,34 @@
+/*
+ *  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.
+ */
+
+#ifndef WEBRTC_MODULES_AUDIO_CODING_AUDIO_NETWORK_ADAPTOR_MOCK_MOCK_DEBUG_DUMP_WRITER_H_
+#define WEBRTC_MODULES_AUDIO_CODING_AUDIO_NETWORK_ADAPTOR_MOCK_MOCK_DEBUG_DUMP_WRITER_H_
+
+#include "testing/gmock/include/gmock/gmock.h"
+#include "webrtc/modules/audio_coding/audio_network_adaptor/debug_dump_writer.h"
+
+namespace webrtc {
+
+class MockDebugDumpWriter : public DebugDumpWriter {
+ public:
+  virtual ~MockDebugDumpWriter() { Die(); }
+  MOCK_METHOD0(Die, void());
+
+  MOCK_METHOD2(DumpEncoderRuntimeConfig,
+               void(const AudioNetworkAdaptor::EncoderRuntimeConfig& config,
+                    int64_t timestamp));
+  MOCK_METHOD2(DumpNetworkMetrics,
+               void(const Controller::NetworkMetrics& metrics,
+                    int64_t timestamp));
+};
+
+}  // namespace webrtc
+
+#endif  // WEBRTC_MODULES_AUDIO_CODING_AUDIO_NETWORK_ADAPTOR_MOCK_MOCK_DEBUG_DUMP_WRITER_H_